<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Tarifs de location du linge — SCI Dubuval — 2022-2023</title>
  <meta charset="UTF-8"/>
  <style type="text/css">
   
/* <![CDATA[ */
body,div,table,thead,tbody,tfoot,tr,th,td,p {color: darkslategrey; font-family:Arial; font-size:medium;}
table.montablo {border:0; border-collapse: collapse}
table.montablo tr td {border: 1px solid; text-align: center; padding: 5px}
table.montablo tr.gras td {font-weight: bold; background-color: darkslategrey; color: mediumturquoise}
td.gras {font-weight: bold; background-color: darkslategrey; color: mediumturquoise}

/* ]]> */

  </style>
 </head>
 <body onpageshow="compute()">
  <script>
   
//<![CDATA[
//# 1 "mechanic.bc.runtime.js"
// Generated by js_of_ocaml 4.0.0
(function(Object)
   {typeof globalThis
    !==
    "object"
    &&
    (this
      ?get()
      :(Object.defineProperty
         (Object.prototype,"_T_",{configurable:true,get:get}),
        _T_));
    function get()
     {var global=this || self;
      global.globalThis = global;
      delete Object.prototype._T_}}
  (Object));
(function(globalThis)
   {"use strict";
    function caml_int64_is_zero(x){return + x.isZero()}
    function caml_str_repeat(n,s)
     {if(n == 0)return "";
      if(s.repeat)return s.repeat(n);
      var r="",l=0;
      for(;;)
       {if(n & 1)r += s;
        n >>= 1;
        if(n == 0)return r;
        s += s;
        l++;
        if(l == 9)s.slice(0,1)}}
    var caml_int64_offset=Math.pow(2,- 24);
    function caml_raise_constant(tag){throw tag}
    var caml_global_data=[0];
    function caml_raise_zero_divide()
     {caml_raise_constant(caml_global_data.Division_by_zero)}
    function MlInt64(lo,mi,hi)
     {this.lo = lo & 0xffffff;this.mi = mi & 0xffffff;this.hi = hi & 0xffff}
    MlInt64.prototype.caml_custom = "_j";
    MlInt64.prototype.copy
    =
    function(){return new MlInt64(this.lo,this.mi,this.hi)};
    MlInt64.prototype.ucompare
    =
    function(x)
     {if(this.hi > x.hi)return 1;
      if(this.hi < x.hi)return - 1;
      if(this.mi > x.mi)return 1;
      if(this.mi < x.mi)return - 1;
      if(this.lo > x.lo)return 1;
      if(this.lo < x.lo)return - 1;
      return 0};
    MlInt64.prototype.compare
    =
    function(x)
     {var hi=this.hi << 16,xhi=x.hi << 16;
      if(hi > xhi)return 1;
      if(hi < xhi)return - 1;
      if(this.mi > x.mi)return 1;
      if(this.mi < x.mi)return - 1;
      if(this.lo > x.lo)return 1;
      if(this.lo < x.lo)return - 1;
      return 0};
    MlInt64.prototype.neg
    =
    function()
     {var lo=- this.lo,mi=- this.mi + (lo >> 24),hi=- this.hi + (mi >> 24);
      return new MlInt64(lo,mi,hi)};
    MlInt64.prototype.add
    =
    function(x)
     {var
       lo=this.lo + x.lo,
       mi=this.mi + x.mi + (lo >> 24),
       hi=this.hi + x.hi + (mi >> 24);
      return new MlInt64(lo,mi,hi)};
    MlInt64.prototype.sub
    =
    function(x)
     {var
       lo=this.lo - x.lo,
       mi=this.mi - x.mi + (lo >> 24),
       hi=this.hi - x.hi + (mi >> 24);
      return new MlInt64(lo,mi,hi)};
    MlInt64.prototype.mul
    =
    function(x)
     {var
       lo=this.lo * x.lo,
       mi=(lo * caml_int64_offset | 0) + this.mi * x.lo + this.lo * x.mi,
       hi=
        (mi * caml_int64_offset | 0)
        +
        this.hi
        *
        x.lo
        +
        this.mi
        *
        x.mi
        +
        this.lo
        *
        x.hi;
      return new MlInt64(lo,mi,hi)};
    MlInt64.prototype.isZero
    =
    function(){return (this.lo | this.mi | this.hi) == 0};
    MlInt64.prototype.isNeg = function(){return this.hi << 16 < 0};
    MlInt64.prototype.and
    =
    function(x)
     {return new MlInt64(this.lo & x.lo,this.mi & x.mi,this.hi & x.hi)};
    MlInt64.prototype.or
    =
    function(x)
     {return new MlInt64(this.lo | x.lo,this.mi | x.mi,this.hi | x.hi)};
    MlInt64.prototype.xor
    =
    function(x)
     {return new MlInt64(this.lo ^ x.lo,this.mi ^ x.mi,this.hi ^ x.hi)};
    MlInt64.prototype.shift_left
    =
    function(s)
     {s = s & 63;
      if(s == 0)return this;
      if(s < 24)
       return new
               MlInt64
               (this.lo << s,
                this.mi << s | this.lo >> 24 - s,
                this.hi << s | this.mi >> 24 - s);
      if(s < 48)
       return new
               MlInt64
               (0,this.lo << s - 24,this.mi << s - 24 | this.lo >> 48 - s);
      return new MlInt64(0,0,this.lo << s - 48)};
    MlInt64.prototype.shift_right_unsigned
    =
    function(s)
     {s = s & 63;
      if(s == 0)return this;
      if(s < 24)
       return new
               MlInt64
               (this.lo >> s | this.mi << 24 - s,
                this.mi >> s | this.hi << 24 - s,
                this.hi >> s);
      if(s < 48)
       return new
               MlInt64
               (this.mi >> s - 24 | this.hi << 48 - s,this.hi >> s - 24,0);
      return new MlInt64(this.hi >> s - 48,0,0)};
    MlInt64.prototype.shift_right
    =
    function(s)
     {s = s & 63;
      if(s == 0)return this;
      var h=this.hi << 16 >> 16;
      if(s < 24)
       return new
               MlInt64
               (this.lo >> s | this.mi << 24 - s,
                this.mi >> s | h << 24 - s,
                this.hi << 16 >> s >>> 16);
      var sign=this.hi << 16 >> 31;
      if(s < 48)
       return new
               MlInt64
               (this.mi >> s - 24 | this.hi << 48 - s,
                this.hi << 16 >> s - 24 >> 16,
                sign & 0xffff);
      return new MlInt64(this.hi << 16 >> s - 32,sign,sign)};
    MlInt64.prototype.lsl1
    =
    function()
     {this.hi = this.hi << 1 | this.mi >> 23;
      this.mi = (this.mi << 1 | this.lo >> 23) & 0xffffff;
      this.lo = this.lo << 1 & 0xffffff};
    MlInt64.prototype.lsr1
    =
    function()
     {this.lo = (this.lo >>> 1 | this.mi << 23) & 0xffffff;
      this.mi = (this.mi >>> 1 | this.hi << 23) & 0xffffff;
      this.hi = this.hi >>> 1};
    MlInt64.prototype.udivmod
    =
    function(x)
     {var
       offset=0,
       modulus=this.copy(),
       divisor=x.copy(),
       quotient=new MlInt64(0,0,0);
      while(modulus.ucompare(divisor) > 0){offset++;divisor.lsl1()}
      while(offset >= 0)
       {offset--;
        quotient.lsl1();
        if(modulus.ucompare(divisor) >= 0)
         {quotient.lo++;modulus = modulus.sub(divisor)}
        divisor.lsr1()}
      return {quotient:quotient,modulus:modulus}};
    MlInt64.prototype.div
    =
    function(y)
     {var x=this;
      if(y.isZero())caml_raise_zero_divide();
      var sign=x.hi ^ y.hi;
      if(x.hi & 0x8000)x = x.neg();
      if(y.hi & 0x8000)y = y.neg();
      var q=x.udivmod(y).quotient;
      if(sign & 0x8000)q = q.neg();
      return q};
    MlInt64.prototype.mod
    =
    function(y)
     {var x=this;
      if(y.isZero())caml_raise_zero_divide();
      var sign=x.hi;
      if(x.hi & 0x8000)x = x.neg();
      if(y.hi & 0x8000)y = y.neg();
      var r=x.udivmod(y).modulus;
      if(sign & 0x8000)r = r.neg();
      return r};
    MlInt64.prototype.toInt = function(){return this.lo | this.mi << 24};
    MlInt64.prototype.toFloat
    =
    function()
     {return (this.hi << 16)
             *
             Math.pow(2,32)
             +
             this.mi
             *
             Math.pow(2,24)
             +
             this.lo};
    MlInt64.prototype.toArray
    =
    function()
     {return [this.hi >> 8,
              this.hi & 0xff,
              this.mi >> 16,
              this.mi >> 8 & 0xff,
              this.mi & 0xff,
              this.lo >> 16,
              this.lo >> 8 & 0xff,
              this.lo & 0xff]};
    MlInt64.prototype.lo32
    =
    function(){return this.lo | (this.mi & 0xff) << 24};
    MlInt64.prototype.hi32
    =
    function(){return this.mi >>> 8 & 0xffff | this.hi << 16};
    function caml_int64_of_int32(x)
     {return new MlInt64(x & 0xffffff,x >> 24 & 0xffffff,x >> 31 & 0xffff)}
    function caml_int64_to_int32(x){return x.toInt()}
    function caml_int64_is_negative(x){return + x.isNeg()}
    function caml_int64_neg(x){return x.neg()}
    function caml_subarray_to_jsbytes(a,i,len)
     {var f=String.fromCharCode;
      if(i == 0 && len <= 4096 && len == a.length)return f.apply(null,a);
      var s="";
      for(;0 < len;i += 1024,len -= 1024)
       s += f.apply(null,a.slice(i,i + Math.min(len,1024)));
      return s}
    function caml_convert_string_to_bytes(s)
     {if(s.t == 2)
       s.c += caml_str_repeat(s.l - s.c.length,"\0");
      else
       s.c = caml_subarray_to_jsbytes(s.c,0,s.c.length);
      s.t = 0}
    function caml_jsbytes_of_string(s)
     {s.t & 6 && caml_convert_string_to_bytes(s);return s.c}
    function caml_raise_with_arg(tag,arg){throw [0,tag,arg]}
    function jsoo_is_ascii(s)
     {if(s.length < 24)
       {for(var i=0;i < s.length;i++)if(s.charCodeAt(i) > 127)return false;
        return true}
      else
       return ! /[^\x00-\x7f]/.test(s)}
    function caml_utf16_of_utf8(s)
     {for(var b="",t="",c,c1,c2,v,i=0,l=s.length;i < l;i++)
       {c1 = s.charCodeAt(i);
        if(c1 < 0x80)
         {for(var j=i + 1;j < l && (c1 = s.charCodeAt(j)) < 0x80;j++);
          if(j - i > 512)
           {t.substr(0,1);b += t;t = "";b += s.slice(i,j)}
          else
           t += s.slice(i,j);
          if(j == l)break;
          i = j}
        v = 1;
        if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128)
         {c = c2 + (c1 << 6);
          if(c1 < 0xe0)
           {v = c - 0x3080;if(v < 0x80)v = 1}
          else
           {v = 2;
            if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128)
             {c = c2 + (c << 6);
              if(c1 < 0xf0)
               {v = c - 0xe2080;
                if(v < 0x800 || v >= 0xd7ff && v < 0xe000)v = 2}
              else
               {v = 3;
                if
                 (++i
                  <
                  l
                  &&
                  ((c2 = s.charCodeAt(i)) & - 64)
                  ==
                  128
                  &&
                  c1
                  <
                  0xf5)
                 {v = c2 - 0x3c82080 + (c << 6);
                  if(v < 0x10000 || v > 0x10ffff)v = 3}}}}}
        if(v < 4)
         {i -= v;t += "\ufffd"}
        else
         if(v > 0xffff)
          t += String.fromCharCode(0xd7c0 + (v >> 10),0xdc00 + (v & 0x3FF));
         else
          t += String.fromCharCode(v);
        if(t.length > 1024){t.substr(0,1);b += t;t = ""}}
      return b + t}
    function MlBytes(tag,contents,length)
     {this.t = tag;this.c = contents;this.l = length}
    MlBytes.prototype.toString
    =
    function()
     {switch(this.t)
       {case 9:return this.c;
        default:caml_convert_string_to_bytes(this);case 0:
         if(jsoo_is_ascii(this.c)){this.t = 9;return this.c}this.t = 8;
        case 8:return this.c
        }};
    MlBytes.prototype.toUtf16
    =
    function()
     {var r=this.toString();
      if(this.t == 9)return r;
      return caml_utf16_of_utf8(r)};
    MlBytes.prototype.slice
    =
    function()
     {var content=this.t == 4?this.c.slice():this.c;
      return new MlBytes(this.t,content,this.l)};
    function caml_bytes_of_jsbytes(s){return new MlBytes(0,s,s.length)}
    function caml_string_of_jsbytes(s){return caml_bytes_of_jsbytes(s)}
    function caml_raise_with_string(tag,msg)
     {caml_raise_with_arg(tag,caml_string_of_jsbytes(msg))}
    function caml_invalid_argument(msg)
     {caml_raise_with_string(caml_global_data.Invalid_argument,msg)}
    function caml_parse_format(fmt)
     {fmt = caml_jsbytes_of_string(fmt);
      var len=fmt.length;
      if(len > 31)caml_invalid_argument("format_int: format too long");
      var
       f=
        {justify:"+",
         signstyle:"-",
         filler:" ",
         alternate:false,
         base:0,
         signedconv:false,
         width:0,
         uppercase:false,
         sign:1,
         prec:- 1,
         conv:"f"};
      for(var i=0;i < len;i++)
       {var c=fmt.charAt(i);
        switch(c)
         {case "-":f.justify = "-";break;
          case "+":
          case " ":f.signstyle = c;break;
          case "0":f.filler = "0";break;
          case "#":f.alternate = true;break;
          case "1":
          case "2":
          case "3":
          case "4":
          case "5":
          case "6":
          case "7":
          case "8":
          case "9":
           f.width = 0;
           while(c = fmt.charCodeAt(i) - 48,c >= 0 && c <= 9)
            {f.width = f.width * 10 + c;i++}
           i--;
           break;
          case ".":
           f.prec = 0;
           i++;
           while(c = fmt.charCodeAt(i) - 48,c >= 0 && c <= 9)
            {f.prec = f.prec * 10 + c;i++}
           i--;
          case "d":
          case "i":f.signedconv = true;
          case "u":f.base = 10;break;
          case "x":f.base = 16;break;
          case "X":f.base = 16;f.uppercase = true;break;
          case "o":f.base = 8;break;
          case "e":
          case "f":
          case "g":f.signedconv = true;f.conv = c;break;
          case "E":
          case "F":
          case "G":
           f.signedconv = true;
           f.uppercase = true;
           f.conv = c.toLowerCase();
           break
          }}
      return f}
    function caml_finish_formatting(f,rawbuffer)
     {if(f.uppercase)rawbuffer = rawbuffer.toUpperCase();
      var len=rawbuffer.length;
      if(f.signedconv && (f.sign < 0 || f.signstyle != "-"))len++;
      if(f.alternate){if(f.base == 8)len += 1;if(f.base == 16)len += 2}
      var buffer="";
      if(f.justify == "+" && f.filler == " ")
       for(var i=len;i < f.width;i++)buffer += " ";
      if(f.signedconv)
       if(f.sign < 0)
        buffer += "-";
       else
        if(f.signstyle != "-")buffer += f.signstyle;
      if(f.alternate && f.base == 8)buffer += "0";
      if(f.alternate && f.base == 16)buffer += "0x";
      if(f.justify == "+" && f.filler == "0")
       for(var i=len;i < f.width;i++)buffer += "0";
      buffer += rawbuffer;
      if(f.justify == "-")for(var i=len;i < f.width;i++)buffer += " ";
      return caml_string_of_jsbytes(buffer)}
    function caml_int64_format(fmt,x)
     {var f=caml_parse_format(fmt);
      if(f.signedconv && caml_int64_is_negative(x))
       {f.sign = - 1;x = caml_int64_neg(x)}
      var
       buffer="",
       wbase=caml_int64_of_int32(f.base),
       cvtbl="0123456789abcdef";
      do
       {var p=x.udivmod(wbase);
        x = p.quotient;
        buffer = cvtbl.charAt(caml_int64_to_int32(p.modulus)) + buffer}
      while
       (! caml_int64_is_zero(x));
      if(f.prec >= 0)
       {f.filler = " ";
        var n=f.prec - buffer.length;
        if(n > 0)buffer = caml_str_repeat(n,"0") + buffer}
      return caml_finish_formatting(f,buffer)}
    function caml_expm1_float(x){return Math.expm1(x)}
    function caml_jsstring_of_string(s){return s.toUtf16()}
    function fs_node_supported()
     {return typeof globalThis.process
             !==
             "undefined"
             &&
             typeof globalThis.process.versions
             !==
             "undefined"
             &&
             typeof globalThis.process.versions.node
             !==
             "undefined"}
    function make_path_is_absolute()
     {function posix(path)
       {if(path.charAt(0) === "/")return ["",path.substring(1)];return}
      function win32(path)
       {var
         splitDeviceRe=
          /^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/,
         result=splitDeviceRe.exec(path),
         device=result[1] || "",
         isUnc=Boolean(device && device.charAt(1) !== ":");
        if(Boolean(result[2] || isUnc))
         {var root=result[1] || "",sep=result[2] || "";
          return [root,path.substring(root.length + sep.length)]}
        return}
      return fs_node_supported()
              &&
              globalThis.process
              &&
              globalThis.process.platform
              ?globalThis.process.platform === "win32"?win32:posix
              :posix}
    var path_is_absolute=make_path_is_absolute();
    function caml_trailing_slash(name)
     {return name.slice(- 1) !== "/"?name + "/":name}
    if(fs_node_supported() && globalThis.process && globalThis.process.cwd)
     var caml_current_dir=globalThis.process.cwd().replace(/\\/g,"/");
    else
     var caml_current_dir="/static";
    caml_current_dir = caml_trailing_slash(caml_current_dir);
    function caml_make_path(name)
     {name = caml_jsstring_of_string(name);
      if(! path_is_absolute(name))name = caml_current_dir + name;
      var comp0=path_is_absolute(name),comp=comp0[1].split("/"),ncomp=[];
      for(var i=0;i < comp.length;i++)
       switch(comp[i])
        {case "..":if(ncomp.length > 1)ncomp.pop();break;
         case ".":break;
         default:ncomp.push(comp[i]);break}
      ncomp.unshift(comp0[0]);
      ncomp.orig = name;
      return ncomp}
    function caml_utf8_of_utf16(s)
     {for(var b="",t=b,c,d,i=0,l=s.length;i < l;i++)
       {c = s.charCodeAt(i);
        if(c < 0x80)
         {for(var j=i + 1;j < l && (c = s.charCodeAt(j)) < 0x80;j++);
          if(j - i > 512)
           {t.substr(0,1);b += t;t = "";b += s.slice(i,j)}
          else
           t += s.slice(i,j);
          if(j == l)break;
          i = j}
        if(c < 0x800)
         {t += String.fromCharCode(0xc0 | c >> 6);
          t += String.fromCharCode(0x80 | c & 0x3f)}
        else
         if(c < 0xd800 || c >= 0xdfff)
          t
          +=
          String.fromCharCode
           (0xe0 | c >> 12,0x80 | c >> 6 & 0x3f,0x80 | c & 0x3f);
         else
          if
           (c
            >=
            0xdbff
            ||
            i
            +
            1
            ==
            l
            ||
            (d = s.charCodeAt(i + 1))
            <
            0xdc00
            ||
            d
            >
            0xdfff)
           t += "\xef\xbf\xbd";
          else
           {i++;
            c = (c << 10) + d - 0x35fdc00;
            t
            +=
            String.fromCharCode
             (0xf0 | c >> 18,
              0x80 | c >> 12 & 0x3f,
              0x80 | c >> 6 & 0x3f,
              0x80 | c & 0x3f)}
        if(t.length > 1024){t.substr(0,1);b += t;t = ""}}
      return b + t}
    function caml_bytes_of_utf16_jsstring(s)
     {var tag=9;
      if(! jsoo_is_ascii(s))tag = 8,s = caml_utf8_of_utf16(s);
      return new MlBytes(tag,s,s.length)}
    function caml_string_of_jsstring(s)
     {return caml_bytes_of_utf16_jsstring(s)}
    var
     unix_error=
      ["E2BIG",
       "EACCES",
       "EAGAIN",
       "EBADF",
       "EBUSY",
       "ECHILD",
       "EDEADLK",
       "EDOM",
       "EEXIST",
       "EFAULT",
       "EFBIG",
       "EINTR",
       "EINVAL",
       "EIO",
       "EISDIR",
       "EMFILE",
       "EMLINK",
       "ENAMETOOLONG",
       "ENFILE",
       "ENODEV",
       "ENOENT",
       "ENOEXEC",
       "ENOLCK",
       "ENOMEM",
       "ENOSPC",
       "ENOSYS",
       "ENOTDIR",
       "ENOTEMPTY",
       "ENOTTY",
       "ENXIO",
       "EPERM",
       "EPIPE",
       "ERANGE",
       "EROFS",
       "ESPIPE",
       "ESRCH",
       "EXDEV",
       "EWOULDBLOCK",
       "EINPROGRESS",
       "EALREADY",
       "ENOTSOCK",
       "EDESTADDRREQ",
       "EMSGSIZE",
       "EPROTOTYPE",
       "ENOPROTOOPT",
       "EPROTONOSUPPORT",
       "ESOCKTNOSUPPORT",
       "EOPNOTSUPP",
       "EPFNOSUPPORT",
       "EAFNOSUPPORT",
       "EADDRINUSE",
       "EADDRNOTAVAIL",
       "ENETDOWN",
       "ENETUNREACH",
       "ENETRESET",
       "ECONNABORTED",
       "ECONNRESET",
       "ENOBUFS",
       "EISCONN",
       "ENOTCONN",
       "ESHUTDOWN",
       "ETOOMANYREFS",
       "ETIMEDOUT",
       "ECONNREFUSED",
       "EHOSTDOWN",
       "EHOSTUNREACH",
       "ELOOP",
       "EOVERFLOW"];
    function make_unix_err_args(code,syscall,path,errno)
     {var variant=unix_error.indexOf(code);
      if(variant < 0){if(errno == null)errno = - 9999;variant = [0,errno]}
      var
       args=
        [variant,
         caml_string_of_jsstring(syscall || ""),
         caml_string_of_jsstring(path || "")];
      return args}
    var caml_named_values={};
    function caml_named_value(nm){return caml_named_values[nm]}
    function caml_raise_with_args(tag,args){throw [0,tag].concat(args)}
    function caml_is_ml_bytes(s){return s instanceof MlBytes}
    function caml_is_ml_string(s){return caml_is_ml_bytes(s)}
    function caml_bytes_of_array(a){return new MlBytes(4,a,a.length)}
    function caml_bytes_of_string(s){return s}
    function caml_raise_sys_error(msg)
     {caml_raise_with_string(caml_global_data.Sys_error,msg)}
    function caml_raise_no_such_file(name)
     {caml_raise_sys_error(name + ": No such file or directory")}
    function caml_bytes_bound_error()
     {caml_invalid_argument("index out of bounds")}
    function caml_bytes_unsafe_get(s,i)
     {switch(s.t & 6)
       {default:if(i >= s.c.length)return 0;case 0:return s.c.charCodeAt(i);
        case 4:return s.c[i]
        }}
    function caml_bytes_get(s,i)
     {if(i >>> 0 >= s.l)caml_bytes_bound_error();
      return caml_bytes_unsafe_get(s,i)}
    function caml_create_bytes(len)
     {if(len < 0)caml_invalid_argument("Bytes.create");
      return new MlBytes(len?2:9,"",len)}
    function caml_ml_bytes_length(s){return s.l}
    function caml_convert_bytes_to_array(s)
     {if(globalThis.Uint8Array)
       var a=new (globalThis.Uint8Array)(s.l);
      else
       var a=new Array(s.l);
      var b=s.c,l=b.length,i=0;
      for(;i < l;i++)a[i] = b.charCodeAt(i);
      for(l = s.l;i < l;i++)a[i] = 0;
      s.c = a;
      s.t = 4;
      return a}
    function caml_blit_bytes(s1,i1,s2,i2,len)
     {if(len == 0)return 0;
      if(i2 == 0 && (len >= s2.l || s2.t == 2 && len >= s2.c.length))
       {s2.c
        =
        s1.t == 4
         ?caml_subarray_to_jsbytes(s1.c,i1,len)
         :i1 == 0 && s1.c.length == len?s1.c:s1.c.substr(i1,len);
        s2.t = s2.c.length == s2.l?0:2}
      else
       if(s2.t == 2 && i2 == s2.c.length)
        {s2.c
         +=
         s1.t == 4
          ?caml_subarray_to_jsbytes(s1.c,i1,len)
          :i1 == 0 && s1.c.length == len?s1.c:s1.c.substr(i1,len);
         s2.t = s2.c.length == s2.l?0:2}
       else
        {if(s2.t != 4)caml_convert_bytes_to_array(s2);
         var c1=s1.c,c2=s2.c;
         if(s1.t == 4)
          if(i2 <= i1)
           for(var i=0;i < len;i++)c2[i2 + i] = c1[i1 + i];
          else
           for(var i=len - 1;i >= 0;i--)c2[i2 + i] = c1[i1 + i];
         else
          {var l=Math.min(len,c1.length - i1);
           for(var i=0;i < l;i++)c2[i2 + i] = c1.charCodeAt(i1 + i);
           for(;i < len;i++)c2[i2 + i] = 0}}
      return 0}
    function caml_blit_string(a,b,c,d,e)
     {caml_blit_bytes(caml_bytes_of_string(a),b,c,d,e);return 0}
    function MlFile(){}
    function MlFakeFile(content){this.data = content}
    MlFakeFile.prototype = new MlFile();
    MlFakeFile.prototype.truncate
    =
    function(len)
     {var old=this.data;
      this.data = caml_create_bytes(len | 0);
      caml_blit_bytes(old,0,this.data,0,len)};
    MlFakeFile.prototype.length
    =
    function(){return caml_ml_bytes_length(this.data)};
    MlFakeFile.prototype.write
    =
    function(offset,buf,pos,len)
     {var clen=this.length();
      if(offset + len >= clen)
       {var new_str=caml_create_bytes(offset + len),old_data=this.data;
        this.data = new_str;
        caml_blit_bytes(old_data,0,this.data,0,clen)}
      caml_blit_string(buf,pos,this.data,offset,len);
      return 0};
    MlFakeFile.prototype.read
    =
    function(offset,buf,pos,len)
     {var clen=this.length();
      caml_blit_bytes(this.data,offset,buf,pos,len);
      return 0};
    MlFakeFile.prototype.read_one
    =
    function(offset){return caml_bytes_get(this.data,offset)};
    MlFakeFile.prototype.close = function(){};
    MlFakeFile.prototype.constructor = MlFakeFile;
    function MlFakeDevice(root,f)
     {this.content = {};this.root = root;this.lookupFun = f}
    MlFakeDevice.prototype.nm = function(name){return this.root + name};
    MlFakeDevice.prototype.create_dir_if_needed
    =
    function(name)
     {var comp=name.split("/"),res="";
      for(var i=0;i < comp.length - 1;i++)
       {res += comp[i] + "/";
        if(this.content[res])continue;
        this.content[res] = Symbol("directory")}};
    MlFakeDevice.prototype.slash
    =
    function(name){return /\/$/.test(name)?name:name + "/"};
    MlFakeDevice.prototype.lookup
    =
    function(name)
     {if(! this.content[name] && this.lookupFun)
       {var
         res=
          this.lookupFun
           (caml_string_of_jsbytes(this.root),caml_string_of_jsbytes(name));
        if(res !== 0)
         {this.create_dir_if_needed(name);
          this.content[name] = new MlFakeFile(caml_bytes_of_string(res[1]))}}};
    MlFakeDevice.prototype.exists
    =
    function(name)
     {if(name == "")return 1;
      var name_slash=this.slash(name);
      if(this.content[name_slash])return 1;
      this.lookup(name);
      return this.content[name]?1:0};
    MlFakeDevice.prototype.mkdir
    =
    function(name,mode,raise_unix)
     {var unix_error=raise_unix && caml_named_value("Unix.Unix_error");
      if(this.exists(name))
       if(unix_error)
        caml_raise_with_args
         (unix_error,make_unix_err_args("EEXIST","mkdir",this.nm(name)));
       else
        caml_raise_sys_error(name + ": File exists");
      var parent=/^(.*)\/[^/]+/.exec(name);
      parent = parent && parent[1] || "";
      if(! this.exists(parent))
       if(unix_error)
        caml_raise_with_args
         (unix_error,make_unix_err_args("ENOENT","mkdir",this.nm(parent)));
       else
        caml_raise_sys_error(parent + ": No such file or directory");
      if(! this.is_dir(parent))
       if(unix_error)
        caml_raise_with_args
         (unix_error,make_unix_err_args("ENOTDIR","mkdir",this.nm(parent)));
       else
        caml_raise_sys_error(parent + ": Not a directory");
      this.create_dir_if_needed(this.slash(name))};
    MlFakeDevice.prototype.rmdir
    =
    function(name,raise_unix)
     {var
       unix_error=raise_unix && caml_named_value("Unix.Unix_error"),
       name_slash=name == ""?"":this.slash(name),
       r=new RegExp("^" + name_slash + "([^/]+)");
      if(! this.exists(name))
       if(unix_error)
        caml_raise_with_args
         (unix_error,make_unix_err_args("ENOENT","rmdir",this.nm(name)));
       else
        caml_raise_sys_error(name + ": No such file or directory");
      if(! this.is_dir(name))
       if(unix_error)
        caml_raise_with_args
         (unix_error,make_unix_err_args("ENOTDIR","rmdir",this.nm(name)));
       else
        caml_raise_sys_error(name + ": Not a directory");
      for(var n in this.content)
       if(n.match(r))
        if(unix_error)
         caml_raise_with_args
          (unix_error,make_unix_err_args("ENOTEMPTY","rmdir",this.nm(name)));
        else
         caml_raise_sys_error(this.nm(name) + ": Directory not empty");
      delete this.content[name_slash]};
    MlFakeDevice.prototype.readdir
    =
    function(name)
     {var name_slash=name == ""?"":this.slash(name);
      if(! this.exists(name))
       caml_raise_sys_error(name + ": No such file or directory");
      if(! this.is_dir(name))caml_raise_sys_error(name + ": Not a directory");
      var r=new RegExp("^" + name_slash + "([^/]+)"),seen={},a=[];
      for(var n in this.content)
       {var m=n.match(r);
        if(m && ! seen[m[1]]){seen[m[1]] = true;a.push(m[1])}}
      return a};
    MlFakeDevice.prototype.is_dir
    =
    function(name)
     {if(name == "")return true;
      var name_slash=this.slash(name);
      return this.content[name_slash]?1:0};
    MlFakeDevice.prototype.unlink
    =
    function(name)
     {var ok=this.content[name]?true:false;
      delete this.content[name];
      return ok};
    MlFakeDevice.prototype.open
    =
    function(name,f)
     {if(f.rdonly && f.wronly)
       caml_raise_sys_error
        (this.nm(name)
         +
         " : flags Open_rdonly and Open_wronly are not compatible");
      if(f.text && f.binary)
       caml_raise_sys_error
        (this.nm(name)
         +
         " : flags Open_text and Open_binary are not compatible");
      this.lookup(name);
      if(this.content[name])
       {if(this.is_dir(name))
         caml_raise_sys_error(this.nm(name) + " : is a directory");
        if(f.create && f.excl)
         caml_raise_sys_error(this.nm(name) + " : file already exists");
        var file=this.content[name];
        if(f.truncate)file.truncate();
        return file}
      else
       if(f.create)
        {this.create_dir_if_needed(name);
         this.content[name] = new MlFakeFile(caml_create_bytes(0));
         return this.content[name]}
       else
        caml_raise_no_such_file(this.nm(name))};
    MlFakeDevice.prototype.register
    =
    function(name,content)
     {var file;
      if(this.content[name])
       caml_raise_sys_error(this.nm(name) + " : file already exists");
      if(caml_is_ml_bytes(content))file = new MlFakeFile(content);
      if(caml_is_ml_string(content))
       file = new MlFakeFile(caml_bytes_of_string(content));
      else
       if(content instanceof Array)
        file = new MlFakeFile(caml_bytes_of_array(content));
       else
        if(typeof content === "string")
         file = new MlFakeFile(caml_bytes_of_jsbytes(content));
        else
         if(content.toString)
          {var
            bytes=
             caml_bytes_of_string(caml_string_of_jsstring(content.toString()));
           file = new MlFakeFile(bytes)}
      if(file)
       {this.create_dir_if_needed(name);this.content[name] = file}
      else
       caml_raise_sys_error
        (this.nm(name) + " : registering file with invalid content type")};
    MlFakeDevice.prototype.constructor = MlFakeDevice;
    function caml_ml_string_length(s){return caml_ml_bytes_length(s)}
    function caml_string_unsafe_get(s,i){return caml_bytes_unsafe_get(s,i)}
    function caml_array_of_string(s)
     {var l=caml_ml_string_length(s),a=new Array(l),i=0;
      for(;i < l;i++)a[i] = caml_string_unsafe_get(s,i);
      return a}
    function caml_array_of_bytes(s)
     {if(s.t != 4)caml_convert_bytes_to_array(s);return s.c}
    function caml_bytes_unsafe_set(s,i,c)
     {c &= 0xff;
      if(s.t != 4)
       {if(i == s.c.length)
         {s.c += String.fromCharCode(c);if(i + 1 == s.l)s.t = 0;return 0}
        caml_convert_bytes_to_array(s)}
      s.c[i] = c;
      return 0}
    function caml_bytes_set(s,i,c)
     {if(i >>> 0 >= s.l)caml_bytes_bound_error();
      return caml_bytes_unsafe_set(s,i,c)}
    function MlNodeFile(fd){this.fs = require("fs");this.fd = fd}
    MlNodeFile.prototype = new MlFile();
    MlNodeFile.prototype.truncate
    =
    function(len)
     {try
       {this.fs.ftruncateSync(this.fd,len | 0)}
      catch(err){caml_raise_sys_error(err.toString())}};
    MlNodeFile.prototype.length
    =
    function()
     {try
       {return this.fs.fstatSync(this.fd).size}
      catch(err){caml_raise_sys_error(err.toString())}};
    MlNodeFile.prototype.write
    =
    function(offset,buf,buf_offset,len)
     {var a=caml_array_of_string(buf);
      if(! (a instanceof globalThis.Uint8Array))
       a = new (globalThis.Uint8Array)(a);
      var buffer=globalThis.Buffer.from(a);
      try
       {this.fs.writeSync(this.fd,buffer,buf_offset,len,offset)}
      catch(err){caml_raise_sys_error(err.toString())}
      return 0};
    MlNodeFile.prototype.read
    =
    function(offset,buf,buf_offset,len)
     {var a=caml_array_of_bytes(buf);
      if(! (a instanceof globalThis.Uint8Array))
       a = new (globalThis.Uint8Array)(a);
      var buffer=globalThis.Buffer.from(a);
      try
       {this.fs.readSync(this.fd,buffer,buf_offset,len,offset)}
      catch(err){caml_raise_sys_error(err.toString())}
      for(var i=0;i < len;i++)
       caml_bytes_set(buf,buf_offset + i,buffer[buf_offset + i]);
      return 0};
    MlNodeFile.prototype.read_one
    =
    function(offset)
     {var a=new (globalThis.Uint8Array)(1),buffer=globalThis.Buffer.from(a);
      try
       {this.fs.readSync(this.fd,buffer,0,1,offset)}
      catch(err){caml_raise_sys_error(err.toString())}
      return buffer[0]};
    MlNodeFile.prototype.close
    =
    function()
     {try
       {this.fs.closeSync(this.fd)}
      catch(err){caml_raise_sys_error(err.toString())}};
    MlNodeFile.prototype.constructor = MlNodeFile;
    function MlNodeDevice(root){this.fs = require("fs");this.root = root}
    MlNodeDevice.prototype.nm = function(name){return this.root + name};
    MlNodeDevice.prototype.exists
    =
    function(name)
     {try {return this.fs.existsSync(this.nm(name))?1:0}catch(err){return 0}};
    MlNodeDevice.prototype.mkdir
    =
    function(name,mode,raise_unix)
     {try
       {this.fs.mkdirSync(this.nm(name),{mode:mode});return 0}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.rmdir
    =
    function(name,raise_unix)
     {try
       {this.fs.rmdirSync(this.nm(name));return 0}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.readdir
    =
    function(name,raise_unix)
     {try
       {return this.fs.readdirSync(this.nm(name))}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.is_dir
    =
    function(name)
     {try
       {return this.fs.statSync(this.nm(name)).isDirectory()?1:0}
      catch(err){caml_raise_sys_error(err.toString())}};
    MlNodeDevice.prototype.unlink
    =
    function(name,raise_unix)
     {try
       {var b=this.fs.existsSync(this.nm(name))?1:0;
        this.fs.unlinkSync(this.nm(name));
        return b}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.open
    =
    function(name,f,raise_unix)
     {var consts=require("constants"),res=0;
      for(var key in f)
       switch(key)
        {case "rdonly":res |= consts.O_RDONLY;break;
         case "wronly":res |= consts.O_WRONLY;break;
         case "append":res |= consts.O_WRONLY | consts.O_APPEND;break;
         case "create":res |= consts.O_CREAT;break;
         case "truncate":res |= consts.O_TRUNC;break;
         case "excl":res |= consts.O_EXCL;break;
         case "binary":res |= consts.O_BINARY;break;
         case "text":res |= consts.O_TEXT;break;
         case "nonblock":res |= consts.O_NONBLOCK;break
         }
      try
       {var fd=this.fs.openSync(this.nm(name),res);return new MlNodeFile(fd)}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.rename
    =
    function(o,n,raise_unix)
     {try
       {this.fs.renameSync(this.nm(o),this.nm(n))}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.stat
    =
    function(name,raise_unix)
     {try
       {var js_stats=this.fs.statSync(this.nm(name));
        return this.stats_from_js(js_stats)}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.lstat
    =
    function(name,raise_unix)
     {try
       {var js_stats=this.fs.lstatSync(this.nm(name));
        return this.stats_from_js(js_stats)}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.symlink
    =
    function(to_dir,target,path,raise_unix)
     {try
       {this.fs.symlinkSync(this.nm(target),this.nm(path),to_dir?"dir":"file");
        return 0}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.readlink
    =
    function(name,raise_unix)
     {try
       {var link=this.fs.readlinkSync(this.nm(name),"utf8");
        return caml_string_of_jsstring(link)}
      catch(err){this.raise_nodejs_error(err,raise_unix)}};
    MlNodeDevice.prototype.raise_nodejs_error
    =
    function(err,raise_unix)
     {var unix_error=caml_named_value("Unix.Unix_error");
      if(raise_unix && unix_error)
       {var args=make_unix_err_args(err.code,err.syscall,err.path,err.errno);
        caml_raise_with_args(unix_error,args)}
      else
       caml_raise_sys_error(err.toString())};
    MlNodeDevice.prototype.stats_from_js
    =
    function(js_stats)
     {var file_kind;
      if(js_stats.isFile())
       file_kind = 0;
      else
       if(js_stats.isDirectory())
        file_kind = 1;
       else
        if(js_stats.isCharacterDevice())
         file_kind = 2;
        else
         if(js_stats.isBlockDevice())
          file_kind = 3;
         else
          if(js_stats.isSymbolicLink())
           file_kind = 4;
          else
           if(js_stats.isFIFO())
            file_kind = 5;
           else
            if(js_stats.isSocket())file_kind = 6;
      return [0,
              js_stats.dev,
              js_stats.ino,
              file_kind,
              js_stats.mode,
              js_stats.nlink,
              js_stats.uid,
              js_stats.gid,
              js_stats.rdev,
              js_stats.size,
              js_stats.atimeMs,
              js_stats.mtimeMs,
              js_stats.ctimeMs]};
    MlNodeDevice.prototype.constructor = MlNodeDevice;
    function caml_get_root(path)
     {var x=path_is_absolute(path);if(! x)return;return x[0] + "/"}
    function caml_failwith(msg)
     {if(! caml_global_data.Failure)
       caml_global_data.Failure = [248,caml_string_of_jsbytes("Failure"),- 3];
      caml_raise_with_string(caml_global_data.Failure,msg)}
    var
     caml_root=
      caml_get_root(caml_current_dir)
      ||
      caml_failwith("unable to compute caml_root"),
     jsoo_mount_point=[];
    if(fs_node_supported())
     jsoo_mount_point.push
      ({path:caml_root,device:new MlNodeDevice(caml_root)});
    else
     jsoo_mount_point.push
      ({path:caml_root,device:new MlFakeDevice(caml_root)});
    jsoo_mount_point.push
     ({path:"/static/",device:new MlFakeDevice("/static/")});
    function resolve_fs_device(name)
     {var
       path=caml_make_path(name),
       name=path.join("/"),
       name_slash=caml_trailing_slash(name),
       res;
      for(var i=0;i < jsoo_mount_point.length;i++)
       {var m=jsoo_mount_point[i];
        if
         (name_slash.search(m.path)
          ==
          0
          &&
          (! res || res.path.length < m.path.length))
         res
         =
         {path:m.path,
          device:m.device,
          rest:name.substring(m.path.length,name.length)}}
      if(! res && fs_node_supported())
       {var root=caml_get_root(name);
        if(root && root.match(/^[a-zA-Z]:\/$/))
         {var m={path:root,device:new MlNodeDevice(root)};
          jsoo_mount_point.push(m);
          res
          =
          {path:m.path,
           device:m.device,
           rest:name.substring(m.path.length,name.length)}}}
      if(res)return res;
      caml_raise_sys_error("no device found for " + name_slash)}
    function caml_sys_is_directory(name)
     {var root=resolve_fs_device(name),a=root.device.is_dir(root.rest);
      return a?1:0}
    function caml_raise_not_found()
     {caml_raise_constant(caml_global_data.Not_found)}
    function caml_sys_getenv(name)
     {var g=globalThis,n=caml_jsstring_of_string(name);
      if(g.process && g.process.env && g.process.env[n] != undefined)
       return caml_string_of_jsstring(g.process.env[n]);
      if(globalThis.jsoo_static_env && globalThis.jsoo_static_env[n])
       return caml_string_of_jsstring(globalThis.jsoo_static_env[n]);
      caml_raise_not_found()}
    function shift_right_nat(nat1,ofs1,len1,nat2,ofs2,nbits)
     {if(nbits == 0){nat2.data[ofs2] = 0;return 0}
      var wrap=0;
      for(var i=len1 - 1;i >= 0;i--)
       {var a=nat1.data[ofs1 + i] >>> 0;
        nat1.data[ofs1 + i] = a >>> nbits | wrap;
        wrap = a << 32 - nbits}
      nat2.data[ofs2] = wrap;
      return 0}
    var caml_gr_state;
    function caml_gr_state_get()
     {if(caml_gr_state)return caml_gr_state;
      throw [0,
             caml_named_value("Graphics.Graphic_failure"),
             caml_string_of_jsbytes("Not initialized")]}
    function caml_gr_point_color(x,y)
     {var
       s=caml_gr_state_get(),
       im=s.context.getImageData(x,s.height - y,1,1),
       d=im.data;
      return (d[0] << 16) + (d[1] << 8) + d[2]}
    var MlObjectTable;
    if(typeof globalThis.WeakMap === "undefined")
     MlObjectTable
     =
     function()
       {function NaiveLookup(objs){this.objs = objs}
        NaiveLookup.prototype.get
        =
        function(v)
         {for(var i=0;i < this.objs.length;i++)if(this.objs[i] === v)return i};
        NaiveLookup.prototype.set = function(){};
        return function()
         {this.objs = [];this.lookup = new NaiveLookup(this.objs)}}
      ();
    else
     MlObjectTable
     =
     function(){this.objs = [];this.lookup = new (globalThis.WeakMap)()};
    MlObjectTable.prototype.store
    =
    function(v){this.lookup.set(v,this.objs.length);this.objs.push(v)};
    MlObjectTable.prototype.recall
    =
    function(v)
     {var i=this.lookup.get(v);
      return i === undefined?undefined:this.objs.length - i};
    function caml_sys_rename(o,n)
     {var o_root=resolve_fs_device(o),n_root=resolve_fs_device(n);
      if(o_root.device != n_root.device)
       caml_failwith
        ("caml_sys_rename: cannot move file between two filesystem");
      if(! o_root.device.rename)
       caml_failwith("caml_sys_rename: no implemented");
      o_root.device.rename(o_root.rest,n_root.rest)}
    function caml_log10_float(x){return Math.log10(x)}
    function unix_unlink(name)
     {var root=resolve_fs_device(name);
      if(! root.device.unlink)caml_failwith("unix_unlink: not implemented");
      return root.device.unlink(root.rest,true)}
    var caml_runtime_warnings=0;
    function caml_ml_enable_runtime_warnings(bool)
     {caml_runtime_warnings = bool;return 0}
    function caml_classify_float(x)
     {if(isFinite(x))
       {if(Math.abs(x) >= 2.2250738585072014e-308)return 0;
        if(x != 0)return 1;
        return 2}
      return isNaN(x)?4:3}
    function unix_rmdir(name)
     {var root=resolve_fs_device(name);
      if(! root.device.rmdir)caml_failwith("unix_rmdir: not implemented");
      return root.device.rmdir(root.rest,true)}
    function caml_ml_refill_input(chan)
     {var str=chan.refill(),str_len=caml_ml_string_length(str);
      if(str_len == 0)chan.refill = null;
      chan.file.write(chan.file.length(),str,0,str_len);
      return str_len}
    var caml_ml_channels=new Array();
    function caml_ml_may_refill_input(chanid)
     {var chan=caml_ml_channels[chanid];
      if(chan.refill == null)return;
      if(chan.file.length() != chan.offset)return;
      caml_ml_refill_input(chan)}
    function caml_array_bound_error()
     {caml_invalid_argument("index out of bounds")}
    function caml_ml_input_scan_line(chanid)
     {var chan=caml_ml_channels[chanid];
      caml_ml_may_refill_input(chanid);
      var p=chan.offset,len=chan.file.length();
      if(p >= len)return 0;
      while(true)
       {if(p >= len)return - (p - chan.offset);
        if(chan.file.read_one(p) == 10)return p - chan.offset + 1;
        p++}}
    function caml_gc_minor(){return 0}
    function caml_int64_of_bytes(a)
     {return new
              MlInt64
              (a[7] << 0 | a[6] << 8 | a[5] << 16,
               a[4] << 0 | a[3] << 8 | a[2] << 16,
               a[1] << 0 | a[0] << 8)}
    function caml_ba_uint8_get64(ba,i0)
     {var ofs=ba.offset(i0);
      if(ofs + 7 >= ba.data.length)caml_array_bound_error();
      var
       b1=ba.get(ofs + 0),
       b2=ba.get(ofs + 1),
       b3=ba.get(ofs + 2),
       b4=ba.get(ofs + 3),
       b5=ba.get(ofs + 4),
       b6=ba.get(ofs + 5),
       b7=ba.get(ofs + 6),
       b8=ba.get(ofs + 7);
      return caml_int64_of_bytes([b8,b7,b6,b5,b4,b3,b2,b1])}
    function caml_int64_to_bytes(x){return x.toArray()}
    function caml_int64_marshal(writer,v,sizes)
     {var b=caml_int64_to_bytes(v);
      for(var i=0;i < 8;i++)writer.write(8,b[i]);
      sizes[0] = 8;
      sizes[1] = 8}
    function caml_ba_num_dims(ba){return ba.dims.length}
    function caml_return_exn_constant(tag){return tag}
    function caml_wrap_exception(e)
     {if(e instanceof Array)return e;
      if
       (globalThis.RangeError
        &&
        e instanceof globalThis.RangeError
        &&
        e.message
        &&
        e.message.match(/maximum call stack/i))
       return caml_return_exn_constant(caml_global_data.Stack_overflow);
      if
       (globalThis.InternalError
        &&
        e instanceof globalThis.InternalError
        &&
        e.message
        &&
        e.message.match(/too much recursion/i))
       return caml_return_exn_constant(caml_global_data.Stack_overflow);
      if(e instanceof globalThis.Error && caml_named_value("jsError"))
       return [0,caml_named_value("jsError"),e];
      return [0,caml_global_data.Failure,caml_string_of_jsstring(String(e))]}
    function caml_create_file(name,content)
     {var root=resolve_fs_device(name);
      if(! root.device.register)caml_failwith("cannot register file");
      root.device.register(root.rest,content);
      return 0}
    function jsoo_create_file(name,content)
     {var
       name=caml_string_of_jsbytes(name),
       content=caml_string_of_jsbytes(content);
      return caml_create_file(name,content)}
    function caml_fs_init()
     {var tmp=globalThis.caml_fs_tmp;
      if(tmp)
       for(var i=0;i < tmp.length;i++)
        jsoo_create_file(tmp[i].name,tmp[i].content);
      globalThis.jsoo_create_file = jsoo_create_file;
      globalThis.caml_fs_tmp = [];
      return 0}
    function caml_set_parser_trace(){return 0}
    function caml_list_of_js_array(a)
     {var l=0;
      for(var i=a.length - 1;i >= 0;i--){var e=a[i];l = [0,e,l]}
      return l}
    function unix_gettimeofday(){return new Date().getTime() / 1000}
    function caml_mul(a,b){return Math.imul(a,b)}
    function caml_hash_mix_int(h,d)
     {d = caml_mul(d,0xcc9e2d51 | 0);
      d = d << 15 | d >>> 32 - 15;
      d = caml_mul(d,0x1b873593);
      h ^= d;
      h = h << 13 | h >>> 32 - 13;
      return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0}
    function num_digits_nat(nat,ofs,len)
     {for(var i=len - 1;i >= 0;i--)if(nat.data[ofs + i] != 0)return i + 1;
      return 1}
    function caml_hash_nat(x)
     {var len=num_digits_nat(x,0,x.data.length),h=0;
      for(var i=0;i < len;i++)h = caml_hash_mix_int(h,x.data[i]);
      return h}
    function caml_call_gen(f,args)
     {if(f.fun)return caml_call_gen(f.fun,args);
      if(typeof f !== "function")return f;
      var n=f.length | 0;
      if(n === 0)return f.apply(null,args);
      var argsLen=args.length | 0,d=n - argsLen | 0;
      if(d == 0)
       return f.apply(null,args);
      else
       if(d < 0)
        return caml_call_gen(f.apply(null,args.slice(0,n)),args.slice(n));
       else
        return function()
         {var
           extra_args=arguments.length == 0?1:arguments.length,
           nargs=new Array(args.length + extra_args);
          for(var i=0;i < args.length;i++)nargs[i] = args[i];
          for(var i=0;i < arguments.length;i++)
           nargs[args.length + i] = arguments[i];
          return caml_call_gen(f,nargs)}}
    function caml_js_wrap_callback_arguments(f)
     {return function()
       {var len=arguments.length,args=new Array(len);
        for(var i=0;i < len;i++)args[i] = arguments[i];
        return caml_call_gen(f,[args])}}
    function caml_sys_chdir(dir)
     {var root=resolve_fs_device(dir);
      if(root.device.exists(root.rest))
       {if(root.rest)
         caml_current_dir = caml_trailing_slash(root.path + root.rest);
        else
         caml_current_dir = root.path;
        return 0}
      else
       caml_raise_no_such_file(caml_jsbytes_of_string(dir))}
    function caml_gc_counters(){return [254,0,0,0]}
    function caml_gr_synchronize()
     {caml_failwith("caml_gr_synchronize not Implemented")}
    function unix_has_symlink(unit){return fs_node_supported()?1:0}
    var log2_ok=Math.log2 && Math.log2(1.1235582092889474E+307) == 1020;
    function jsoo_floor_log2(x)
     {if(log2_ok)return Math.floor(Math.log2(x));
      var i=0;
      if(x == 0)return - Infinity;
      if(x >= 1)while(x >= 2){x /= 2;i++}else while(x < 1){x *= 2;i--}
      return i}
    function caml_int32_bits_of_float(x)
     {var float32a=new (globalThis.Float32Array)(1);
      float32a[0] = x;
      var int32a=new (globalThis.Int32Array)(float32a.buffer);
      return int32a[0] | 0}
    function caml_int64_create_lo_mi_hi(lo,mi,hi)
     {return new MlInt64(lo,mi,hi)}
    function caml_int64_bits_of_float(x)
     {if(! isFinite(x))
       {if(isNaN(x))return caml_int64_create_lo_mi_hi(1,0,0x7ff0);
        return x > 0
                ?caml_int64_create_lo_mi_hi(0,0,0x7ff0)
                :caml_int64_create_lo_mi_hi(0,0,0xfff0)}
      var sign=x == 0 && 1 / x == - Infinity?0x8000:x >= 0?0:0x8000;
      if(sign)x = - x;
      var exp=jsoo_floor_log2(x) + 1023;
      if(exp <= 0)
       {exp = 0;x /= Math.pow(2,- 1026)}
      else
       {x /= Math.pow(2,exp - 1027);
        if(x < 16){x *= 2;exp -= 1}
        if(exp == 0)x /= 2}
      var k=Math.pow(2,24),r3=x | 0;
      x = (x - r3) * k;
      var r2=x | 0;
      x = (x - r2) * k;
      var r1=x | 0;
      r3 = r3 & 0xf | sign | exp << 4;
      return caml_int64_create_lo_mi_hi(r1,r2,r3)}
    function caml_ba_serialize(writer,ba,sz)
     {writer.write(32,ba.dims.length);
      writer.write(32,ba.kind | ba.layout << 8);
      if(ba.caml_custom == "_bigarr02")
       for(var i=0;i < ba.dims.length;i++)
        if(ba.dims[i] < 0xffff)
         writer.write(16,ba.dims[i]);
        else
         {writer.write(16,0xffff);
          writer.write(32,0);
          writer.write(32,ba.dims[i])}
      else
       for(var i=0;i < ba.dims.length;i++)writer.write(32,ba.dims[i]);
      switch(ba.kind)
       {case 2:
        case 3:
        case 12:
         for(var i=0;i < ba.data.length;i++)writer.write(8,ba.data[i]);break;
        case 4:
        case 5:
         for(var i=0;i < ba.data.length;i++)writer.write(16,ba.data[i]);break;
        case 6:
         for(var i=0;i < ba.data.length;i++)writer.write(32,ba.data[i]);break;
        case 8:
        case 9:
         writer.write(8,0);
         for(var i=0;i < ba.data.length;i++)writer.write(32,ba.data[i]);
         break;
        case 7:
         for(var i=0;i < ba.data.length / 2;i++)
          {var b=caml_int64_to_bytes(ba.get(i));
           for(var j=0;j < 8;j++)writer.write(8,b[j])}
         break;
        case 1:
         for(var i=0;i < ba.data.length;i++)
          {var b=caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i)));
           for(var j=0;j < 8;j++)writer.write(8,b[j])}
         break;
        case 0:
         for(var i=0;i < ba.data.length;i++)
          {var b=caml_int32_bits_of_float(ba.get(i));writer.write(32,b)}
         break;
        case 10:
         for(var i=0;i < ba.data.length / 2;i++)
          {var j=ba.get(i);
           writer.write(32,caml_int32_bits_of_float(j[1]));
           writer.write(32,caml_int32_bits_of_float(j[2]))}
         break;
        case 11:
         for(var i=0;i < ba.data.length / 2;i++)
          {var
            complex=ba.get(i),
            b=caml_int64_to_bytes(caml_int64_bits_of_float(complex[1]));
           for(var j=0;j < 8;j++)writer.write(8,b[j]);
           var b=caml_int64_to_bytes(caml_int64_bits_of_float(complex[2]));
           for(var j=0;j < 8;j++)writer.write(8,b[j])}
         break
        }
      sz[0] = (4 + ba.dims.length) * 4;
      sz[1] = (4 + ba.dims.length) * 8}
    function caml_ba_get_size_per_element(kind)
     {switch(kind){case 7:case 10:case 11:return 2;default:return 1}}
    function caml_ba_create_buffer(kind,size)
     {var g=globalThis,view;
      switch(kind)
       {case 0:view = g.Float32Array;break;
        case 1:view = g.Float64Array;break;
        case 2:view = g.Int8Array;break;
        case 3:view = g.Uint8Array;break;
        case 4:view = g.Int16Array;break;
        case 5:view = g.Uint16Array;break;
        case 6:view = g.Int32Array;break;
        case 7:view = g.Int32Array;break;
        case 8:view = g.Int32Array;break;
        case 9:view = g.Int32Array;break;
        case 10:view = g.Float32Array;break;
        case 11:view = g.Float64Array;break;
        case 12:view = g.Uint8Array;break
        }
      if(! view)caml_invalid_argument("Bigarray.create: unsupported kind");
      var data=new view(size * caml_ba_get_size_per_element(kind));
      return data}
    function caml_int32_float_of_bits(x)
     {var int32a=new (globalThis.Int32Array)(1);
      int32a[0] = x;
      var float32a=new (globalThis.Float32Array)(int32a.buffer);
      return float32a[0]}
    function caml_int64_float_of_bits(x)
     {var lo=x.lo,mi=x.mi,hi=x.hi,exp=(hi & 0x7fff) >> 4;
      if(exp == 2047)
       return (lo | mi | hi & 0xf) == 0?hi & 0x8000?- Infinity:Infinity:NaN;
      var k=Math.pow(2,- 24),res=(lo * k + mi) * k + (hi & 0xf);
      if(exp > 0)
       {res += 16;res *= Math.pow(2,exp - 1027)}
      else
       res *= Math.pow(2,- 1026);
      if(hi & 0x8000)res = - res;
      return res}
    function caml_ba_get_size(dims)
     {var n_dims=dims.length,size=1;
      for(var i=0;i < n_dims;i++)
       {if(dims[i] < 0)
         caml_invalid_argument("Bigarray.create: negative dimension");
        size = size * dims[i]}
      return size}
    function caml_int64_create_lo_hi(lo,hi)
     {return new
              MlInt64
              (lo & 0xffffff,
               lo >>> 24 & 0xff | (hi & 0xffff) << 8,
               hi >>> 16 & 0xffff)}
    function caml_int64_hi32(v){return v.hi32()}
    function caml_int64_lo32(v){return v.lo32()}
    var caml_ba_custom_name="_bigarr02";
    function Ml_Bigarray(kind,layout,dims,buffer)
     {this.kind = kind;
      this.layout = layout;
      this.dims = dims;
      this.data = buffer}
    Ml_Bigarray.prototype.caml_custom = caml_ba_custom_name;
    Ml_Bigarray.prototype.offset
    =
    function(arg)
     {var ofs=0;
      if(typeof arg === "number")arg = [arg];
      if(! (arg instanceof Array))
       caml_invalid_argument("bigarray.js: invalid offset");
      if(this.dims.length != arg.length)
       caml_invalid_argument("Bigarray.get/set: bad number of dimensions");
      if(this.layout == 0)
       for(var i=0;i < this.dims.length;i++)
        {if(arg[i] < 0 || arg[i] >= this.dims[i])caml_array_bound_error();
         ofs = ofs * this.dims[i] + arg[i]}
      else
       for(var i=this.dims.length - 1;i >= 0;i--)
        {if(arg[i] < 1 || arg[i] > this.dims[i])caml_array_bound_error();
         ofs = ofs * this.dims[i] + (arg[i] - 1)}
      return ofs};
    Ml_Bigarray.prototype.get
    =
    function(ofs)
     {switch(this.kind)
       {case 7:
         var l=this.data[ofs * 2 + 0],h=this.data[ofs * 2 + 1];
         return caml_int64_create_lo_hi(l,h);
        case 10:
        case 11:
         var r=this.data[ofs * 2 + 0],i=this.data[ofs * 2 + 1];
         return [254,r,i];
        default:return this.data[ofs]}};
    Ml_Bigarray.prototype.set
    =
    function(ofs,v)
     {switch(this.kind)
       {case 7:
         this.data[ofs * 2 + 0] = caml_int64_lo32(v);
         this.data[ofs * 2 + 1] = caml_int64_hi32(v);
         break;
        case 10:
        case 11:
         this.data[ofs * 2 + 0] = v[1];this.data[ofs * 2 + 1] = v[2];break;
        default:this.data[ofs] = v;break}
      return 0};
    Ml_Bigarray.prototype.fill
    =
    function(v)
     {switch(this.kind)
       {case 7:
         var a=caml_int64_lo32(v),b=caml_int64_hi32(v);
         if(a == b)
          this.data.fill(a);
         else
          for(var i=0;i < this.data.length;i++)this.data[i] = i % 2 == 0?a:b;
         break;
        case 10:
        case 11:
         var im=v[1],re=v[2];
         if(im == re)
          this.data.fill(im);
         else
          for(var i=0;i < this.data.length;i++)
           this.data[i] = i % 2 == 0?im:re;
         break;
        default:this.data.fill(v);break}};
    Ml_Bigarray.prototype.compare
    =
    function(b,total)
     {if(this.layout != b.layout || this.kind != b.kind)
       {var k1=this.kind | this.layout << 8,k2=b.kind | b.layout << 8;
        return k2 - k1}
      if(this.dims.length != b.dims.length)
       return b.dims.length - this.dims.length;
      for(var i=0;i < this.dims.length;i++)
       if(this.dims[i] != b.dims[i])return this.dims[i] < b.dims[i]?- 1:1;
      switch(this.kind)
       {case 0:
        case 1:
        case 10:
        case 11:
         var x,y;
         for(var i=0;i < this.data.length;i++)
          {x = this.data[i];
           y = b.data[i];
           if(x < y)return - 1;
           if(x > y)return 1;
           if(x != y)
            {if(! total)return NaN;if(x == x)return 1;if(y == y)return - 1}}
         break;
        case 7:
         for(var i=0;i < this.data.length;i += 2)
          {if(this.data[i + 1] < b.data[i + 1])return - 1;
           if(this.data[i + 1] > b.data[i + 1])return 1;
           if(this.data[i] >>> 0 < b.data[i] >>> 0)return - 1;
           if(this.data[i] >>> 0 > b.data[i] >>> 0)return 1}
         break;
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 8:
        case 9:
        case 12:
         for(var i=0;i < this.data.length;i++)
          {if(this.data[i] < b.data[i])return - 1;
           if(this.data[i] > b.data[i])return 1}
         break
        }
      return 0};
    function Ml_Bigarray_c_1_1(kind,layout,dims,buffer)
     {this.kind = kind;
      this.layout = layout;
      this.dims = dims;
      this.data = buffer}
    Ml_Bigarray_c_1_1.prototype = new Ml_Bigarray();
    Ml_Bigarray_c_1_1.prototype.offset
    =
    function(arg)
     {if(typeof arg !== "number")
       if(arg instanceof Array && arg.length == 1)
        arg = arg[0];
       else
        caml_invalid_argument("Ml_Bigarray_c_1_1.offset");
      if(arg < 0 || arg >= this.dims[0])caml_array_bound_error();
      return arg};
    Ml_Bigarray_c_1_1.prototype.get = function(ofs){return this.data[ofs]};
    Ml_Bigarray_c_1_1.prototype.set
    =
    function(ofs,v){this.data[ofs] = v;return 0};
    Ml_Bigarray_c_1_1.prototype.fill
    =
    function(v){this.data.fill(v);return 0};
    function caml_ba_create_unsafe(kind,layout,dims,data)
     {var size_per_element=caml_ba_get_size_per_element(kind);
      if(caml_ba_get_size(dims) * size_per_element != data.length)
       caml_invalid_argument("length doesn't match dims");
      if(layout == 0 && dims.length == 1 && size_per_element == 1)
       return new Ml_Bigarray_c_1_1(kind,layout,dims,data);
      return new Ml_Bigarray(kind,layout,dims,data)}
    function caml_ba_deserialize(reader,sz,name)
     {var num_dims=reader.read32s();
      if(num_dims < 0 || num_dims > 16)
       caml_failwith("input_value: wrong number of bigarray dimensions");
      var tag=reader.read32s(),kind=tag & 0xff,layout=tag >> 8 & 1,dims=[];
      if(name == "_bigarr02")
       for(var i=0;i < num_dims;i++)
        {var size_dim=reader.read16u();
         if(size_dim == 0xffff)
          {var size_dim_hi=reader.read32u(),size_dim_lo=reader.read32u();
           if(size_dim_hi != 0)
            caml_failwith("input_value: bigarray dimension overflow in 32bit");
           size_dim = size_dim_lo}
         dims.push(size_dim)}
      else
       for(var i=0;i < num_dims;i++)dims.push(reader.read32u());
      var
       size=caml_ba_get_size(dims),
       data=caml_ba_create_buffer(kind,size),
       ba=caml_ba_create_unsafe(kind,layout,dims,data);
      switch(kind)
       {case 2:for(var i=0;i < size;i++)data[i] = reader.read8s();break;
        case 3:
        case 12:for(var i=0;i < size;i++)data[i] = reader.read8u();break;
        case 4:for(var i=0;i < size;i++)data[i] = reader.read16s();break;
        case 5:for(var i=0;i < size;i++)data[i] = reader.read16u();break;
        case 6:for(var i=0;i < size;i++)data[i] = reader.read32s();break;
        case 8:
        case 9:
         var sixty=reader.read8u();
         if(sixty)
          caml_failwith
           ("input_value: cannot read bigarray with 64-bit OCaml ints");
         for(var i=0;i < size;i++)data[i] = reader.read32s();
         break;
        case 7:
         var t=new Array(8);
         for(var i=0;i < size;i++)
          {for(var j=0;j < 8;j++)t[j] = reader.read8u();
           var int64=caml_int64_of_bytes(t);
           ba.set(i,int64)}
         break;
        case 1:
         var t=new Array(8);
         for(var i=0;i < size;i++)
          {for(var j=0;j < 8;j++)t[j] = reader.read8u();
           var f=caml_int64_float_of_bits(caml_int64_of_bytes(t));
           ba.set(i,f)}
         break;
        case 0:
         for(var i=0;i < size;i++)
          {var f=caml_int32_float_of_bits(reader.read32s());ba.set(i,f)}
         break;
        case 10:
         for(var i=0;i < size;i++)
          {var
            re=caml_int32_float_of_bits(reader.read32s()),
            im=caml_int32_float_of_bits(reader.read32s());
           ba.set(i,[254,re,im])}
         break;
        case 11:
         var t=new Array(8);
         for(var i=0;i < size;i++)
          {for(var j=0;j < 8;j++)t[j] = reader.read8u();
           var re=caml_int64_float_of_bits(caml_int64_of_bytes(t));
           for(var j=0;j < 8;j++)t[j] = reader.read8u();
           var im=caml_int64_float_of_bits(caml_int64_of_bytes(t));
           ba.set(i,[254,re,im])}
         break
        }
      sz[0] = (4 + num_dims) * 4;
      return caml_ba_create_unsafe(kind,layout,dims,data)}
    function caml_ba_compare(a,b,total){return a.compare(b,total)}
    function caml_hash_mix_int64(h,v)
     {h = caml_hash_mix_int(h,caml_int64_lo32(v));
      h = caml_hash_mix_int(h,caml_int64_hi32(v));
      return h}
    function caml_hash_mix_float(h,v0)
     {return caml_hash_mix_int64(h,caml_int64_bits_of_float(v0))}
    function caml_ba_hash(ba)
     {var num_elts=caml_ba_get_size(ba.dims),h=0;
      switch(ba.kind)
       {case 2:
        case 3:
        case 12:
         if(num_elts > 256)num_elts = 256;
         var w=0,i=0;
         for(i = 0;i + 4 <= ba.data.length;i += 4)
          {w
           =
           ba.data[i + 0]
           |
           ba.data[i + 1]
           <<
           8
           |
           ba.data[i + 2]
           <<
           16
           |
           ba.data[i + 3]
           <<
           24;
           h = caml_hash_mix_int(h,w)}
         w = 0;
         switch(num_elts & 3)
          {case 3:w = ba.data[i + 2] << 16;
           case 2:w |= ba.data[i + 1] << 8;
           case 1:w |= ba.data[i + 0];h = caml_hash_mix_int(h,w)
           }
         break;
        case 4:
        case 5:
         if(num_elts > 128)num_elts = 128;
         var w=0,i=0;
         for(i = 0;i + 2 <= ba.data.length;i += 2)
          {w = ba.data[i + 0] | ba.data[i + 1] << 16;
           h = caml_hash_mix_int(h,w)}
         if((num_elts & 1) != 0)h = caml_hash_mix_int(h,ba.data[i]);
         break;
        case 6:
         if(num_elts > 64)num_elts = 64;
         for(var i=0;i < num_elts;i++)h = caml_hash_mix_int(h,ba.data[i]);
         break;
        case 8:
        case 9:
         if(num_elts > 64)num_elts = 64;
         for(var i=0;i < num_elts;i++)h = caml_hash_mix_int(h,ba.data[i]);
         break;
        case 7:
         if(num_elts > 32)num_elts = 32;
         num_elts *= 2;
         for(var i=0;i < num_elts;i++)h = caml_hash_mix_int(h,ba.data[i]);
         break;
        case 10:num_elts *= 2;
        case 0:
         if(num_elts > 64)num_elts = 64;
         for(var i=0;i < num_elts;i++)h = caml_hash_mix_float(h,ba.data[i]);
         break;
        case 11:num_elts *= 2;
        case 1:
         if(num_elts > 32)num_elts = 32;
         for(var i=0;i < num_elts;i++)h = caml_hash_mix_float(h,ba.data[i]);
         break
        }
      return h}
    function caml_int32_unmarshal(reader,size)
     {size[0] = 4;return reader.read32s()}
    function caml_nativeint_unmarshal(reader,size)
     {switch(reader.read8u())
       {case 1:size[0] = 4;return reader.read32s();
        case 2:caml_failwith("input_value: native integer value too large");
        default:caml_failwith("input_value: ill-formed native integer")}}
    function caml_int64_unmarshal(reader,size)
     {var t=new Array(8);
      for(var j=0;j < 8;j++)t[j] = reader.read8u();
      size[0] = 8;
      return caml_int64_of_bytes(t)}
    function caml_int64_compare(x,y,total){return x.compare(y)}
    function caml_int64_hash(v){return v.lo32() ^ v.hi32()}
    var
     caml_custom_ops=
      {"_j":
       {deserialize:caml_int64_unmarshal,
        serialize:caml_int64_marshal,
        fixed_length:8,
        compare:caml_int64_compare,
        hash:caml_int64_hash},
       "_i":{deserialize:caml_int32_unmarshal,fixed_length:4},
       "_n":{deserialize:caml_nativeint_unmarshal,fixed_length:4},
       "_bigarray":
       {deserialize:
        function(reader,sz){return caml_ba_deserialize(reader,sz,"_bigarray")},
        serialize:caml_ba_serialize,
        compare:caml_ba_compare,
        hash:caml_ba_hash},
       "_bigarr02":
       {deserialize:
        function(reader,sz){return caml_ba_deserialize(reader,sz,"_bigarr02")},
        serialize:caml_ba_serialize,
        compare:caml_ba_compare,
        hash:caml_ba_hash}};
    function caml_compare_val_get_custom(a)
     {return caml_custom_ops[a.caml_custom]
             &&
             caml_custom_ops[a.caml_custom].compare}
    function caml_compare_val_number_custom(num,custom,swap,total)
     {var comp=caml_compare_val_get_custom(custom);
      if(comp)
       {var x=swap > 0?comp(custom,num,total):comp(num,custom,total);
        if(total && x != x)return swap;
        if(+ x != + x)return + x;
        if((x | 0) != 0)return x | 0}
      return swap}
    function caml_compare_val_tag(a)
     {if(typeof a === "number")
       return 1000;
      else
       if(caml_is_ml_bytes(a))
        return 252;
       else
        if(caml_is_ml_string(a))
         return 1252;
        else
         if(a instanceof Array && a[0] === a[0] >>> 0 && a[0] <= 255)
          {var tag=a[0] | 0;return tag == 254?0:tag}
         else
          if(a instanceof String)
           return 12520;
          else
           if(typeof a == "string")
            return 12520;
           else
            if(a instanceof Number)
             return 1000;
            else
             if(a && a.caml_custom)
              return 1255;
             else
              if(a && a.compare)
               return 1256;
              else
               if(typeof a == "function")
                return 1247;
               else
                if(typeof a == "symbol")return 1251;
      return 1001}
    function caml_int_compare(a,b)
     {if(a < b)return - 1;if(a == b)return 0;return 1}
    function caml_bytes_compare(s1,s2)
     {s1.t & 6 && caml_convert_string_to_bytes(s1);
      s2.t & 6 && caml_convert_string_to_bytes(s2);
      return s1.c < s2.c?- 1:s1.c > s2.c?1:0}
    function caml_string_compare(s1,s2){return caml_bytes_compare(s1,s2)}
    function caml_compare_val(a,b,total)
     {var stack=[];
      for(;;)
       {if(! (total && a === b))
         {var tag_a=caml_compare_val_tag(a);
          if(tag_a == 250){a = a[1];continue}
          var tag_b=caml_compare_val_tag(b);
          if(tag_b == 250){b = b[1];continue}
          if(tag_a !== tag_b)
           {if(tag_a == 1000)
             {if(tag_b == 1255)
               return caml_compare_val_number_custom(a,b,- 1,total);
              return - 1}
            if(tag_b == 1000)
             {if(tag_a == 1255)
               return caml_compare_val_number_custom(b,a,1,total);
              return 1}
            return tag_a < tag_b?- 1:1}
          switch(tag_a)
           {case 247:caml_invalid_argument("compare: functional value");break;
            case 248:
             var x=caml_int_compare(a[2],b[2]);if(x != 0)return x | 0;break;
            case 249:caml_invalid_argument("compare: functional value");break;
            case 250:
             caml_invalid_argument
              ("equal: got Forward_tag, should not happen");
             break;
            case 251:caml_invalid_argument("equal: abstract value");break;
            case 252:
             if(a !== b){var x=caml_bytes_compare(a,b);if(x != 0)return x | 0}
             break;
            case 253:
             caml_invalid_argument("equal: got Double_tag, should not happen");
             break;
            case 254:
             caml_invalid_argument
              ("equal: got Double_array_tag, should not happen");
             break;
            case 255:
             caml_invalid_argument("equal: got Custom_tag, should not happen");
             break;
            case 1247:
             caml_invalid_argument("compare: functional value");break;
            case 1255:
             var comp=caml_compare_val_get_custom(a);
             if(comp != caml_compare_val_get_custom(b))
              return a.caml_custom < b.caml_custom?- 1:1;
             if(! comp)caml_invalid_argument("compare: abstract value");
             var x=comp(a,b,total);
             if(x != x)return total?- 1:x;
             if(x !== (x | 0))return - 1;
             if(x != 0)return x | 0;
             break;
            case 1256:
             var x=a.compare(b,total);
             if(x != x)return total?- 1:x;
             if(x !== (x | 0))return - 1;
             if(x != 0)return x | 0;
             break;
            case 1000:
             a = + a;
             b = + b;
             if(a < b)return - 1;
             if(a > b)return 1;
             if(a != b)
              {if(! total)return NaN;if(a == a)return 1;if(b == b)return - 1}
             break;
            case 1001:
             if(a < b)return - 1;
             if(a > b)return 1;
             if(a != b)
              {if(! total)return NaN;if(a == a)return 1;if(b == b)return - 1}
             break;
            case 1251:if(a !== b){if(! total)return NaN;return 1}break;
            case 1252:
             var a=caml_jsbytes_of_string(a),b=caml_jsbytes_of_string(b);
             if(a !== b){if(a < b)return - 1;if(a > b)return 1}
             break;
            case 12520:
             var a=a.toString(),b=b.toString();
             if(a !== b){if(a < b)return - 1;if(a > b)return 1}
             break;
            case 246:
            case 254:
            default:
             if(a.length != b.length)return a.length < b.length?- 1:1;
             if(a.length > 1)stack.push(a,b,1);
             break}}
        if(stack.length == 0)return 0;
        var i=stack.pop();
        b = stack.pop();
        a = stack.pop();
        if(i + 1 < a.length)stack.push(a,b,i + 1);
        a = a[i];
        b = b[i]}}
    function caml_greaterthan(x,y){return + (caml_compare_val(x,y,false) > 0)}
    function div_helper(a,b,c)
     {var
       x=a * 65536 + (b >>> 16),
       y=Math.floor(x / c) * 65536,
       z=x % c * 65536,
       w=z + (b & 0x0000FFFF);
      return [y + Math.floor(w / c),w % c]}
    function div_digit_nat(natq,ofsq,natr,ofsr,nat1,ofs1,len,nat2,ofs2)
     {var rem=nat1.data[ofs1 + len - 1] >>> 0;
      for(var i=len - 2;i >= 0;i--)
       {var x=div_helper(rem,nat1.data[ofs1 + i] >>> 0,nat2.data[ofs2] >>> 0);
        natq.data[ofsq + i] = x[0];
        rem = x[1]}
      natr.data[ofsr] = rem;
      return 0}
    function num_leading_zero_bits_in_digit(nat,ofs)
     {var a=nat.data[ofs],b=0;
      if(a & 0xFFFF0000){b += 16;a >>>= 16}
      if(a & 0xFF00){b += 8;a >>>= 8}
      if(a & 0xF0){b += 4;a >>>= 4}
      if(a & 12){b += 2;a >>>= 2}
      if(a & 2){b += 1;a >>>= 1}
      if(a & 1)b += 1;
      return 32 - b}
    function shift_left_nat(nat1,ofs1,len1,nat2,ofs2,nbits)
     {if(nbits == 0){nat2.data[ofs2] = 0;return 0}
      var wrap=0;
      for(var i=0;i < len1;i++)
       {var a=nat1.data[ofs1 + i] >>> 0;
        nat1.data[ofs1 + i] = a << nbits | wrap;
        wrap = a >>> 32 - nbits}
      nat2.data[ofs2] = wrap;
      return 0}
    function MlNat(x)
     {this.data = new (globalThis.Int32Array)(x);
      this.length = this.data.length + 2}
    MlNat.prototype.caml_custom = "_nat";
    function create_nat(size)
     {var arr=new MlNat(size);
      for(var i=0;i < size;i++)arr.data[i] = - 1;
      return arr}
    function set_to_zero_nat(nat,ofs,len)
     {for(var i=0;i < len;i++)nat.data[ofs + i] = 0;return 0}
    function incr_nat(nat,ofs,len,carry_in)
     {var carry=carry_in;
      for(var i=0;i < len;i++)
       {var x=(nat.data[ofs + i] >>> 0) + carry;
        nat.data[ofs + i] = x | 0;
        if(x == x >>> 0){carry = 0;break}else carry = 1}
      return carry}
    function add_nat(nat1,ofs1,len1,nat2,ofs2,len2,carry_in)
     {var carry=carry_in;
      for(var i=0;i < len2;i++)
       {var
         x=
          (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry;
        nat1.data[ofs1 + i] = x;
        if(x == x >>> 0)carry = 0;else carry = 1}
      return incr_nat(nat1,ofs1 + len2,len1 - len2,carry)}
    function nat_of_array(l){return new MlNat(l)}
    function mult_digit_nat(nat1,ofs1,len1,nat2,ofs2,len2,nat3,ofs3)
     {var carry=0,a=nat3.data[ofs3] >>> 0;
      for(var i=0;i < len2;i++)
       {var
         x1=
          (nat1.data[ofs1 + i] >>> 0)
          +
          (nat2.data[ofs2 + i] >>> 0)
          *
          (a & 0x0000FFFF)
          +
          carry,
         x2=(nat2.data[ofs2 + i] >>> 0) * (a >>> 16);
        carry = Math.floor(x2 / 65536);
        var x3=x1 + x2 % 65536 * 65536;
        nat1.data[ofs1 + i] = x3;
        carry += Math.floor(x3 / 4294967296)}
      return len2 < len1 && carry
              ?add_nat
                (nat1,ofs1 + len2,len1 - len2,nat_of_array([carry]),0,1,0)
              :carry}
    function decr_nat(nat,ofs,len,carry_in)
     {var borrow=carry_in == 1?0:1;
      for(var i=0;i < len;i++)
       {var x=(nat.data[ofs + i] >>> 0) - borrow;
        nat.data[ofs + i] = x;
        if(x >= 0){borrow = 0;break}else borrow = 1}
      return borrow == 1?0:1}
    function sub_nat(nat1,ofs1,len1,nat2,ofs2,len2,carry_in)
     {var borrow=carry_in == 1?0:1;
      for(var i=0;i < len2;i++)
       {var
         x=
          (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow;
        nat1.data[ofs1 + i] = x;
        if(x >= 0)borrow = 0;else borrow = 1}
      return decr_nat(nat1,ofs1 + len2,len1 - len2,borrow == 1?0:1)}
    function compare_nat(nat1,ofs1,len1,nat2,ofs2,len2)
     {var a=num_digits_nat(nat1,ofs1,len1),b=num_digits_nat(nat2,ofs2,len2);
      if(a > b)return 1;
      if(a < b)return - 1;
      for(var i=len1 - 1;i >= 0;i--)
       {if(nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0)return 1;
        if(nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0)return - 1}
      return 0}
    function div_nat(nat1,ofs1,len1,nat2,ofs2,len2)
     {if(len2 == 1)
       {div_digit_nat(nat1,ofs1 + 1,nat1,ofs1,nat1,ofs1,len1,nat2,ofs2);
        return 0}
      var s=num_leading_zero_bits_in_digit(nat2,ofs2 + len2 - 1);
      shift_left_nat(nat2,ofs2,len2,nat_of_array([0]),0,s);
      shift_left_nat(nat1,ofs1,len1,nat_of_array([0]),0,s);
      var d=(nat2.data[ofs2 + len2 - 1] >>> 0) + 1,a=create_nat(len2 + 1);
      for(var i=len1 - 1;i >= len2;i--)
       {var
         quo=
          d == 4294967296
           ?nat1.data[ofs1 + i] >>> 0
           :div_helper
              (nat1.data[ofs1 + i] >>> 0,nat1.data[ofs1 + i - 1] >>> 0,d)
             [0];
        set_to_zero_nat(a,0,len2 + 1);
        mult_digit_nat(a,0,len2 + 1,nat2,ofs2,len2,nat_of_array([quo]),0);
        sub_nat(nat1,ofs1 + i - len2,len2 + 1,a,0,len2 + 1,1);
        while
         (nat1.data[ofs1 + i]
          !=
          0
          ||
          compare_nat(nat1,ofs1 + i - len2,len2,nat2,ofs2,len2)
          >=
          0)
         {quo = quo + 1;
          sub_nat(nat1,ofs1 + i - len2,len2 + 1,nat2,ofs2,len2,1)}
        nat1.data[ofs1 + i] = quo}
      shift_right_nat(nat1,ofs1,len2,nat_of_array([0]),0,s);
      shift_right_nat(nat2,ofs2,len2,nat_of_array([0]),0,s);
      return 0}
    function caml_ba_blit(src,dst)
     {if(dst.dims.length != src.dims.length)
       caml_invalid_argument("Bigarray.blit: dimension mismatch");
      for(var i=0;i < dst.dims.length;i++)
       if(dst.dims[i] != src.dims[i])
        caml_invalid_argument("Bigarray.blit: dimension mismatch");
      dst.data.set(src.data);
      return 0}
    function is_digit_int(nat,ofs){if(nat.data[ofs] >= 0)return 1;return 0}
    function caml_int64_div(x,y){return x.div(y)}
    function caml_js_html_entities(s)
     {var entity=/^&#?[0-9a-zA-Z]+;$/;
      if(s.match(entity))
       {var str,temp=document.createElement("p");
        temp.innerHTML = s;
        str = temp.textContent || temp.innerText;
        temp = null;
        return str}
      else
       caml_failwith("Invalid entity " + s)}
    function caml_string_unsafe_set(s,i,c)
     {return caml_bytes_unsafe_set(s,i,c)}
    function caml_int64_of_float(x)
     {if(x < 0)x = Math.ceil(x);
      return new
              MlInt64
              (x & 0xffffff,
               Math.floor(x * caml_int64_offset) & 0xffffff,
               Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff)}
    function caml_ml_channel_size_64(chanid)
     {var chan=caml_ml_channels[chanid];
      return caml_int64_of_float(chan.file.length())}
    function caml_ba_set_2(ba,i0,i1,v){ba.set(ba.offset([i0,i1]),v);return 0}
    var
     caml_argv=
      function()
        {var g=globalThis,main="a.out",args=[];
         if(g.process && g.process.argv && g.process.argv.length > 1)
          {var argv=g.process.argv;main = argv[1];args = argv.slice(2)}
         var p=caml_string_of_jsstring(main),args2=[0,p];
         for(var i=0;i < args.length;i++)
          args2.push(caml_string_of_jsstring(args[i]));
         return args2}
       (),
     caml_executable_name=caml_argv[1];
    function caml_js_eval_string(s){return eval(caml_jsstring_of_string(s))}
    function serialize_nat(writer,nat,sz)
     {var len=nat.data.length;
      writer.write(32,len);
      for(var i=0;i < len;i++)writer.write(32,nat.data[i]);
      sz[0] = len * 4;
      sz[1] = len * 8}
    function caml_memprof_set(_control){return 0}
    function caml_sys_exit(code)
     {var g=globalThis;
      if(g.quit)g.quit(code);
      if(g.process && g.process.exit)g.process.exit(code);
      caml_invalid_argument("Function 'exit' not implemented")}
    function caml_channel_descriptor(chanid)
     {var chan=caml_ml_channels[chanid];return chan.fd}
    function caml_js_from_array(a){return a.slice(1)}
    function caml_ba_reshape(ba,vind)
     {vind = caml_js_from_array(vind);
      var new_dim=[],num_dims=vind.length;
      if(num_dims < 0 || num_dims > 16)
       caml_invalid_argument("Bigarray.reshape: bad number of dimensions");
      var num_elts=1;
      for(var i=0;i < num_dims;i++)
       {new_dim[i] = vind[i];
        if(new_dim[i] < 0)
         caml_invalid_argument("Bigarray.reshape: negative dimension");
        num_elts = num_elts * new_dim[i]}
      var size=caml_ba_get_size(ba.dims);
      if(num_elts != size)
       caml_invalid_argument("Bigarray.reshape: size mismatch");
      return caml_ba_create_unsafe(ba.kind,ba.layout,new_dim,ba.data)}
    var caml_oo_last_id=0;
    function caml_set_oo_id(b){b[2] = caml_oo_last_id++;return b}
    function caml_gr_fill_rect(x,y,w,h)
     {var s=caml_gr_state_get();
      s.context.fillRect(x,s.height - y,w,- h);
      return 0}
    function caml_bigstring_blit_string_to_ba(str1,pos1,ba2,pos2,len)
     {if(12 != ba2.kind)
       caml_invalid_argument
        ("caml_bigstring_blit_string_to_ba: kind mismatch");
      if(len == 0)return 0;
      var ofs2=ba2.offset(pos2);
      if(pos1 + len > caml_ml_string_length(str1))caml_array_bound_error();
      if(ofs2 + len > ba2.data.length)caml_array_bound_error();
      var slice=caml_array_of_string(str1).slice(pos1,pos1 + len);
      ba2.data.set(slice,ofs2);
      return 0}
    function caml_gr_set_window_title(name)
     {var s=caml_gr_state_get();
      s.title = name;
      var jsname=caml_jsstring_of_string(name);
      if(s.set_title)s.set_title(jsname);
      return 0}
    function caml_get_global_data(){return caml_global_data}
    function caml_int64_shift_right_unsigned(x,s)
     {return x.shift_right_unsigned(s)}
    function caml_ba_uint8_get16(ba,i0)
     {var ofs=ba.offset(i0);
      if(ofs + 1 >= ba.data.length)caml_array_bound_error();
      var b1=ba.get(ofs),b2=ba.get(ofs + 1);
      return b1 | b2 << 8}
    function caml_compare(a,b){return caml_compare_val(a,b,true)}
    function caml_fresh_oo_id(){return caml_oo_last_id++}
    function caml_int64_to_float(x){return x.toFloat()}
    function caml_ba_get_1(ba,i0){return ba.get(ba.offset(i0))}
    function caml_bigstring_memcmp(s1,pos1,s2,pos2,len)
     {for(var i=0;i < len;i++)
       {var a=caml_ba_get_1(s1,pos1 + i),b=caml_ba_get_1(s2,pos2 + i);
        if(a < b)return - 1;
        if(a > b)return 1}
      return 0}
    function caml_new_string(s){return caml_string_of_jsbytes(s)}
    function caml_erf_float(x)
     {var
       a1=0.254829592,
       a2=- 0.284496736,
       a3=1.421413741,
       a4=- 1.453152027,
       a5=1.061405429,
       p=0.3275911,
       sign=1;
      if(x < 0)sign = - 1;
      x = Math.abs(x);
      var
       t=1.0 / (1.0 + p * x),
       y=
        1.0
        -
        ((((a5 * t + a4) * t + a3) * t + a2) * t + a1)
        *
        t
        *
        Math.exp(- (x * x));
      return sign * y}
    function caml_ba_uint8_get32(ba,i0)
     {var ofs=ba.offset(i0);
      if(ofs + 3 >= ba.data.length)caml_array_bound_error();
      var
       b1=ba.get(ofs + 0),
       b2=ba.get(ofs + 1),
       b3=ba.get(ofs + 2),
       b4=ba.get(ofs + 3);
      return b1 << 0 | b2 << 8 | b3 << 16 | b4 << 24}
    function caml_raw_backtrace_length(){return 0}
    function caml_obj_block(tag,size)
     {var o=new Array(size + 1);
      o[0] = tag;
      for(var i=1;i <= size;i++)o[i] = 0;
      return o}
    function caml_gr_clear_graph()
     {var s=caml_gr_state_get();
      s.canvas.width = s.width;
      s.canvas.height = s.height;
      return 0}
    function bigstring_to_array_buffer(bs){return bs.data.buffer}
    function caml_sys_const_naked_pointers_checked(_unit){return 0}
    function lxor_digit_nat(nat1,ofs1,nat2,ofs2)
     {nat1.data[ofs1] ^= nat2.data[ofs2];return 0}
    function caml_obj_add_offset(v,offset)
     {caml_failwith("Obj.add_offset is not supported")}
    function caml_final_release(){return 0}
    function caml_js_to_array(a)
     {var len=a.length,b=new Array(len + 1);
      b[0] = 0;
      for(var i=0;i < len;i++)b[i + 1] = a[i];
      return b}
    function caml_gr_plot(x,y)
     {var
       s=caml_gr_state_get(),
       im=s.context.createImageData(1,1),
       d=im.data,
       color=s.color;
      d[0] = color >> 16 & 0xff;
      d[1] = color >> 8 & 0xff,d[2] = color >> 0 & 0xff;
      d[3] = 0xFF;
      s.x = x;
      s.y = y;
      s.context.putImageData(im,x,s.height - y);
      return 0}
    function caml_bytes_set16(s,i,i16)
     {if(i >>> 0 >= s.l - 1)caml_bytes_bound_error();
      var b2=0xFF & i16 >> 8,b1=0xFF & i16;
      caml_bytes_unsafe_set(s,i + 0,b1);
      caml_bytes_unsafe_set(s,i + 1,b2);
      return 0}
    function caml_string_set16(s,i,i16){return caml_bytes_set16(s,i,i16)}
    function caml_bytes_set64(s,i,i64)
     {if(i >>> 0 >= s.l - 7)caml_bytes_bound_error();
      var a=caml_int64_to_bytes(i64);
      for(var j=0;j < 8;j++)caml_bytes_unsafe_set(s,i + 7 - j,a[j]);
      return 0}
    function caml_int64_bswap(x)
     {var y=caml_int64_to_bytes(x);
      return caml_int64_of_bytes([y[7],y[6],y[5],y[4],y[3],y[2],y[1],y[0]])}
    function caml_fill_bytes(s,i,l,c)
     {if(l > 0)
       if(i == 0 && (l >= s.l || s.t == 2 && l >= s.c.length))
        if(c == 0)
         {s.c = "";s.t = 2}
        else
         {s.c = caml_str_repeat(l,String.fromCharCode(c));s.t = l == s.l?0:2}
       else
        {if(s.t != 4)caml_convert_bytes_to_array(s);
         for(l += i;i < l;i++)s.c[i] = c}
      return 0}
    var caml_fill_string=caml_fill_bytes;
    function caml_gc_major(){return 0}
    function caml_lex_array(s)
     {s = caml_jsbytes_of_string(s);
      var l=s.length / 2,a=new Array(l);
      for(var i=0;i < l;i++)
       a[i]
       =
       (s.charCodeAt(2 * i) | s.charCodeAt(2 * i + 1) << 8)
       <<
       16
       >>
       16;
      return a}
    function caml_lex_engine(tbl,start_state,lexbuf)
     {var
       lex_buffer=2,
       lex_buffer_len=3,
       lex_start_pos=5,
       lex_curr_pos=6,
       lex_last_pos=7,
       lex_last_action=8,
       lex_eof_reached=9,
       lex_base=1,
       lex_backtrk=2,
       lex_default=3,
       lex_trans=4,
       lex_check=5;
      if(! tbl.lex_default)
       {tbl.lex_base = caml_lex_array(tbl[lex_base]);
        tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]);
        tbl.lex_check = caml_lex_array(tbl[lex_check]);
        tbl.lex_trans = caml_lex_array(tbl[lex_trans]);
        tbl.lex_default = caml_lex_array(tbl[lex_default])}
      var c,state=start_state,buffer=caml_array_of_bytes(lexbuf[lex_buffer]);
      if(state >= 0)
       {lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];
        lexbuf[lex_last_action] = - 1}
      else
       state = - state - 1;
      for(;;)
       {var base=tbl.lex_base[state];
        if(base < 0)return - base - 1;
        var backtrk=tbl.lex_backtrk[state];
        if(backtrk >= 0)
         {lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];
          lexbuf[lex_last_action] = backtrk}
        if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len])
         if(lexbuf[lex_eof_reached] == 0)return - state - 1;else c = 256;
        else
         {c = buffer[lexbuf[lex_curr_pos]];lexbuf[lex_curr_pos]++}
        if(tbl.lex_check[base + c] == state)
         state = tbl.lex_trans[base + c];
        else
         state = tbl.lex_default[state];
        if(state < 0)
         {lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];
          if(lexbuf[lex_last_action] == - 1)
           caml_failwith("lexing: empty token");
          else
           return lexbuf[lex_last_action]}
        else
         if(c == 256)lexbuf[lex_eof_reached] = 0}}
    function unix_getuid(unit)
     {if(globalThis.process && globalThis.process.getuid)
       return globalThis.process.getuid();
      caml_raise_not_found()}
    function caml_sys_file_exists(name)
     {var root=resolve_fs_device(name);return root.device.exists(root.rest)}
    function caml_convert_raw_backtrace_slot()
     {caml_failwith("caml_convert_raw_backtrace_slot")}
    function caml_array_sub(a,i,len)
     {var a2=new Array(len + 1);
      a2[0] = 0;
      for(var i2=1,i1=i + 1;i2 <= len;i2++,i1++)a2[i2] = a[i1];
      return a2}
    function caml_bytes_equal(s1,s2)
     {if(s1 === s2)return 1;
      s1.t & 6 && caml_convert_string_to_bytes(s1);
      s2.t & 6 && caml_convert_string_to_bytes(s2);
      return s1.c == s2.c?1:0}
    function caml_gr_size_x(){var s=caml_gr_state_get();return s.width}
    function caml_ml_debug_info_status(){return 0}
    var
     os_type=
      globalThis.process
       &&
       globalThis.process.platform
       &&
       globalThis.process.platform
       ==
       "win32"
       ?"Cygwin"
       :"Unix";
    function caml_sys_const_ostype_cygwin(){return os_type == "Cygwin"?1:0}
    function caml_cosh_float(x){return Math.cosh(x)}
    var caml_ephe_key_offset=3;
    function caml_weak_check(x,i)
     {return x[caml_ephe_key_offset + i]
              !==
              undefined
              &&
              x[caml_ephe_key_offset + i]
              !==
              0
              ?1
              :0}
    var caml_ephe_check_key=caml_weak_check;
    function caml_hash_mix_final(h)
     {h ^= h >>> 16;
      h = caml_mul(h,0x85ebca6b | 0);
      h ^= h >>> 13;
      h = caml_mul(h,0xc2b2ae35 | 0);
      h ^= h >>> 16;
      return h}
    function caml_gr_text_size(txt)
     {var
       s=caml_gr_state_get(),
       w=s.context.measureText(caml_jsstring_of_string(txt)).width;
      return [0,w,s.text_size]}
    function caml_lex_run_mem(s,i,mem,curr_pos)
     {for(;;)
       {var dst=s.charCodeAt(i);
        i++;
        if(dst == 0xff)return;
        var src=s.charCodeAt(i);
        i++;
        if(src == 0xff)
         mem[dst + 1] = curr_pos;
        else
         mem[dst + 1] = mem[src + 1]}}
    function caml_lex_run_tag(s,i,mem)
     {for(;;)
       {var dst=s.charCodeAt(i);
        i++;
        if(dst == 0xff)return;
        var src=s.charCodeAt(i);
        i++;
        if(src == 0xff)mem[dst + 1] = - 1;else mem[dst + 1] = mem[src + 1]}}
    function caml_new_lex_engine(tbl,start_state,lexbuf)
     {var
       lex_buffer=2,
       lex_buffer_len=3,
       lex_start_pos=5,
       lex_curr_pos=6,
       lex_last_pos=7,
       lex_last_action=8,
       lex_eof_reached=9,
       lex_mem=10,
       lex_base=1,
       lex_backtrk=2,
       lex_default=3,
       lex_trans=4,
       lex_check=5,
       lex_base_code=6,
       lex_backtrk_code=7,
       lex_default_code=8,
       lex_trans_code=9,
       lex_check_code=10,
       lex_code=11;
      if(! tbl.lex_default)
       {tbl.lex_base = caml_lex_array(tbl[lex_base]);
        tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]);
        tbl.lex_check = caml_lex_array(tbl[lex_check]);
        tbl.lex_trans = caml_lex_array(tbl[lex_trans]);
        tbl.lex_default = caml_lex_array(tbl[lex_default])}
      if(! tbl.lex_default_code)
       {tbl.lex_base_code = caml_lex_array(tbl[lex_base_code]);
        tbl.lex_backtrk_code = caml_lex_array(tbl[lex_backtrk_code]);
        tbl.lex_check_code = caml_lex_array(tbl[lex_check_code]);
        tbl.lex_trans_code = caml_lex_array(tbl[lex_trans_code]);
        tbl.lex_default_code = caml_lex_array(tbl[lex_default_code])}
      if(tbl.lex_code == null)
       tbl.lex_code = caml_jsbytes_of_string(tbl[lex_code]);
      var c,state=start_state,buffer=caml_array_of_bytes(lexbuf[lex_buffer]);
      if(state >= 0)
       {lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];
        lexbuf[lex_last_action] = - 1}
      else
       state = - state - 1;
      for(;;)
       {var base=tbl.lex_base[state];
        if(base < 0)
         {var pc_off=tbl.lex_base_code[state];
          caml_lex_run_tag(tbl.lex_code,pc_off,lexbuf[lex_mem]);
          return - base - 1}
        var backtrk=tbl.lex_backtrk[state];
        if(backtrk >= 0)
         {var pc_off=tbl.lex_backtrk_code[state];
          caml_lex_run_tag(tbl.lex_code,pc_off,lexbuf[lex_mem]);
          lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];
          lexbuf[lex_last_action] = backtrk}
        if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len])
         if(lexbuf[lex_eof_reached] == 0)return - state - 1;else c = 256;
        else
         {c = buffer[lexbuf[lex_curr_pos]];lexbuf[lex_curr_pos]++}
        var pstate=state;
        if(tbl.lex_check[base + c] == state)
         state = tbl.lex_trans[base + c];
        else
         state = tbl.lex_default[state];
        if(state < 0)
         {lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];
          if(lexbuf[lex_last_action] == - 1)
           caml_failwith("lexing: empty token");
          else
           return lexbuf[lex_last_action]}
        else
         {var base_code=tbl.lex_base_code[pstate],pc_off;
          if(tbl.lex_check_code[base_code + c] == pstate)
           pc_off = tbl.lex_trans_code[base_code + c];
          else
           pc_off = tbl.lex_default_code[pstate];
          if(pc_off > 0)
           caml_lex_run_mem
            (tbl.lex_code,pc_off,lexbuf[lex_mem],lexbuf[lex_curr_pos]);
          if(c == 256)lexbuf[lex_eof_reached] = 0}}}
    function caml_ba_uint8_set64(ba,i0,v)
     {var ofs=ba.offset(i0);
      if(ofs + 7 >= ba.data.length)caml_array_bound_error();
      var v=caml_int64_to_bytes(v);
      for(var i=0;i < 8;i++)ba.set(ofs + i,v[7 - i]);
      return 0}
    function caml_sys_executable_name(a){return caml_executable_name}
    function caml_lessequal(x,y){return + (caml_compare_val(x,y,false) <= 0)}
    function caml_acosh_float(x){return Math.acosh(x)}
    function caml_ml_flush(chanid)
     {var chan=caml_ml_channels[chanid];
      if(! chan.opened)caml_raise_sys_error("Cannot flush a closed channel");
      if(! chan.buffer || chan.buffer == "")return 0;
      if
       (chan.fd
        &&
        caml_global_data.fds[chan.fd]
        &&
        caml_global_data.fds[chan.fd].output)
       {var output=caml_global_data.fds[chan.fd].output;
        switch(output.length)
         {case 2:output(chanid,chan.buffer);break;default:output(chan.buffer)}}
      chan.buffer = "";
      return 0}
    function caml_ml_seek_out_64(chanid,pos)
     {caml_ml_flush(chanid);
      caml_ml_channels[chanid].offset = caml_int64_to_float(pos);
      return 0}
    function compare_nat_real(nat1,nat2)
     {return compare_nat(nat1,0,nat1.data.length,nat2,0,nat2.data.length)}
    function caml_gc_set(_control){return 0}
    function caml_js_get(o,f){return o[f]}
    function caml_ml_set_buffered(c,v){return 0}
    function caml_gc_compaction(){return 0}
    function caml_weak_get(x,i)
     {if(i < 0 || caml_ephe_key_offset + i >= x.length)
       caml_invalid_argument("Weak.get_key");
      return x[caml_ephe_key_offset + i] === undefined
              ?0
              :x[caml_ephe_key_offset + i]}
    var caml_ephe_get_key=caml_weak_get;
    function caml_bigstring_blit_bytes_to_ba(str1,pos1,ba2,pos2,len)
     {if(12 != ba2.kind)
       caml_invalid_argument
        ("caml_bigstring_blit_string_to_ba: kind mismatch");
      if(len == 0)return 0;
      var ofs2=ba2.offset(pos2);
      if(pos1 + len > caml_ml_bytes_length(str1))caml_array_bound_error();
      if(ofs2 + len > ba2.data.length)caml_array_bound_error();
      var slice=caml_array_of_bytes(str1).slice(pos1,pos1 + len);
      ba2.data.set(slice,ofs2);
      return 0}
    function win_cleanup(){}
    function caml_sys_close(fd){delete caml_global_data.fds[fd];return 0}
    function caml_ml_close_channel(chanid)
     {var chan=caml_ml_channels[chanid];
      caml_ml_flush(chanid);
      chan.opened = false;
      chan.file.close();
      caml_sys_close(chan.fd);
      return 0}
    function caml_exn_with_js_backtrace(exn,force)
     {if(! exn.js_error || force || exn[0] == 248)
       exn.js_error
       =
       new (globalThis.Error)("Js exception containing backtrace");
      return exn}
    function caml_sys_isatty(_chan){return 0}
    function is_digit_zero(nat,ofs){if(nat.data[ofs] == 0)return 1;return 0}
    function unix_inet_addr_of_string(){return 0}
    function caml_js_set(o,f,v){o[f] = v;return 0}
    function caml_array_get(array,index)
     {if(index < 0 || index >= array.length - 1)caml_array_bound_error();
      return array[index + 1]}
    function caml_log2_float(x){return Math.log2(x)}
    function caml_gc_huge_fallback_count(unit){return 0}
    function caml_spacetime_only_works_for_native_code()
     {caml_failwith("Spacetime profiling only works for native code")}
    function caml_int64_sub(x,y){return x.sub(y)}
    function caml_ml_seek_in_64(chanid,pos)
     {var chan=caml_ml_channels[chanid];
      if(chan.refill != null)caml_raise_sys_error("Illegal seek");
      chan.offset = caml_int64_to_float(pos);
      return 0}
    function caml_int64_shift_left(x,s){return x.shift_left(s)}
    function caml_notequal(x,y){return + (caml_compare_val(x,y,false) != 0)}
    function caml_sys_const_int_size(){return 32}
    function caml_js_wrap_meth_callback(f)
     {return function()
       {var len=arguments.length,args=new Array(len + 1);
        args[0] = this;
        for(var i=0;i < len;i++)args[i + 1] = arguments[i];
        return caml_call_gen(f,args)}}
    function caml_is_js(){return 1}
    function caml_ba_dim(ba,i)
     {if(i < 0 || i >= ba.dims.length)caml_invalid_argument("Bigarray.dim");
      return ba.dims[i]}
    function caml_ba_dim_1(ba){return caml_ba_dim(ba,0)}
    function unix_localtime(t)
     {var
       d=new Date(t * 1000),
       d_num=d.getTime(),
       januaryfirst=new Date(d.getFullYear(),0,1).getTime(),
       doy=Math.floor((d_num - januaryfirst) / 86400000),
       jan=new Date(d.getFullYear(),0,1),
       jul=new Date(d.getFullYear(),6,1),
       stdTimezoneOffset=
        Math.max(jan.getTimezoneOffset(),jul.getTimezoneOffset());
      return [0,
              d.getSeconds(),
              d.getMinutes(),
              d.getHours(),
              d.getDate(),
              d.getMonth(),
              d.getFullYear() - 1900,
              d.getDay(),
              doy,
              d.getTimezoneOffset() < stdTimezoneOffset | 0]}
    function caml_js_meth_call(o,f,args)
     {return o[caml_jsstring_of_string(f)].apply(o,caml_js_from_array(args))}
    function caml_weak_create(n)
     {if(n < 0)caml_invalid_argument("Weak.create");
      var x=[251,"caml_ephe_list_head"];
      x.length = caml_ephe_key_offset + n;
      return x}
    var caml_ephe_create=caml_weak_create;
    function caml_js_to_byte_string(s){return caml_string_of_jsbytes(s)}
    function unix_mktime(tm)
     {var
       d=new Date(tm[6] + 1900,tm[5],tm[4],tm[3],tm[2],tm[1]).getTime(),
       t=Math.floor(d / 1000),
       tm2=unix_localtime(t);
      return [0,t,tm2]}
    function caml_trampoline(res)
     {var c=1;
      while(res && res.joo_tramp)
       {res = res.joo_tramp.apply(null,res.joo_args);c++}
      return res}
    function caml_bytes_get64(s,i)
     {if(i >>> 0 >= s.l - 7)caml_bytes_bound_error();
      var a=new Array(8);
      for(var j=0;j < 8;j++)a[7 - j] = caml_bytes_unsafe_get(s,i + j);
      return caml_int64_of_bytes(a)}
    function caml_weak_set(x,i,v)
     {if(i < 0 || caml_ephe_key_offset + i >= x.length)
       caml_invalid_argument("Weak.set");
      x[caml_ephe_key_offset + i] = v;
      return 0}
    function caml_sys_remove(name)
     {var root=resolve_fs_device(name),ok=root.device.unlink(root.rest);
      if(ok == 0)caml_raise_no_such_file(caml_jsbytes_of_string(name));
      return 0}
    function caml_string_bound_error()
     {caml_invalid_argument("index out of bounds")}
    function caml_string_get32(s,i)
     {if(i >>> 0 >= caml_ml_string_length(s) - 3)caml_string_bound_error();
      var
       b1=caml_string_unsafe_get(s,i),
       b2=caml_string_unsafe_get(s,i + 1),
       b3=caml_string_unsafe_get(s,i + 2),
       b4=caml_string_unsafe_get(s,i + 3);
      return b4 << 24 | b3 << 16 | b2 << 8 | b1}
    function caml_hypot_float(x,y){return Math.hypot(x,y)}
    function caml_js_call(f,o,args)
     {return f.apply(o,caml_js_from_array(args))}
    function caml_sys_const_max_wosize(){return 0x7FFFFFFF / 4 | 0}
    function caml_ephe_unset_key(x,i){return caml_weak_set(x,i,0)}
    function caml_hash_mix_bytes_arr(h,s)
     {var len=s.length,i,w;
      for(i = 0;i + 4 <= len;i += 4)
       {w = s[i] | s[i + 1] << 8 | s[i + 2] << 16 | s[i + 3] << 24;
        h = caml_hash_mix_int(h,w)}
      w = 0;
      switch(len & 3)
       {case 3:w = s[i + 2] << 16;
        case 2:w |= s[i + 1] << 8;
        case 1:w |= s[i];h = caml_hash_mix_int(h,w)
        }
      h ^= len;
      return h}
    function caml_hash_mix_jsbytes(h,s)
     {var len=s.length,i,w;
      for(i = 0;i + 4 <= len;i += 4)
       {w
        =
        s.charCodeAt(i)
        |
        s.charCodeAt(i + 1)
        <<
        8
        |
        s.charCodeAt(i + 2)
        <<
        16
        |
        s.charCodeAt(i + 3)
        <<
        24;
        h = caml_hash_mix_int(h,w)}
      w = 0;
      switch(len & 3)
       {case 3:w = s.charCodeAt(i + 2) << 16;
        case 2:w |= s.charCodeAt(i + 1) << 8;
        case 1:w |= s.charCodeAt(i);h = caml_hash_mix_int(h,w)
        }
      h ^= len;
      return h}
    function caml_ml_bytes_content(s)
     {switch(s.t & 6)
       {default:caml_convert_string_to_bytes(s);case 0:return s.c;
        case 4:return s.c
        }}
    function caml_hash_mix_bytes(h,v)
     {var content=caml_ml_bytes_content(v);
      return typeof content === "string"
              ?caml_hash_mix_jsbytes(h,content)
              :caml_hash_mix_bytes_arr(h,content)}
    function caml_bytes_lessthan(s1,s2)
     {s1.t & 6 && caml_convert_string_to_bytes(s1);
      s2.t & 6 && caml_convert_string_to_bytes(s2);
      return s1.c < s2.c?1:0}
    function caml_erfc_float(x){return 1 - caml_erf_float(x)}
    function caml_gr_fill_poly(ar)
     {var s=caml_gr_state_get();
      s.context.beginPath();
      s.context.moveTo(ar[1][1],s.height - ar[1][2]);
      for(var i=2;i < ar.length;i++)
       s.context.lineTo(ar[i][1],s.height - ar[i][2]);
      s.context.lineTo(ar[1][1],s.height - ar[1][2]);
      s.context.fill();
      return 0}
    function caml_gc_quick_stat(){return [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
    function caml_raise_end_of_file()
     {caml_raise_constant(caml_global_data.End_of_file)}
    function caml_ml_input_int(chanid)
     {var chan=caml_ml_channels[chanid],file=chan.file;
      while(chan.offset + 3 >= file.length())
       {var l=caml_ml_refill_input(chan);if(l == 0)caml_raise_end_of_file()}
      var
       o=chan.offset,
       r=
        file.read_one(o)
        <<
        24
        |
        file.read_one(o + 1)
        <<
        16
        |
        file.read_one(o + 2)
        <<
        8
        |
        file.read_one(o + 3);
      chan.offset += 4;
      return r}
    function caml_gr_display_mode()
     {caml_failwith("caml_gr_display_mode not Implemented")}
    function caml_obj_reachable_words(o){return 0}
    function nth_digit_nat(nat,ofs){return nat.data[ofs]}
    function caml_array_blit(a1,i1,a2,i2,len)
     {if(i2 <= i1)
       for(var j=1;j <= len;j++)a2[i2 + j] = a1[i1 + j];
      else
       for(var j=len;j >= 1;j--)a2[i2 + j] = a1[i1 + j];
      return 0}
    function caml_float_of_string(s)
     {var res;
      s = caml_jsbytes_of_string(s);
      res = + s;
      if(s.length > 0 && res === res)return res;
      s = s.replace(/_/g,"");
      res = + s;
      if(s.length > 0 && res === res || /^[+-]?nan$/i.test(s))return res;
      var m=/^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?/i.exec(s);
      if(m)
       {var
         m3=m[3].replace(/0+$/,""),
         mantissa=parseInt(m[1] + m[2] + m3,16),
         exponent=(m[5] | 0) - 4 * m3.length;
        res = mantissa * Math.pow(2,exponent);
        return res}
      if(/^\+?inf(inity)?$/i.test(s))return Infinity;
      if(/^-inf(inity)?$/i.test(s))return - Infinity;
      caml_failwith("float_of_string")}
    function caml_sys_getcwd()
     {return caml_string_of_jsbytes(caml_current_dir)}
    function caml_sys_const_big_endian(){return 0}
    function caml_list_to_js_array(l)
     {var a=[];for(;l !== 0;l = l[2])a.push(l[1]);return a}
    var
     caml_legacy_custom_code=false,
     caml_output_val=
      function()
        {function Writer(){this.chunk = []}
         Writer.prototype
         =
         {chunk_idx:20,
          block_len:0,
          obj_counter:0,
          size_32:0,
          size_64:0,
          write:
          function(size,value)
           {for(var i=size - 8;i >= 0;i -= 8)
             this.chunk[this.chunk_idx++] = value >> i & 0xFF},
          write_at:
          function(pos,size,value)
           {var pos=pos;
            for(var i=size - 8;i >= 0;i -= 8)
             this.chunk[pos++] = value >> i & 0xFF},
          write_code:
          function(size,code,value)
           {this.chunk[this.chunk_idx++] = code;
            for(var i=size - 8;i >= 0;i -= 8)
             this.chunk[this.chunk_idx++] = value >> i & 0xFF},
          write_shared:
          function(offset)
           {if(offset < 1 << 8)
             this.write_code(8,0x04,offset);
            else
             if(offset < 1 << 16)
              this.write_code(16,0x05,offset);
             else
              this.write_code(32,0x06,offset)},
          pos:function(){return this.chunk_idx},
          finalize:
          function()
           {this.block_len = this.chunk_idx - 20;
            this.chunk_idx = 0;
            this.write(32,0x8495A6BE);
            this.write(32,this.block_len);
            this.write(32,this.obj_counter);
            this.write(32,this.size_32);
            this.write(32,this.size_64);
            return this.chunk}};
         return function(v,flags)
          {flags = caml_list_to_js_array(flags);
           var
            no_sharing=flags.indexOf(0) !== - 1,
            closures=flags.indexOf(1) !== - 1;
           if(closures)
            globalThis.console.warn
             ("in caml_output_val: flag Marshal.Closures is not supported.");
           var
            writer=new Writer(),
            stack=[],
            intern_obj_table=no_sharing?null:new MlObjectTable();
           function memo(v)
            {if(no_sharing)return false;
             var existing_offset=intern_obj_table.recall(v);
             if(existing_offset)
              {writer.write_shared(existing_offset);return true}
             else
              {intern_obj_table.store(v);return false}}
           function extern_rec(v)
            {if(v.caml_custom)
              {if(memo(v))return;
               var
                name=v.caml_custom,
                ops=caml_custom_ops[name],
                sz_32_64=[0,0];
               if(! ops.serialize)
                caml_invalid_argument("output_value: abstract value (Custom)");
               if(caml_legacy_custom_code)
                {writer.write(8,0x12);
                 for(var i=0;i < name.length;i++)
                  writer.write(8,name.charCodeAt(i));
                 writer.write(8,0);
                 ops.serialize(writer,v,sz_32_64)}
               else
                if(ops.fixed_length == undefined)
                 {writer.write(8,0x18);
                  for(var i=0;i < name.length;i++)
                   writer.write(8,name.charCodeAt(i));
                  writer.write(8,0);
                  var header_pos=writer.pos();
                  for(var i=0;i < 12;i++)writer.write(8,0);
                  ops.serialize(writer,v,sz_32_64);
                  writer.write_at(header_pos,32,sz_32_64[0]);
                  writer.write_at(header_pos + 4,32,0);
                  writer.write_at(header_pos + 8,32,sz_32_64[1])}
                else
                 {writer.write(8,0x19);
                  for(var i=0;i < name.length;i++)
                   writer.write(8,name.charCodeAt(i));
                  writer.write(8,0);
                  var old_pos=writer.pos();
                  ops.serialize(writer,v,sz_32_64);
                  if(ops.fixed_length != writer.pos() - old_pos)
                   caml_failwith
                    ("output_value: incorrect fixed sizes specified by " + name)}
               writer.size_32 += 2 + (sz_32_64[0] + 3 >> 2);
               writer.size_64 += 2 + (sz_32_64[1] + 7 >> 3)}
             else
              if(v instanceof Array && v[0] === (v[0] | 0))
               {if(v[0] == 251)
                 caml_failwith("output_value: abstract value (Abstract)");
                if(v.length > 1 && memo(v))return;
                if(v[0] < 16 && v.length - 1 < 8)
                 writer.write(8,0x80 + v[0] + (v.length - 1 << 4));
                else
                 writer.write_code(32,0x08,v.length - 1 << 10 | v[0]);
                writer.size_32 += v.length;
                writer.size_64 += v.length;
                if(v.length > 1)stack.push(v,1)}
              else
               if(caml_is_ml_bytes(v))
                {if(! caml_is_ml_bytes(caml_string_of_jsbytes("")))
                  caml_failwith
                   ("output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]");
                 if(memo(v))return;
                 var len=caml_ml_bytes_length(v);
                 if(len < 0x20)
                  writer.write(8,0x20 + len);
                 else
                  if(len < 0x100)
                   writer.write_code(8,0x09,len);
                  else
                   writer.write_code(32,0x0A,len);
                 for(var i=0;i < len;i++)
                  writer.write(8,caml_bytes_unsafe_get(v,i));
                 writer.size_32 += 1 + ((len + 4) / 4 | 0);
                 writer.size_64 += 1 + ((len + 8) / 8 | 0)}
               else
                if(caml_is_ml_string(v))
                 {var len=caml_ml_string_length(v);
                  if(len < 0x20)
                   writer.write(8,0x20 + len);
                  else
                   if(len < 0x100)
                    writer.write_code(8,0x09,len);
                   else
                    writer.write_code(32,0x0A,len);
                  for(var i=0;i < len;i++)
                   writer.write(8,caml_string_unsafe_get(v,i));
                  writer.size_32 += 1 + ((len + 4) / 4 | 0);
                  writer.size_64 += 1 + ((len + 8) / 8 | 0)}
                else
                 if(v != (v | 0))
                  {var type_of_v=typeof v;
                   caml_failwith
                    ("output_value: abstract value (" + type_of_v + ")")}
                 else
                  if(v >= 0 && v < 0x40)
                   writer.write(8,0X40 + v);
                  else
                   if(v >= - (1 << 7) && v < 1 << 7)
                    writer.write_code(8,0x00,v);
                   else
                    if(v >= - (1 << 15) && v < 1 << 15)
                     writer.write_code(16,0x01,v);
                    else
                     writer.write_code(32,0x02,v)}
           extern_rec(v);
           while(stack.length > 0)
            {var i=stack.pop(),v=stack.pop();
             if(i + 1 < v.length)stack.push(v,i + 1);
             extern_rec(v[i])}
           if(intern_obj_table)
            writer.obj_counter = intern_obj_table.objs.length;
           writer.finalize();
           return writer.chunk}}
       ();
    function caml_string_of_array(a)
     {return caml_string_of_jsbytes(caml_subarray_to_jsbytes(a,0,a.length))}
    function caml_output_value_to_string(v,flags)
     {return caml_string_of_array(caml_output_val(v,flags))}
    function caml_raise_not_a_dir(name)
     {caml_raise_sys_error(name + ": Not a directory")}
    function caml_sys_system_command(cmd)
     {var cmd=caml_jsstring_of_string(cmd);
      if
       (typeof require
        !=
        "undefined"
        &&
        require("child_process")
        &&
        require("child_process").execSync)
       try
        {require("child_process").execSync(cmd,{stdio:"inherit"});return 0}
       catch(e){return 1}
      else
       return 127}
    function unix_isatty(fileDescriptor)
     {if(fs_node_supported())
       {var tty=require("tty");return tty.isatty(fileDescriptor)?1:0}
      else
       return 0}
    function caml_js_error_of_exception(exn)
     {if(exn.js_error)return exn.js_error;return null}
    function deserialize_nat(reader,sz)
     {var len=reader.read32s(),nat=new MlNat(len);
      for(var i=0;i < len;i++)nat.data[i] = reader.read32s();
      sz[0] = len * 4;
      return nat}
    function initialize_nat()
     {caml_custom_ops["_nat"]
      =
      {deserialize:deserialize_nat,serialize:serialize_nat,hash:caml_hash_nat}}
    function caml_gr_open_subwindow(a,b,c,d)
     {caml_failwith("caml_gr_open_subwindow not Implemented")}
    function unix_lstat(name)
     {var root=resolve_fs_device(name);
      if(! root.device.lstat)caml_failwith("unix_lstat: not implemented");
      return root.device.lstat(root.rest,true)}
    var unix_lstat_64=unix_lstat;
    function js_print_stdout(s)
     {var s=caml_utf16_of_utf8(s),g=globalThis;
      if(g.process && g.process.stdout && g.process.stdout.write)
       g.process.stdout.write(s);
      else
       {if(s.charCodeAt(s.length - 1) == 10)s = s.substr(0,s.length - 1);
        var v=g.console;
        v && v.log && v.log(s)}}
    function caml_copysign_float(x,y)
     {if(y == 0)y = 1 / y;x = Math.abs(x);return y < 0?- x:x}
    function caml_gr_set_text_size(size)
     {var s=caml_gr_state_get();
      s.text_size = size;
      s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font);
      return 0}
    var
     caml_md5_bytes=
      function()
        {function add(x,y){return x + y | 0}
         function xx(q,a,b,x,s,t)
          {a = add(add(a,q),add(x,t));return add(a << s | a >>> 32 - s,b)}
         function ff(a,b,c,d,x,s,t){return xx(b & c | ~ b & d,a,b,x,s,t)}
         function gg(a,b,c,d,x,s,t){return xx(b & d | c & ~ d,a,b,x,s,t)}
         function hh(a,b,c,d,x,s,t){return xx(b ^ c ^ d,a,b,x,s,t)}
         function ii(a,b,c,d,x,s,t){return xx(c ^ (b | ~ d),a,b,x,s,t)}
         function md5(buffer,length)
          {var i=length;
           buffer[i >> 2] |= 0x80 << 8 * (i & 3);
           for(i = (i & ~ 0x3) + 8;(i & 0x3F) < 60;i += 4)
            buffer[(i >> 2) - 1] = 0;
           buffer[(i >> 2) - 1] = length << 3;
           buffer[i >> 2] = length >> 29 & 0x1FFFFFFF;
           var w=[0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476];
           for(i = 0;i < buffer.length;i += 16)
            {var a=w[0],b=w[1],c=w[2],d=w[3];
             a = ff(a,b,c,d,buffer[i + 0],7,0xD76AA478);
             d = ff(d,a,b,c,buffer[i + 1],12,0xE8C7B756);
             c = ff(c,d,a,b,buffer[i + 2],17,0x242070DB);
             b = ff(b,c,d,a,buffer[i + 3],22,0xC1BDCEEE);
             a = ff(a,b,c,d,buffer[i + 4],7,0xF57C0FAF);
             d = ff(d,a,b,c,buffer[i + 5],12,0x4787C62A);
             c = ff(c,d,a,b,buffer[i + 6],17,0xA8304613);
             b = ff(b,c,d,a,buffer[i + 7],22,0xFD469501);
             a = ff(a,b,c,d,buffer[i + 8],7,0x698098D8);
             d = ff(d,a,b,c,buffer[i + 9],12,0x8B44F7AF);
             c = ff(c,d,a,b,buffer[i + 10],17,0xFFFF5BB1);
             b = ff(b,c,d,a,buffer[i + 11],22,0x895CD7BE);
             a = ff(a,b,c,d,buffer[i + 12],7,0x6B901122);
             d = ff(d,a,b,c,buffer[i + 13],12,0xFD987193);
             c = ff(c,d,a,b,buffer[i + 14],17,0xA679438E);
             b = ff(b,c,d,a,buffer[i + 15],22,0x49B40821);
             a = gg(a,b,c,d,buffer[i + 1],5,0xF61E2562);
             d = gg(d,a,b,c,buffer[i + 6],9,0xC040B340);
             c = gg(c,d,a,b,buffer[i + 11],14,0x265E5A51);
             b = gg(b,c,d,a,buffer[i + 0],20,0xE9B6C7AA);
             a = gg(a,b,c,d,buffer[i + 5],5,0xD62F105D);
             d = gg(d,a,b,c,buffer[i + 10],9,0x02441453);
             c = gg(c,d,a,b,buffer[i + 15],14,0xD8A1E681);
             b = gg(b,c,d,a,buffer[i + 4],20,0xE7D3FBC8);
             a = gg(a,b,c,d,buffer[i + 9],5,0x21E1CDE6);
             d = gg(d,a,b,c,buffer[i + 14],9,0xC33707D6);
             c = gg(c,d,a,b,buffer[i + 3],14,0xF4D50D87);
             b = gg(b,c,d,a,buffer[i + 8],20,0x455A14ED);
             a = gg(a,b,c,d,buffer[i + 13],5,0xA9E3E905);
             d = gg(d,a,b,c,buffer[i + 2],9,0xFCEFA3F8);
             c = gg(c,d,a,b,buffer[i + 7],14,0x676F02D9);
             b = gg(b,c,d,a,buffer[i + 12],20,0x8D2A4C8A);
             a = hh(a,b,c,d,buffer[i + 5],4,0xFFFA3942);
             d = hh(d,a,b,c,buffer[i + 8],11,0x8771F681);
             c = hh(c,d,a,b,buffer[i + 11],16,0x6D9D6122);
             b = hh(b,c,d,a,buffer[i + 14],23,0xFDE5380C);
             a = hh(a,b,c,d,buffer[i + 1],4,0xA4BEEA44);
             d = hh(d,a,b,c,buffer[i + 4],11,0x4BDECFA9);
             c = hh(c,d,a,b,buffer[i + 7],16,0xF6BB4B60);
             b = hh(b,c,d,a,buffer[i + 10],23,0xBEBFBC70);
             a = hh(a,b,c,d,buffer[i + 13],4,0x289B7EC6);
             d = hh(d,a,b,c,buffer[i + 0],11,0xEAA127FA);
             c = hh(c,d,a,b,buffer[i + 3],16,0xD4EF3085);
             b = hh(b,c,d,a,buffer[i + 6],23,0x04881D05);
             a = hh(a,b,c,d,buffer[i + 9],4,0xD9D4D039);
             d = hh(d,a,b,c,buffer[i + 12],11,0xE6DB99E5);
             c = hh(c,d,a,b,buffer[i + 15],16,0x1FA27CF8);
             b = hh(b,c,d,a,buffer[i + 2],23,0xC4AC5665);
             a = ii(a,b,c,d,buffer[i + 0],6,0xF4292244);
             d = ii(d,a,b,c,buffer[i + 7],10,0x432AFF97);
             c = ii(c,d,a,b,buffer[i + 14],15,0xAB9423A7);
             b = ii(b,c,d,a,buffer[i + 5],21,0xFC93A039);
             a = ii(a,b,c,d,buffer[i + 12],6,0x655B59C3);
             d = ii(d,a,b,c,buffer[i + 3],10,0x8F0CCC92);
             c = ii(c,d,a,b,buffer[i + 10],15,0xFFEFF47D);
             b = ii(b,c,d,a,buffer[i + 1],21,0x85845DD1);
             a = ii(a,b,c,d,buffer[i + 8],6,0x6FA87E4F);
             d = ii(d,a,b,c,buffer[i + 15],10,0xFE2CE6E0);
             c = ii(c,d,a,b,buffer[i + 6],15,0xA3014314);
             b = ii(b,c,d,a,buffer[i + 13],21,0x4E0811A1);
             a = ii(a,b,c,d,buffer[i + 4],6,0xF7537E82);
             d = ii(d,a,b,c,buffer[i + 11],10,0xBD3AF235);
             c = ii(c,d,a,b,buffer[i + 2],15,0x2AD7D2BB);
             b = ii(b,c,d,a,buffer[i + 9],21,0xEB86D391);
             w[0] = add(a,w[0]);
             w[1] = add(b,w[1]);
             w[2] = add(c,w[2]);
             w[3] = add(d,w[3])}
           var t=new Array(16);
           for(var i=0;i < 4;i++)
            for(var j=0;j < 4;j++)t[i * 4 + j] = w[i] >> 8 * j & 0xFF;
           return t}
         return function(s,ofs,len)
          {var buf=[],content=caml_ml_bytes_content(s);
           if(typeof content === "string")
            {var b=content;
             for(var i=0;i < len;i += 4)
              {var j=i + ofs;
               buf[i >> 2]
               =
               b.charCodeAt(j)
               |
               b.charCodeAt(j + 1)
               <<
               8
               |
               b.charCodeAt(j + 2)
               <<
               16
               |
               b.charCodeAt(j + 3)
               <<
               24}
             for(;i < len;i++)
              buf[i >> 2] |= b.charCodeAt(i + ofs) << 8 * (i & 3)}
           else
            {var a=content;
             for(var i=0;i < len;i += 4)
              {var j=i + ofs;
               buf[i >> 2]
               =
               a[j]
               |
               a[j + 1]
               <<
               8
               |
               a[j + 2]
               <<
               16
               |
               a[j + 3]
               <<
               24}
             for(;i < len;i++)buf[i >> 2] |= a[i + ofs] << 8 * (i & 3)}
           return caml_string_of_array(md5(buf,len))}}
       ();
    function caml_ba_set_generic(ba,i,v)
     {ba.set(ba.offset(caml_js_from_array(i)),v);return 0}
    function caml_ephe_set_key(x,i,v){return caml_weak_set(x,i,[0,v])}
    function caml_bytes_lessequal(s1,s2)
     {s1.t & 6 && caml_convert_string_to_bytes(s1);
      s2.t & 6 && caml_convert_string_to_bytes(s2);
      return s1.c <= s2.c?1:0}
    function caml_string_lessequal(s1,s2){return caml_bytes_lessequal(s1,s2)}
    function caml_string_greaterequal(s1,s2)
     {return caml_string_lessequal(s2,s1)}
    function caml_int64_add(x,y){return x.add(y)}
    function caml_nextafter_float(x,y)
     {if(isNaN(x) || isNaN(y))return NaN;
      if(x == y)return y;
      if(x == 0)return y < 0?- Math.pow(2,- 1074):Math.pow(2,- 1074);
      var bits=caml_int64_bits_of_float(x),one=caml_int64_of_int32(1);
      if(x < y == x > 0)
       bits = caml_int64_add(bits,one);
      else
       bits = caml_int64_sub(bits,one);
      return caml_int64_float_of_bits(bits)}
    function caml_gr_size_y(){var s=caml_gr_state_get();return s.height}
    function caml_ml_pos_in(chanid){return caml_ml_channels[chanid].offset}
    function caml_int64_and(x,y){return x.and(y)}
    function caml_sys_const_word_size(){return 32}
    function caml_std_output(chanid,s)
     {var
       chan=caml_ml_channels[chanid],
       str=caml_string_of_jsbytes(s),
       slen=caml_ml_string_length(str);
      chan.file.write(chan.offset,str,0,slen);
      chan.offset += slen;
      return 0}
    function js_print_stderr(s)
     {var s=caml_utf16_of_utf8(s),g=globalThis;
      if(g.process && g.process.stdout && g.process.stdout.write)
       g.process.stderr.write(s);
      else
       {if(s.charCodeAt(s.length - 1) == 10)s = s.substr(0,s.length - 1);
        var v=g.console;
        v && v.error && v.error(s)}}
    function caml_sys_open_internal(idx,output,file,flags)
     {if(caml_global_data.fds === undefined)
       caml_global_data.fds = new Array();
      flags = flags?flags:{};
      var info={};
      info.file = file;
      info.offset = flags.append?file.length():0;
      info.flags = flags;
      info.output = output;
      caml_global_data.fds[idx] = info;
      if(! caml_global_data.fd_last_idx || idx > caml_global_data.fd_last_idx)
       caml_global_data.fd_last_idx = idx;
      return idx}
    function caml_sys_open(name,flags,_perms)
     {var f={};
      while(flags)
       {switch(flags[1])
         {case 0:f.rdonly = 1;break;
          case 1:f.wronly = 1;break;
          case 2:f.append = 1;break;
          case 3:f.create = 1;break;
          case 4:f.truncate = 1;break;
          case 5:f.excl = 1;break;
          case 6:f.binary = 1;break;
          case 7:f.text = 1;break;
          case 8:f.nonblock = 1;break
          }
        flags = flags[2]}
      if(f.rdonly && f.wronly)
       caml_raise_sys_error
        (caml_jsbytes_of_string(name)
         +
         " : flags Open_rdonly and Open_wronly are not compatible");
      if(f.text && f.binary)
       caml_raise_sys_error
        (caml_jsbytes_of_string(name)
         +
         " : flags Open_text and Open_binary are not compatible");
      var
       root=resolve_fs_device(name),
       file=root.device.open(root.rest,f),
       idx=caml_global_data.fd_last_idx?caml_global_data.fd_last_idx:0;
      return caml_sys_open_internal(idx + 1,caml_std_output,file,f)}
    caml_sys_open_internal
     (0,caml_std_output,new MlFakeFile(caml_create_bytes(0)));
    caml_sys_open_internal
     (1,js_print_stdout,new MlFakeFile(caml_create_bytes(0)));
    caml_sys_open_internal
     (2,js_print_stderr,new MlFakeFile(caml_create_bytes(0)));
    function MlStringReader(s,i)
     {this.s = caml_jsbytes_of_string(s);this.i = i}
    MlStringReader.prototype
    =
    {read8u:function(){return this.s.charCodeAt(this.i++)},
     read8s:function(){return this.s.charCodeAt(this.i++) << 24 >> 24},
     read16u:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 2;
       return s.charCodeAt(i) << 8 | s.charCodeAt(i + 1)},
     read16s:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 2;
       return s.charCodeAt(i) << 24 >> 16 | s.charCodeAt(i + 1)},
     read32u:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 4;
       return (s.charCodeAt(i)
               <<
               24
               |
               s.charCodeAt(i + 1)
               <<
               16
               |
               s.charCodeAt(i + 2)
               <<
               8
               |
               s.charCodeAt(i + 3))
              >>>
              0},
     read32s:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 4;
       return s.charCodeAt(i)
              <<
              24
              |
              s.charCodeAt(i + 1)
              <<
              16
              |
              s.charCodeAt(i + 2)
              <<
              8
              |
              s.charCodeAt(i + 3)},
     readstr:
     function(len)
      {var i=this.i;
       this.i = i + len;
       return caml_string_of_jsbytes(this.s.substring(i,i + len))}};
    function caml_float_of_bytes(a)
     {return caml_int64_float_of_bits(caml_int64_of_bytes(a))}
    function caml_input_value_from_reader(reader,ofs)
     {var
       _magic=reader.read32u(),
       _block_len=reader.read32u(),
       num_objects=reader.read32u(),
       _size_32=reader.read32u(),
       _size_64=reader.read32u(),
       stack=[],
       intern_obj_table=num_objects > 0?[]:null,
       obj_counter=0;
      function intern_rec()
       {var code=reader.read8u();
        if(code >= 0x40)
         if(code >= 0x80)
          {var tag=code & 0xF,size=code >> 4 & 0x7,v=[tag];
           if(size == 0)return v;
           if(intern_obj_table)intern_obj_table[obj_counter++] = v;
           stack.push(v,size);
           return v}
         else
          return code & 0x3F;
        else
         if(code >= 0x20)
          {var len=code & 0x1F,v=reader.readstr(len);
           if(intern_obj_table)intern_obj_table[obj_counter++] = v;
           return v}
         else
          switch(code)
           {case 0x00:return reader.read8s();
            case 0x01:return reader.read16s();
            case 0x02:return reader.read32s();
            case 0x03:caml_failwith("input_value: integer too large");break;
            case 0x04:
             var offset=reader.read8u();
             return intern_obj_table[obj_counter - offset];
            case 0x05:
             var offset=reader.read16u();
             return intern_obj_table[obj_counter - offset];
            case 0x06:
             var offset=reader.read32u();
             return intern_obj_table[obj_counter - offset];
            case 0x08:
             var
              header=reader.read32u(),
              tag=header & 0xFF,
              size=header >> 10,
              v=[tag];
             if(size == 0)return v;
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             stack.push(v,size);
             return v;
            case 0x13:
             caml_failwith("input_value: data block too large");break;
            case 0x09:
             var len=reader.read8u(),v=reader.readstr(len);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             return v;
            case 0x0A:
             var len=reader.read32u(),v=reader.readstr(len);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             return v;
            case 0x0C:
             var t=new Array(8);
             for(var i=0;i < 8;i++)t[7 - i] = reader.read8u();
             var v=caml_float_of_bytes(t);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             return v;
            case 0x0B:
             var t=new Array(8);
             for(var i=0;i < 8;i++)t[i] = reader.read8u();
             var v=caml_float_of_bytes(t);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             return v;
            case 0x0E:
             var len=reader.read8u(),v=new Array(len + 1);
             v[0] = 254;
             var t=new Array(8);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             for(var i=1;i <= len;i++)
              {for(var j=0;j < 8;j++)t[7 - j] = reader.read8u();
               v[i] = caml_float_of_bytes(t)}
             return v;
            case 0x0D:
             var len=reader.read8u(),v=new Array(len + 1);
             v[0] = 254;
             var t=new Array(8);
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             for(var i=1;i <= len;i++)
              {for(var j=0;j < 8;j++)t[j] = reader.read8u();
               v[i] = caml_float_of_bytes(t)}
             return v;
            case 0x07:
             var len=reader.read32u(),v=new Array(len + 1);
             v[0] = 254;
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             var t=new Array(8);
             for(var i=1;i <= len;i++)
              {for(var j=0;j < 8;j++)t[7 - j] = reader.read8u();
               v[i] = caml_float_of_bytes(t)}
             return v;
            case 0x0F:
             var len=reader.read32u(),v=new Array(len + 1);
             v[0] = 254;
             var t=new Array(8);
             for(var i=1;i <= len;i++)
              {for(var j=0;j < 8;j++)t[j] = reader.read8u();
               v[i] = caml_float_of_bytes(t)}
             return v;
            case 0x10:
            case 0x11:caml_failwith("input_value: code pointer");break;
            case 0x12:
            case 0x18:
            case 0x19:
             var c,s="";
             while((c = reader.read8u()) != 0)s += String.fromCharCode(c);
             var ops=caml_custom_ops[s],expected_size;
             if(! ops)
              caml_failwith("input_value: unknown custom block identifier");
             switch(code)
              {case 0x12:break;
               case 0x19:
                if(! ops.fixed_length)
                 caml_failwith
                  ("input_value: expected a fixed-size custom block");
                expected_size = ops.fixed_length;
                break;
               case 0x18:
                expected_size = reader.read32u();
                reader.read32s();
                reader.read32s();
                break
               }
             var old_pos=reader.i,size=[0],v=ops.deserialize(reader,size);
             if(expected_size != undefined)
              if(expected_size != size[0])
               caml_failwith
                ("input_value: incorrect length of serialized custom block");
             if(intern_obj_table)intern_obj_table[obj_counter++] = v;
             return v;
            default:caml_failwith("input_value: ill-formed message")}}
      var res=intern_rec();
      while(stack.length > 0)
       {var size=stack.pop(),v=stack.pop(),d=v.length;
        if(d < size)stack.push(v,size);
        v[d] = intern_rec()}
      if(typeof ofs != "number")ofs[0] = reader.i;
      return res}
    function caml_string_of_bytes(s){return s}
    function caml_input_value_from_bytes(s,ofs)
     {var
       reader=
        new
         MlStringReader
         (caml_string_of_bytes(s),typeof ofs == "number"?ofs:ofs[0]);
      return caml_input_value_from_reader(reader,ofs)}
    function caml_string_get(s,i)
     {if(i >>> 0 >= caml_ml_string_length(s))caml_string_bound_error();
      return caml_string_unsafe_get(s,i)}
    var
     re_match=
      function()
        {var
          re_word_letters=
           [0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0xFF,
            0x03,
            0xFE,
            0xFF,
            0xFF,
            0x87,
            0xFE,
            0xFF,
            0xFF,
            0x07,
            0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0x00,
            0xFF,
            0xFF,
            0x7F,
            0xFF,
            0xFF,
            0xFF,
            0x7F,
            0xFF],
          opcodes=
           {CHAR:0,
            CHARNORM:1,
            STRING:2,
            STRINGNORM:3,
            CHARCLASS:4,
            BOL:5,
            EOL:6,
            WORDBOUNDARY:7,
            BEGGROUP:8,
            ENDGROUP:9,
            REFGROUP:10,
            ACCEPT:11,
            SIMPLEOPT:12,
            SIMPLESTAR:13,
            SIMPLEPLUS:14,
            GOTO:15,
            PUSHBACK:16,
            SETMARK:17,
            CHECKPROGRESS:18};
         function is_word_letter(c)
          {return re_word_letters[c >> 3] >> (c & 7) & 1}
         function in_bitset(s,i)
          {return caml_string_get(s,i >> 3) >> (i & 7) & 1}
         function re_match_impl(re,s,pos,partial)
          {var
            prog=caml_js_from_array(re[1]),
            cpool=caml_js_from_array(re[2]),
            normtable=caml_jsbytes_of_string(re[3]),
            numgroups=re[4] | 0,
            numregisters=re[5] | 0,
            startchars=re[6] | 0,
            s=caml_array_of_string(s),
            pc=0,
            quit=false,
            stack=[],
            groups=new Array(numgroups),
            re_register=new Array(numregisters);
           for(var i=0;i < groups.length;i++)groups[i] = {start:- 1,end:- 1};
           groups[0].start = pos;
           function backtrack()
            {while(stack.length)
              {var item=stack.pop();
               if(item.undo)
                item.undo.obj[item.undo.prop] = item.undo.value;
               else
                if(item.pos){pc = item.pos.pc;pos = item.pos.txt;return}}
             quit = true}
           function push(item){stack.push(item)}
           function accept()
            {groups[0].end = pos;
             var result=new Array(1 + groups.length * 2);
             result[0] = 0;
             for(var i=0;i < groups.length;i++)
              {var g=groups[i];
               if(g.start < 0 || g.end < 0)g.start = g.end = - 1;
               result[2 * i + 1] = g.start;
               result[2 * i + 1 + 1] = g.end}
             return result}
           function prefix_match()
            {if(partial)return accept();else backtrack()}
           while(! quit)
            {var
              op=prog[pc] & 0xff,
              sarg=prog[pc] >> 8,
              uarg=sarg & 0xff,
              c=s[pos],
              group;
             pc++;
             switch(op)
              {case opcodes.CHAR:
                if(pos === s.length){prefix_match();break}
                if(c === uarg)pos++;else backtrack();
                break;
               case opcodes.CHARNORM:
                if(pos === s.length){prefix_match();break}
                if(normtable.charCodeAt(c) === uarg)pos++;else backtrack();
                break;
               case opcodes.STRING:
                for
                 (var arg=caml_jsbytes_of_string(cpool[uarg]),i=0;
                  i
                  <
                  arg.length;
                  i++)
                 {if(pos === s.length){prefix_match();break}
                  if(c === arg.charCodeAt(i))
                   c = s[++pos];
                  else
                   {backtrack();break}}
                break;
               case opcodes.STRINGNORM:
                for
                 (var arg=caml_jsbytes_of_string(cpool[uarg]),i=0;
                  i
                  <
                  arg.length;
                  i++)
                 {if(pos === s.length){prefix_match();break}
                  if(normtable.charCodeAt(c) === arg.charCodeAt(i))
                   c = s[++pos];
                  else
                   {backtrack();break}}
                break;
               case opcodes.CHARCLASS:
                if(pos === s.length){prefix_match();break}
                if(in_bitset(cpool[uarg],c))pos++;else backtrack();
                break;
               case opcodes.BOL:
                if(pos > 0 && s[pos - 1] != 10)backtrack();break;
               case opcodes.EOL:
                if(pos < s.length && s[pos] != 10)backtrack();break;
               case opcodes.WORDBOUNDARY:
                if(pos == 0)
                 {if(pos === s.length){prefix_match();break}
                  if(is_word_letter(s[0]))break;
                  backtrack()}
                else
                 if(pos === s.length)
                  {if(is_word_letter(s[pos - 1]))break;backtrack()}
                 else
                  {if(is_word_letter(s[pos - 1]) != is_word_letter(s[pos]))
                    break;
                   backtrack()}
                break;
               case opcodes.BEGGROUP:
                group = groups[uarg];
                push({undo:{obj:group,prop:"start",value:group.start}});
                group.start = pos;
                break;
               case opcodes.ENDGROUP:
                group = groups[uarg];
                push({undo:{obj:group,prop:"end",value:group.end}});
                group.end = pos;
                break;
               case opcodes.REFGROUP:
                group = groups[uarg];
                if(group.start < 0 || group.end < 0){backtrack();break}
                for(var i=group.start;i < group.end;i++)
                 {if(pos === s.length){prefix_match();break}
                  if(s[i] != s[pos]){backtrack();break}
                  pos++}
                break;
               case opcodes.SIMPLEOPT:if(in_bitset(cpool[uarg],c))pos++;break;
               case opcodes.SIMPLESTAR:
                while(in_bitset(cpool[uarg],c))c = s[++pos];break;
               case opcodes.SIMPLEPLUS:
                if(pos === s.length){prefix_match();break}
                if(in_bitset(cpool[uarg],c))
                 do c = s[++pos];while(in_bitset(cpool[uarg],c));
                else
                 backtrack();
                break;
               case opcodes.ACCEPT:return accept();
               case opcodes.GOTO:pc = pc + sarg;break;
               case opcodes.PUSHBACK:push({pos:{pc:pc + sarg,txt:pos}});break;
               case opcodes.SETMARK:
                push
                 ({undo:{obj:re_register,prop:uarg,value:re_register[uarg]}});
                re_register[uarg] = pos;
                break;
               case opcodes.CHECKPROGRESS:
                if(re_register[uarg] === pos)backtrack();break;
               default:throw new Error("Invalid bytecode")}}
           return 0}
         return re_match_impl}
       ();
    function re_search_backward(re,s,pos)
     {if(pos < 0 || pos > caml_ml_string_length(s))
       caml_invalid_argument("Str.search_backward");
      while(pos >= 0){var res=re_match(re,s,pos,0);if(res)return res;pos--}
      return [0]}
    function caml_js_from_string(s){return caml_jsstring_of_string(s)}
    function caml_ba_sub(ba,ofs,len)
     {var changed_dim,mul=1;
      if(ba.layout == 0)
       {for(var i=1;i < ba.dims.length;i++)mul = mul * ba.dims[i];
        changed_dim = 0}
      else
       {for(var i=0;i < ba.dims.length - 1;i++)mul = mul * ba.dims[i];
        changed_dim = ba.dims.length - 1;
        ofs = ofs - 1}
      if(ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim])
       caml_invalid_argument("Bigarray.sub: bad sub-array");
      var new_dims=[];
      for(var i=0;i < ba.dims.length;i++)new_dims[i] = ba.dims[i];
      new_dims[changed_dim] = len;
      mul *= caml_ba_get_size_per_element(ba.kind);
      var new_data=ba.data.subarray(ofs * mul,(ofs + len) * mul);
      return caml_ba_create_unsafe(ba.kind,ba.layout,new_dims,new_data)}
    function caml_gc_full_major(){return 0}
    function caml_bytes_set32(s,i,i32)
     {if(i >>> 0 >= s.l - 3)caml_bytes_bound_error();
      var
       b4=0xFF & i32 >> 24,
       b3=0xFF & i32 >> 16,
       b2=0xFF & i32 >> 8,
       b1=0xFF & i32;
      caml_bytes_unsafe_set(s,i + 0,b1);
      caml_bytes_unsafe_set(s,i + 1,b2);
      caml_bytes_unsafe_set(s,i + 2,b3);
      caml_bytes_unsafe_set(s,i + 3,b4);
      return 0}
    function caml_gr_sigio_signal(){return 0}
    function caml_ba_uint8_set32(ba,i0,v)
     {var ofs=ba.offset(i0);
      if(ofs + 3 >= ba.data.length)caml_array_bound_error();
      ba.set(ofs + 0,v & 0xff);
      ba.set(ofs + 1,v >>> 8 & 0xff);
      ba.set(ofs + 2,v >>> 16 & 0xff);
      ba.set(ofs + 3,v >>> 24 & 0xff);
      return 0}
    function caml_sys_const_ostype_unix(){return os_type == "Unix"?1:0}
    function caml_signbit_float(x){if(x == 0)x = 1 / x;return x < 0?1:0}
    function caml_gr_set_line_width(w)
     {var s=caml_gr_state_get();
      s.line_width = w;
      s.context.lineWidth = w;
      return 0}
    function caml_gr_set_font(f)
     {var s=caml_gr_state_get();
      s.font = f;
      s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font);
      return 0}
    function caml_gr_set_color(color)
     {var s=caml_gr_state_get();
      function convert(number)
       {var str="" + number.toString(16);
        while(str.length < 2)str = "0" + str;
        return str}
      var r=color >> 16 & 0xff,g=color >> 8 & 0xff,b=color >> 0 & 0xff;
      s.color = color;
      var c_str="#" + convert(r) + convert(g) + convert(b);
      s.context.fillStyle = c_str;
      s.context.strokeStyle = c_str;
      return 0}
    function caml_gr_moveto(x,y)
     {var s=caml_gr_state_get();s.x = x;s.y = y;return 0}
    function caml_gr_resize_window(w,h)
     {var s=caml_gr_state_get();
      s.width = w;
      s.height = h;
      s.canvas.width = w;
      s.canvas.height = h;
      return 0}
    function caml_gr_state_init()
     {caml_gr_moveto(caml_gr_state.x,caml_gr_state.y);
      caml_gr_resize_window(caml_gr_state.width,caml_gr_state.height);
      caml_gr_set_line_width(caml_gr_state.line_width);
      caml_gr_set_text_size(caml_gr_state.text_size);
      caml_gr_set_font(caml_gr_state.font);
      caml_gr_set_color(caml_gr_state.color);
      caml_gr_set_window_title(caml_gr_state.title);
      caml_gr_state.context.textBaseline = "bottom"}
    function caml_gr_current_x(){var s=caml_gr_state_get();return s.x}
    function caml_ba_kind_of_typed_array(ta)
     {var g=globalThis,kind;
      if(ta instanceof g.Float32Array)
       kind = 0;
      else
       if(ta instanceof g.Float64Array)
        kind = 1;
       else
        if(ta instanceof g.Int8Array)
         kind = 2;
        else
         if(ta instanceof g.Uint8Array)
          kind = 3;
         else
          if(ta instanceof g.Int16Array)
           kind = 4;
          else
           if(ta instanceof g.Uint16Array)
            kind = 5;
           else
            if(ta instanceof g.Int32Array)
             kind = 6;
            else
             if(ta instanceof g.Uint32Array)
              kind = 6;
             else
              caml_invalid_argument
               ("caml_ba_kind_of_typed_array: unsupported kind");
      return kind}
    function caml_ba_from_typed_array(ta)
     {var kind=caml_ba_kind_of_typed_array(ta);
      return caml_ba_create_unsafe(kind,0,[ta.length],ta)}
    function caml_ml_seek_out(chanid,pos)
     {caml_ml_flush(chanid);caml_ml_channels[chanid].offset = pos;return 0}
    function caml_js_typeof(o){return typeof o}
    function caml_restore_raw_backtrace(exn,bt){return 0}
    function caml_gr_lineto(x,y)
     {var s=caml_gr_state_get();
      s.context.beginPath();
      s.context.moveTo(s.x,s.height - s.y);
      s.context.lineTo(x,s.height - y);
      s.context.stroke();
      s.x = x;
      s.y = y;
      return 0}
    function caml_js_wrap_meth_callback_unsafe(f)
     {return function()
       {var len=arguments.length,args=new Array(len + 1);
        args[0] = this;
        for(var i=0;i < len;i++)args[i + 1] = arguments[i];
        return f.apply(null,args)}}
    function caml_ba_dim_3(ba){return caml_ba_dim(ba,2)}
    function caml_is_special_exception(exn)
     {switch(exn[2]){case - 8:case - 11:case - 12:return 1;default:return 0}}
    function caml_format_exception(exn)
     {var r="";
      if(exn[0] == 0)
       {r += exn[1][1];
        if
         (exn.length
          ==
          3
          &&
          exn[2][0]
          ==
          0
          &&
          caml_is_special_exception(exn[1]))
         var bucket=exn[2],start=1;
        else
         var start=2,bucket=exn;
        r += "(";
        for(var i=start;i < bucket.length;i++)
         {if(i > start)r += ", ";
          var v=bucket[i];
          if(typeof v == "number")
           r += v.toString();
          else
           if(v instanceof MlBytes)
            r += '"' + v.toString() + '"';
           else
            if(typeof v == "string")
             r += '"' + v.toString() + '"';
            else
             r += "_"}
        r += ")"}
      else
       if(exn[0] == 248)r += exn[1];
      return r}
    function caml_fatal_uncaught_exception(err)
     {if(err instanceof Array && (err[0] == 0 || err[0] == 248))
       {var handler=caml_named_value("Printexc.handle_uncaught_exception");
        if(handler)
         handler(err,false);
        else
         {var
           msg=caml_format_exception(err),
           at_exit=caml_named_value("Pervasives.do_at_exit");
          if(at_exit)at_exit(0);
          globalThis.console.error("Fatal error: exception " + msg + "\n")}}
      else
       throw err}
    var caml_ephe_data_offset=2;
    function caml_ephe_check_data(x)
     {return x[caml_ephe_data_offset] === undefined?0:1}
    function caml_bytes_get16(s,i)
     {if(i >>> 0 >= s.l - 1)caml_bytes_bound_error();
      var b1=caml_bytes_unsafe_get(s,i),b2=caml_bytes_unsafe_get(s,i + 1);
      return b2 << 8 | b1}
    function caml_obj_make_forward(b,v){b[0] = 250;b[1] = v;return 0}
    function caml_js_from_bool(x){return ! ! x}
    function caml_ml_set_channel_name(){return 0}
    function caml_exp2_float(x){return Math.pow(2,x)}
    function caml_gr_close_graph()
     {var s=caml_gr_state_get();
      s.canvas.width = 0;
      s.canvas.height = 0;
      return 0}
    function caml_create_string(len)
     {if(len < 0)caml_invalid_argument("String.create");
      return new MlBytes(len?2:9,"",len)}
    function caml_md5_string(s,ofs,len)
     {return caml_md5_bytes(caml_bytes_of_string(s),ofs,len)}
    function caml_md5_chan(chanid,len)
     {var chan=caml_ml_channels[chanid],chan_len=chan.file.length();
      if(len < 0)len = chan_len - chan.offset;
      if(chan.offset + len > chan_len)caml_raise_end_of_file();
      var buf=caml_create_bytes(len);
      chan.file.read(chan.offset,buf,0,len);
      return caml_md5_string(caml_string_of_bytes(buf),0,len)}
    function caml_obj_dup(x)
     {var l=x.length,a=new Array(l);
      for(var i=0;i < l;i++)a[i] = x[i];
      return a}
    function caml_weak_get_copy(x,i)
     {if(i < 0 || caml_ephe_key_offset + i >= x.length)
       caml_invalid_argument("Weak.get_copy");
      var y=caml_weak_get(x,i);
      if(y === 0)return y;
      var z=y[1];
      if(z instanceof Array)return [0,caml_obj_dup(z)];
      return y}
    function caml_atanh_float(x){return Math.atanh(x)}
    function caml_ml_output_bytes(chanid,buffer,offset,len)
     {var chan=caml_ml_channels[chanid];
      if(! chan.opened)
       caml_raise_sys_error("Cannot output to a closed channel");
      var bytes;
      if(offset == 0 && caml_ml_bytes_length(buffer) == len)
       bytes = buffer;
      else
       {bytes = caml_create_bytes(len);
        caml_blit_bytes(buffer,offset,bytes,0,len)}
      var
       string=caml_string_of_bytes(bytes),
       jsstring=caml_jsbytes_of_string(string),
       id=jsstring.lastIndexOf("\n");
      if(id < 0)
       chan.buffer += jsstring;
      else
       {chan.buffer += jsstring.substr(0,id + 1);
        caml_ml_flush(chanid);
        chan.buffer += jsstring.substr(id + 1)}
      return 0}
    function caml_ml_output(chanid,buffer,offset,len)
     {return caml_ml_output_bytes
              (chanid,caml_bytes_of_string(buffer),offset,len)}
    function caml_ephe_get_data(x)
     {return x[caml_ephe_data_offset] === undefined
              ?0
              :[0,x[caml_ephe_data_offset]]}
    function caml_xmlhttprequest_create(unit)
     {var g=globalThis;
      if(typeof g.XMLHttpRequest !== "undefined")
       try {return new (g.XMLHttpRequest)()}catch(e){}
      if(typeof g.activeXObject !== "undefined")
       {try {return new (g.activeXObject)("Msxml2.XMLHTTP")}catch(e){}
        try {return new (g.activeXObject)("Msxml3.XMLHTTP")}catch(e){}
        try {return new (g.activeXObject)("Microsoft.XMLHTTP")}catch(e){}}
      caml_failwith("Cannot create a XMLHttpRequest")}
    function caml_trampoline_return(f,args)
     {return {joo_tramp:f,joo_args:args}}
    function caml_ml_is_buffered(c){return 1}
    function caml_array_append(a1,a2)
     {var l1=a1.length,l2=a2.length,l=l1 + l2 - 1,a=new Array(l);
      a[0] = 0;
      var i=1,j=1;
      for(;i < l1;i++)a[i] = a1[i];
      for(;i < l;i++,j++)a[i] = a2[j];
      return a}
    function caml_ml_set_channel_refill(chanid,f)
     {caml_ml_channels[chanid].refill = f;return 0}
    function caml_js_expr(s)
     {js_print_stderr("caml_js_expr: fallback to runtime evaluation\n");
      return eval(caml_jsstring_of_string(s))}
    function caml_int64_mul(x,y){return x.mul(y)}
    function caml_ml_runtime_warnings_enabled(_unit)
     {return caml_runtime_warnings}
    function caml_output_value_to_bytes(v,flags)
     {return caml_bytes_of_array(caml_output_val(v,flags))}
    function caml_eventlog_resume(unit){return 0}
    function caml_hash_univ_param(count,limit,obj)
     {var hash_accu=0;
      function hash_aux(obj)
       {limit--;
        if(count < 0 || limit < 0)return;
        if(obj instanceof Array && obj[0] === (obj[0] | 0))
         switch(obj[0])
          {case 248:count--;hash_accu = hash_accu * 65599 + obj[2] | 0;break;
           case 250:limit++;hash_aux(obj);break;
           default:
            count--;
            hash_accu = hash_accu * 19 + obj[0] | 0;
            for(var i=obj.length - 1;i > 0;i--)hash_aux(obj[i])}
        else
         if(caml_is_ml_bytes(obj))
          {count--;
           var content=caml_ml_bytes_content(obj);
           if(typeof content === "string")
            for(var b=content,l=b.length,i=0;i < l;i++)
             hash_accu = hash_accu * 19 + b.charCodeAt(i) | 0;
           else
            for(var a=content,l=a.length,i=0;i < l;i++)
             hash_accu = hash_accu * 19 + a[i] | 0}
         else
          if(caml_is_ml_string(obj))
           {var jsbytes=caml_jsbytes_of_string(obj);
            for(var b=jsbytes,l=jsbytes.length,i=0;i < l;i++)
             hash_accu = hash_accu * 19 + b.charCodeAt(i) | 0}
          else
           if(typeof obj === "string")
            for(var b=obj,l=obj.length,i=0;i < l;i++)
             hash_accu = hash_accu * 19 + b.charCodeAt(i) | 0;
           else
            if(obj === (obj | 0))
             {count--;hash_accu = hash_accu * 65599 + obj | 0}
            else
             if(obj === + obj)
              {count--;
               var p=caml_int64_to_bytes(caml_int64_bits_of_float(obj));
               for(var i=7;i >= 0;i--)hash_accu = hash_accu * 19 + p[i] | 0}
             else
              if(obj && obj.caml_custom)
               if
                (caml_custom_ops[obj.caml_custom]
                 &&
                 caml_custom_ops[obj.caml_custom].hash)
                {var h=caml_custom_ops[obj.caml_custom].hash(obj) | 0;
                 hash_accu = hash_accu * 65599 + h | 0}}
      hash_aux(obj);
      return hash_accu & 0x3FFFFFFF}
    function caml_string_equal(s1,s2){return caml_bytes_equal(s1,s2)}
    function caml_output_value_to_buffer(s,ofs,len,v,flags)
     {var t=caml_output_val(v,flags);
      if(t.length > len)caml_failwith("Marshal.to_buffer: buffer overflow");
      caml_blit_bytes(t,0,s,ofs,t.length);
      return 0}
    function re_replacement_text(repl,groups,orig)
     {var
       repl=caml_jsbytes_of_string(repl),
       len=repl.length,
       orig=caml_jsbytes_of_string(orig),
       res="",
       n=0,
       cur,
       start,
       end,
       c;
      while(n < len)
       {cur = repl.charAt(n++);
        if(cur != "\\")
         res += cur;
        else
         {if(n == len)
           caml_failwith("Str.replace: illegal backslash sequence");
          cur = repl.charAt(n++);
          switch(cur)
           {case "\\":res += cur;break;
            case "0":
            case "1":
            case "2":
            case "3":
            case "4":
            case "5":
            case "6":
            case "7":
            case "8":
            case "9":
             c = + cur;
             if(c * 2 >= groups.length - 1)
              caml_failwith("Str.replace: reference to unmatched group");
             start = caml_array_get(groups,c * 2);
             end = caml_array_get(groups,c * 2 + 1);
             if(start == - 1)
              caml_failwith("Str.replace: reference to unmatched group");
             res += orig.slice(start,end);
             break;
            default:res += "\\" + cur}}}
      return caml_string_of_jsbytes(res)}
    function caml_pure_js_expr(s)
     {js_print_stderr("caml_pure_js_expr: fallback to runtime evaluation\n");
      return eval(caml_jsstring_of_string(s))}
    function blit_nat(nat1,ofs1,nat2,ofs2,len)
     {for(var i=0;i < len;i++)nat1.data[ofs1 + i] = nat2.data[ofs2 + i];
      return 0}
    function caml_int64_ult(x,y){return x.ucompare(y) < 0}
    function caml_int64_xor(x,y){return x.xor(y)}
    function caml_bigstring_blit_ba_to_bytes(ba1,pos1,bytes2,pos2,len)
     {if(12 != ba1.kind)
       caml_invalid_argument
        ("caml_bigstring_blit_string_to_ba: kind mismatch");
      if(len == 0)return 0;
      var ofs1=ba1.offset(pos1);
      if(ofs1 + len > ba1.data.length)caml_array_bound_error();
      if(pos2 + len > caml_ml_bytes_length(bytes2))caml_array_bound_error();
      var slice=ba1.data.slice(ofs1,ofs1 + len);
      caml_blit_bytes(caml_bytes_of_array(slice),0,bytes2,pos2,len);
      return 0}
    function caml_register_named_value(nm,v)
     {caml_named_values[caml_jsbytes_of_string(nm)] = v;return 0}
    function jsoo_create_file_extern(name,content)
     {if(globalThis.jsoo_create_file)
       globalThis.jsoo_create_file(name,content);
      else
       {if(! globalThis.caml_fs_tmp)globalThis.caml_fs_tmp = [];
        globalThis.caml_fs_tmp.push({name:name,content:content})}
      return 0}
    function caml_to_js_string(s){return caml_jsstring_of_string(s)}
    function caml_parse_sign_and_base(s)
     {var i=0,len=caml_ml_string_length(s),base=10,sign=1;
      if(len > 0)
       switch(caml_string_unsafe_get(s,i))
        {case 45:i++;sign = - 1;break;case 43:i++;sign = 1;break}
      if(i + 1 < len && caml_string_unsafe_get(s,i) == 48)
       switch(caml_string_unsafe_get(s,i + 1))
        {case 120:
         case 88:base = 16;i += 2;break;
         case 111:
         case 79:base = 8;i += 2;break;
         case 98:
         case 66:base = 2;i += 2;break;
         case 117:
         case 85:i += 2;break
         }
      return [i,sign,base]}
    function caml_parse_digit(c)
     {if(c >= 48 && c <= 57)return c - 48;
      if(c >= 65 && c <= 90)return c - 55;
      if(c >= 97 && c <= 122)return c - 87;
      return - 1}
    function caml_int64_of_string(s)
     {var
       r=caml_parse_sign_and_base(s),
       i=r[0],
       sign=r[1],
       base=r[2],
       base64=caml_int64_of_int32(base),
       threshold=
        new MlInt64(0xffffff,0xfffffff,0xffff).udivmod(base64).quotient,
       c=caml_string_unsafe_get(s,i),
       d=caml_parse_digit(c);
      if(d < 0 || d >= base)caml_failwith("int_of_string");
      var res=caml_int64_of_int32(d);
      for(;;)
       {i++;
        c = caml_string_unsafe_get(s,i);
        if(c == 95)continue;
        d = caml_parse_digit(c);
        if(d < 0 || d >= base)break;
        if(caml_int64_ult(threshold,res))caml_failwith("int_of_string");
        d = caml_int64_of_int32(d);
        res = caml_int64_add(caml_int64_mul(base64,res),d);
        if(caml_int64_ult(res,d))caml_failwith("int_of_string")}
      if(i != caml_ml_string_length(s))caml_failwith("int_of_string");
      if(base == 10 && caml_int64_ult(new MlInt64(0,0,0x8000),res))
       caml_failwith("int_of_string");
      if(sign < 0)res = caml_int64_neg(res);
      return res}
    function re_search_forward(re,s,pos)
     {if(pos < 0 || pos > caml_ml_string_length(s))
       caml_invalid_argument("Str.search_forward");
      while(pos <= caml_ml_string_length(s))
       {var res=re_match(re,s,pos,0);if(res)return res;pos++}
      return [0]}
    var caml_blit_string_to_bigstring=caml_bigstring_blit_string_to_ba;
    function caml_make_vect(len,init)
     {if(len < 0)caml_array_bound_error();
      var len=len + 1 | 0,b=new Array(len);
      b[0] = 0;
      for(var i=1;i < len;i++)b[i] = init;
      return b}
    function caml_ml_seek_in(chanid,pos)
     {var chan=caml_ml_channels[chanid];
      if(chan.refill != null)caml_raise_sys_error("Illegal seek");
      chan.offset = pos;
      return 0}
    function caml_sys_read_directory(name)
     {var
       root=resolve_fs_device(name),
       a=root.device.readdir(root.rest),
       l=new Array(a.length + 1);
      l[0] = 0;
      for(var i=0;i < a.length;i++)l[i + 1] = caml_string_of_jsbytes(a[i]);
      return l}
    function caml_ml_output_char(chanid,c)
     {var s=caml_string_of_jsbytes(String.fromCharCode(c));
      caml_ml_output(chanid,s,0,1);
      return 0}
    function caml_sys_const_ostype_win32(){return os_type == "Win32"?1:0}
    function caml_obj_is_block(x){return + (x instanceof Array)}
    function caml_ml_input_char(chanid)
     {var chan=caml_ml_channels[chanid];
      caml_ml_may_refill_input(chanid);
      if(chan.offset >= chan.file.length())caml_raise_end_of_file();
      var res=chan.file.read_one(chan.offset);
      chan.offset++;
      return res}
    function caml_obj_set_raw_field(o,i,v){return o[i + 1] = v}
    function caml_js_var(x)
     {var x=caml_jsstring_of_string(x);
      if(! x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/))
       js_print_stderr
        ('caml_js_var: "'
         +
         x
         +
         '" is not a valid JavaScript variable. continuing ..');
      return eval(x)}
    function caml_trunc_float(x){return Math.trunc(x)}
    function caml_ephe_blit_data(src,dst)
     {dst[caml_ephe_data_offset] = src[caml_ephe_data_offset];return 0}
    function caml_is_printable(c){return + (c > 31 && c < 127)}
    function caml_equal(x,y){return + (caml_compare_val(x,y,false) == 0)}
    function re_partial_match(re,s,pos)
     {if(pos < 0 || pos > caml_ml_string_length(s))
       caml_invalid_argument("Str.partial_match");
      var res=re_match(re,s,pos,1);
      return res?res:[0]}
    function caml_sys_random_seed()
     {if(globalThis.crypto)
       if(typeof globalThis.crypto.getRandomValues === "function")
        {var a=new (globalThis.Uint32Array)(1);
         globalThis.crypto.getRandomValues(a);
         return [0,a[0]]}
       else
        if(globalThis.crypto.randomBytes === "function")
         {var
           buff=globalThis.crypto.randomBytes(4),
           a=new (globalThis.Uint32Array)(buff);
          return [0,a[0]]}
      var now=new Date().getTime(),x=now ^ 0xffffffff * Math.random();
      return [0,x]}
    function caml_final_register_called_without_value(){return 0}
    function caml_ba_get_2(ba,i0,i1){return ba.get(ba.offset([i0,i1]))}
    function win_handle_fd(x){return x}
    function caml_ba_uint8_set16(ba,i0,v)
     {var ofs=ba.offset(i0);
      if(ofs + 1 >= ba.data.length)caml_array_bound_error();
      ba.set(ofs + 0,v & 0xff);
      ba.set(ofs + 1,v >>> 8 & 0xff);
      return 0}
    var win_filedescr_of_channel=caml_channel_descriptor;
    function caml_js_delete(o,f){delete o[f];return 0}
    function caml_int_of_string(s)
     {var
       r=caml_parse_sign_and_base(s),
       i=r[0],
       sign=r[1],
       base=r[2],
       len=caml_ml_string_length(s),
       threshold=- 1 >>> 0,
       c=i < len?caml_string_unsafe_get(s,i):0,
       d=caml_parse_digit(c);
      if(d < 0 || d >= base)caml_failwith("int_of_string");
      var res=d;
      for(i++;i < len;i++)
       {c = caml_string_unsafe_get(s,i);
        if(c == 95)continue;
        d = caml_parse_digit(c);
        if(d < 0 || d >= base)break;
        res = base * res + d;
        if(res > threshold)caml_failwith("int_of_string")}
      if(i != len)caml_failwith("int_of_string");
      res = sign * res;
      if(base == 10 && (res | 0) != res)caml_failwith("int_of_string");
      return res | 0}
    function caml_list_mount_point()
     {var prev=0;
      for(var i=0;i < jsoo_mount_point.length;i++)
       {var old=prev;
        prev = [0,caml_string_of_jsbytes(jsoo_mount_point[i].path),old]}
      return prev}
    var
     caml_marshal_constants=
      {PREFIX_SMALL_BLOCK:0x80,
       PREFIX_SMALL_INT:0x40,
       PREFIX_SMALL_STRING:0x20,
       CODE_INT8:0x00,
       CODE_INT16:0x01,
       CODE_INT32:0x02,
       CODE_INT64:0x03,
       CODE_SHARED8:0x04,
       CODE_SHARED16:0x05,
       CODE_SHARED32:0x06,
       CODE_BLOCK32:0x08,
       CODE_BLOCK64:0x13,
       CODE_STRING8:0x09,
       CODE_STRING32:0x0A,
       CODE_DOUBLE_BIG:0x0B,
       CODE_DOUBLE_LITTLE:0x0C,
       CODE_DOUBLE_ARRAY8_BIG:0x0D,
       CODE_DOUBLE_ARRAY8_LITTLE:0x0E,
       CODE_DOUBLE_ARRAY32_BIG:0x0F,
       CODE_DOUBLE_ARRAY32_LITTLE:0x07,
       CODE_CODEPOINTER:0x10,
       CODE_INFIXPOINTER:0x11,
       CODE_CUSTOM:0x12,
       CODE_CUSTOM_LEN:0x18,
       CODE_CUSTOM_FIXED:0x19};
    function caml_obj_raw_field(o,i){return o[i + 1]}
    function caml_js_equals(x,y){return + (x == y)}
    function bigstring_to_typed_array(bs){return bs.data}
    function caml_gr_arc_aux(ctx,cx,cy,ry,rx,a1,a2)
     {while(a1 > a2)a2 += 360;
      a1 /= 180;
      a2 /= 180;
      var
       rot=0,
       xPos,
       yPos,
       xPos_prev,
       yPos_prev,
       space=2,
       num=(a2 - a1) * Math.PI * ((rx + ry) / 2) / space | 0,
       delta=(a2 - a1) * Math.PI / num,
       i=a1 * Math.PI;
      for(var j=0;j <= num;j++)
       {xPos
        =
        cx
        -
        rx
        *
        Math.sin(i)
        *
        Math.sin(rot * Math.PI)
        +
        ry
        *
        Math.cos(i)
        *
        Math.cos(rot * Math.PI);
        xPos = xPos.toFixed(2);
        yPos
        =
        cy
        +
        ry
        *
        Math.cos(i)
        *
        Math.sin(rot * Math.PI)
        +
        rx
        *
        Math.sin(i)
        *
        Math.cos(rot * Math.PI);
        yPos = yPos.toFixed(2);
        if(j == 0)
         ctx.moveTo(xPos,yPos);
        else
         if(xPos_prev != xPos || yPos_prev != yPos)ctx.lineTo(xPos,yPos);
        xPos_prev = xPos;
        yPos_prev = yPos;
        i -= delta}
      return 0}
    function caml_gr_fill_arc(x,y,rx,ry,a1,a2)
     {var s=caml_gr_state_get();
      s.context.beginPath();
      caml_gr_arc_aux(s.context,x,s.height - y,rx,ry,a1,a2);
      s.context.fill();
      return 0}
    function caml_ba_slice(ba,vind)
     {vind = caml_js_from_array(vind);
      var num_inds=vind.length,index=[],sub_dims=[],ofs;
      if(num_inds > ba.dims.length)
       caml_invalid_argument("Bigarray.slice: too many indices");
      if(ba.layout == 0)
       {for(var i=0;i < num_inds;i++)index[i] = vind[i];
        for(;i < ba.dims.length;i++)index[i] = 0;
        sub_dims = ba.dims.slice(num_inds)}
      else
       {for(var i=0;i < num_inds;i++)
         index[ba.dims.length - num_inds + i] = vind[i];
        for(var i=0;i < ba.dims.length - num_inds;i++)index[i] = 1;
        sub_dims = ba.dims.slice(0,ba.dims.length - num_inds)}
      ofs = ba.offset(index);
      var
       size=caml_ba_get_size(sub_dims),
       size_per_element=caml_ba_get_size_per_element(ba.kind),
       new_data=
        ba.data.subarray
         (ofs * size_per_element,(ofs + size) * size_per_element);
      return caml_ba_create_unsafe(ba.kind,ba.layout,sub_dims,new_data)}
    function caml_marshal_data_size(s,ofs)
     {function get32(s,i)
       {return caml_bytes_unsafe_get(s,i)
               <<
               24
               |
               caml_bytes_unsafe_get(s,i + 1)
               <<
               16
               |
               caml_bytes_unsafe_get(s,i + 2)
               <<
               8
               |
               caml_bytes_unsafe_get(s,i + 3)}
      if(get32(s,ofs) != (0x8495A6BE | 0))
       caml_failwith("Marshal.data_size: bad object");
      return get32(s,ofs + 4)}
    function caml_input_value(chanid)
     {var chan=caml_ml_channels[chanid],buf=caml_create_bytes(8);
      chan.file.read(chan.offset,buf,0,8);
      var len=caml_marshal_data_size(buf,0) + 20,buf=caml_create_bytes(len);
      chan.file.read(chan.offset,buf,0,len);
      var offset=[0],res=caml_input_value_from_bytes(buf,offset);
      chan.offset = chan.offset + offset[0];
      return res}
    function caml_ba_kind(ba){return ba.kind}
    function caml_js_fun_call(f,a)
     {switch(a.length)
       {case 1:return f();
        case 2:return f(a[1]);
        case 3:return f(a[1],a[2]);
        case 4:return f(a[1],a[2],a[3]);
        case 5:return f(a[1],a[2],a[3],a[4]);
        case 6:return f(a[1],a[2],a[3],a[4],a[5]);
        case 7:return f(a[1],a[2],a[3],a[4],a[5],a[6]);
        case 8:return f(a[1],a[2],a[3],a[4],a[5],a[6],a[7])
        }
      return f.apply(null,caml_js_from_array(a))}
    function caml_gc_major_slice(work){return 0}
    function caml_js_pure_expr(f){return f()}
    function compare_digits_nat(nat1,ofs1,nat2,ofs2)
     {if(nat1.data[ofs1] > nat2.data[ofs2])return 1;
      if(nat1.data[ofs1] < nat2.data[ofs2])return - 1;
      return 0}
    function caml_ml_input(chanid,s,i,l)
     {var chan=caml_ml_channels[chanid],l2=chan.file.length() - chan.offset;
      if(l2 == 0 && chan.refill != null)l2 = caml_ml_refill_input(chan);
      if(l2 < l)l = l2;
      chan.file.read(chan.offset,s,i,l);
      chan.offset += l;
      return l}
    function caml_gr_wait_event(_evl)
     {caml_failwith
       ("caml_gr_wait_event not Implemented: use Graphics_js instead")}
    function caml_gr_sigio_handler(){return 0}
    function caml_hash_mix_bigstring(h,bs)
     {return caml_hash_mix_bytes_arr(h,bs.data)}
    function caml_record_backtrace(){return 0}
    function unix_gmtime(t)
     {var
       d=new Date(t * 1000),
       d_num=d.getTime(),
       januaryfirst=new Date(Date.UTC(d.getUTCFullYear(),0,1)).getTime(),
       doy=Math.floor((d_num - januaryfirst) / 86400000);
      return [0,
              d.getUTCSeconds(),
              d.getUTCMinutes(),
              d.getUTCHours(),
              d.getUTCDate(),
              d.getUTCMonth(),
              d.getUTCFullYear() - 1900,
              d.getUTCDay(),
              doy,
              false | 0]}
    function caml_sys_const_backend_type()
     {return [0,caml_string_of_jsbytes("js_of_ocaml")]}
    function caml_sys_get_config()
     {return [0,caml_string_of_jsbytes(os_type),32,0]}
    function unix_time(){return Math.floor(unix_gettimeofday())}
    function caml_ml_out_channels_list()
     {var l=0;
      for(var c=0;c < caml_ml_channels.length;c++)
       if
        (caml_ml_channels[c]
         &&
         caml_ml_channels[c].opened
         &&
         caml_ml_channels[c].out)
        l = [0,caml_ml_channels[c].fd,l];
      return l}
    function caml_asinh_float(x){return Math.asinh(x)}
    function bigstring_of_array_buffer(ab)
     {var ta=new (globalThis.Uint8Array)(ab);
      return caml_ba_create_unsafe(12,0,[ta.length],ta)}
    function caml_mod(x,y){if(y == 0)caml_raise_zero_divide();return x % y}
    function caml_ba_init(){return 0}
    function re_string_match(re,s,pos)
     {if(pos < 0 || pos > caml_ml_string_length(s))
       caml_invalid_argument("Str.string_match");
      var res=re_match(re,s,pos,0);
      return res?res:[0]}
    function BigStringReader(bs,i){this.s = bs;this.i = i}
    BigStringReader.prototype
    =
    {read8u:function(){return caml_ba_get_1(this.s,this.i++)},
     read8s:function(){return caml_ba_get_1(this.s,this.i++) << 24 >> 24},
     read16u:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 2;
       return caml_ba_get_1(s,i) << 8 | caml_ba_get_1(s,i + 1)},
     read16s:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 2;
       return caml_ba_get_1(s,i) << 24 >> 16 | caml_ba_get_1(s,i + 1)},
     read32u:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 4;
       return (caml_ba_get_1(s,i)
               <<
               24
               |
               caml_ba_get_1(s,i + 1)
               <<
               16
               |
               caml_ba_get_1(s,i + 2)
               <<
               8
               |
               caml_ba_get_1(s,i + 3))
              >>>
              0},
     read32s:
     function()
      {var s=this.s,i=this.i;
       this.i = i + 4;
       return caml_ba_get_1(s,i)
              <<
              24
              |
              caml_ba_get_1(s,i + 1)
              <<
              16
              |
              caml_ba_get_1(s,i + 2)
              <<
              8
              |
              caml_ba_get_1(s,i + 3)},
     readstr:
     function(len)
      {var i=this.i,arr=new Array(len);
       for(var j=0;j < len;j++)arr[j] = caml_ba_get_1(this.s,i + j);
       this.i = i + len;
       return caml_string_of_array(arr)}};
    function caml_gr_dump_image(im)
     {var data=[0];
      for(var i=0;i < im.height;i++)
       {data[i + 1] = [0];
        for(var j=0;j < im.width;j++)
         {var
           o=i * (im.width * 4) + j * 4,
           r=im.data[o + 0],
           g=im.data[o + 1],
           b=im.data[o + 2];
          data[i + 1][j + 1] = (r << 16) + (g << 8) + b}}
      return data}
    function caml_ba_get_generic(ba,i)
     {var ofs=ba.offset(caml_js_from_array(i));return ba.get(ofs)}
    function caml_get_exception_backtrace(){return 0}
    function caml_format_float(fmt,x)
     {function toFixed(x,dp)
       {if(Math.abs(x) < 1.0)
         return x.toFixed(dp);
        else
         {var e=parseInt(x.toString().split("+")[1]);
          if(e > 20)
           {e -= 20;
            x /= Math.pow(10,e);
            x += new Array(e + 1).join("0");
            if(dp > 0)x = x + "." + new Array(dp + 1).join("0");
            return x}
          else
           return x.toFixed(dp)}}
      var s,f=caml_parse_format(fmt),prec=f.prec < 0?6:f.prec;
      if(x < 0 || x == 0 && 1 / x == - Infinity){f.sign = - 1;x = - x}
      if(isNaN(x))
       {s = "nan";f.filler = " "}
      else
       if(! isFinite(x))
        {s = "inf";f.filler = " "}
       else
        switch(f.conv)
         {case "e":
           var s=x.toExponential(prec),i=s.length;
           if(s.charAt(i - 3) == "e")
            s = s.slice(0,i - 1) + "0" + s.slice(i - 1);
           break;
          case "f":s = toFixed(x,prec);break;
          case "g":
           prec = prec?prec:1;
           s = x.toExponential(prec - 1);
           var j=s.indexOf("e"),exp=+ s.slice(j + 1);
           if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec)
            {var i=j - 1;
             while(s.charAt(i) == "0")i--;
             if(s.charAt(i) == ".")i--;
             s = s.slice(0,i + 1) + s.slice(j);
             i = s.length;
             if(s.charAt(i - 3) == "e")
              s = s.slice(0,i - 1) + "0" + s.slice(i - 1);
             break}
           else
            {var p=prec;
             if(exp < 0)
              {p -= exp + 1;s = x.toFixed(p)}
             else
              while(s = x.toFixed(p),s.length > prec + 1)p--;
             if(p)
              {var i=s.length - 1;
               while(s.charAt(i) == "0")i--;
               if(s.charAt(i) == ".")i--;
               s = s.slice(0,i + 1)}}
           break
          }
      return caml_finish_formatting(f,s)}
    function caml_mount_autoload(name,f)
     {var path=caml_make_path(name),name=caml_trailing_slash(path.join("/"));
      jsoo_mount_point.push({path:name,device:new MlFakeDevice(name,f)});
      return 0}
    function caml_bigstring_blit_ba_to_ba(ba1,pos1,ba2,pos2,len)
     {if(12 != ba1.kind)
       caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch");
      if(12 != ba2.kind)
       caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch");
      if(len == 0)return 0;
      var ofs1=ba1.offset(pos1),ofs2=ba2.offset(pos2);
      if(ofs1 + len > ba1.data.length)caml_array_bound_error();
      if(ofs2 + len > ba2.data.length)caml_array_bound_error();
      var slice=ba1.data.subarray(ofs1,ofs1 + len);
      ba2.data.set(slice,pos2);
      return 0}
    var caml_blit_bigstring_to_bigstring=caml_bigstring_blit_ba_to_ba;
    function caml_string_lessthan(s1,s2){return caml_bytes_lessthan(s1,s2)}
    function caml_string_greaterthan(s1,s2)
     {return caml_string_lessthan(s2,s1)}
    function caml_div(x,y)
     {if(y == 0)caml_raise_zero_divide();return x / y | 0}
    function caml_ephe_get_data_copy(x)
     {return x[caml_ephe_data_offset] === undefined
              ?0
              :[0,caml_obj_dup(x[caml_ephe_data_offset])]}
    function caml_memprof_start(rate,stack_size,tracker){return 0}
    function caml_sys_get_argv(a){return [0,caml_argv[1],caml_argv]}
    function caml_js_to_bool(x){return + x}
    function caml_gr_create_image(x,y)
     {var s=caml_gr_state_get();return s.context.createImageData(x,y)}
    var caml_ephe_get_key_copy=caml_weak_get_copy;
    function caml_lessthan(x,y){return + (caml_compare_val(x,y,false) < 0)}
    function caml_raw_backtrace_next_slot(){return 0}
    function caml_register_global(n,v,name_opt)
     {if(name_opt && globalThis.toplevelReloc)
       n = globalThis.toplevelReloc(name_opt);
      caml_global_data[n + 1] = v;
      if(name_opt)caml_global_data[name_opt] = v}
    function mult_nat(nat1,ofs1,len1,nat2,ofs2,len2,nat3,ofs3,len3)
     {var carry=0;
      for(var i=0;i < len3;i++)
       carry
       +=
       mult_digit_nat(nat1,ofs1 + i,len1 - i,nat2,ofs2,len2,nat3,ofs3 + i);
      return carry}
    function square_nat(nat1,ofs1,len1,nat2,ofs2,len2)
     {var carry=0;
      carry += add_nat(nat1,ofs1,len1,nat1,ofs1,len1,0);
      carry += mult_nat(nat1,ofs1,len1,nat2,ofs2,len2,nat2,ofs2,len2);
      return carry}
    function caml_js_from_float(x){return x}
    function caml_floatarray_create(len)
     {if(len < 0)caml_array_bound_error();
      var len=len + 1 | 0,b=new Array(len);
      b[0] = 254;
      for(var i=1;i < len;i++)b[i] = 0;
      return b}
    function caml_gc_stat(){return [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
    function caml_get_major_credit(n){return 0}
    function caml_sys_modify_argv(arg){caml_argv = arg;return 0}
    var caml_method_cache=[];
    function caml_get_public_method(obj,tag,cacheid)
     {var meths=obj[1],ofs=caml_method_cache[cacheid];
      if(ofs === undefined)
       for(var i=caml_method_cache.length;i < cacheid;i++)
        caml_method_cache[i] = 0;
      else
       if(meths[ofs] === tag)return meths[ofs - 1];
      var li=3,hi=meths[1] * 2 + 1,mi;
      while(li < hi)
       {mi = li + hi >> 1 | 1;if(tag < meths[mi + 1])hi = mi - 2;else li = mi}
      caml_method_cache[cacheid] = li + 1;
      return tag == meths[li + 1]?meths[li]:0}
    function caml_js_get_console()
     {var
       c=globalThis.console?globalThis.console:{},
       m=
        ["log",
         "debug",
         "info",
         "warn",
         "error",
         "assert",
         "dir",
         "dirxml",
         "trace",
         "group",
         "groupCollapsed",
         "groupEnd",
         "time",
         "timeEnd"];
      function f(){}
      for(var i=0;i < m.length;i++)if(! c[m[i]])c[m[i]] = f;
      return c}
    function caml_sys_unsafe_getenv(name){return caml_sys_getenv(name)}
    function caml_ml_open_descriptor_in(fd)
     {var data=caml_global_data.fds[fd];
      if(data.flags.wronly)caml_raise_sys_error("fd " + fd + " is writeonly");
      var refill=null;
      if(fd == 0 && fs_node_supported())
       {var fs=require("fs");
        refill
        =
        function(){return caml_string_of_jsstring(fs.readFileSync(0,"utf8"))}}
      var
       channel=
        {file:data.file,
         offset:data.offset,
         fd:fd,
         opened:true,
         out:false,
         refill:refill};
      caml_ml_channels[channel.fd] = channel;
      return channel.fd}
    function bigstring_of_typed_array(ba)
     {var
       ta=
        new
         (globalThis.Uint8Array)
         (ba.buffer,ba.byteOffset,ba.length * ba.BYTES_PER_ELEMENT);
      return caml_ba_create_unsafe(12,0,[ta.length],ta)}
    function caml_round_float(x){return Math.round(x)}
    function unix_stat(name)
     {var root=resolve_fs_device(name);
      if(! root.device.stat)caml_failwith("unix_stat: not implemented");
      return root.device.stat(root.rest,true)}
    var unix_stat_64=unix_stat;
    function caml_ojs_new_arr(c,a)
     {switch(a.length)
       {case 0:return new c();
        case 1:return new c(a[0]);
        case 2:return new c(a[0],a[1]);
        case 3:return new c(a[0],a[1],a[2]);
        case 4:return new c(a[0],a[1],a[2],a[3]);
        case 5:return new c(a[0],a[1],a[2],a[3],a[4]);
        case 6:return new c(a[0],a[1],a[2],a[3],a[4],a[5]);
        case 7:return new c(a[0],a[1],a[2],a[3],a[4],a[5],a[6])
        }
      function F(){return c.apply(this,a)}
      F.prototype = c.prototype;
      return new F()}
    function complement_nat(nat,ofs,len)
     {for(var i=0;i < len;i++)
       nat.data[ofs + i] = (- 1 >>> 0) - (nat.data[ofs + i] >>> 0)}
    var caml_js_regexps={amp:/&/g,lt:/</g,quot:/\"/g,all:/[&<\"]/};
    function caml_js_html_escape(s)
     {if(! caml_js_regexps.all.test(s))return s;
      return s.replace(caml_js_regexps.amp,"&amp;").replace
               (caml_js_regexps.lt,"&lt;").replace
              (caml_js_regexps.quot,"&quot;")}
    function caml_ba_dim_2(ba){return caml_ba_dim(ba,1)}
    function caml_js_wrap_meth_callback_arguments(f)
     {return function()
       {var len=arguments.length,args=new Array(len);
        for(var i=0;i < len;i++)args[i] = arguments[i];
        return caml_call_gen(f,[this,args])}}
    function caml_sinh_float(x){return Math.sinh(x)}
    function caml_ldexp_float(x,exp)
     {exp |= 0;
      if(exp > 1023)
       {exp -= 1023;
        x *= Math.pow(2,1023);
        if(exp > 1023){exp -= 1023;x *= Math.pow(2,1023)}}
      if(exp < - 1023){exp += 1023;x *= Math.pow(2,- 1023)}
      x *= Math.pow(2,exp);
      return x}
    function caml_gr_state_set(ctx)
     {caml_gr_state = ctx;caml_gr_state_init();return 0}
    function caml_js_wrap_callback_strict(arity,f)
     {return function()
       {var n=arguments.length;
        if(n == arity && f.length == arity)return f.apply(null,arguments);
        var args=new Array(arity),len=Math.min(arguments.length,arity);
        for(var i=0;i < len;i++)args[i] = arguments[i];
        return caml_call_gen(f,args)}}
    function caml_gc_minor_words(unit){return 0}
    function caml_ba_set_1(ba,i0,v){ba.set(ba.offset(i0),v);return 0}
    function caml_get_current_callstack(){return [0]}
    function land_digit_nat(nat1,ofs1,nat2,ofs2)
     {nat1.data[ofs1] &= nat2.data[ofs2];return 0}
    function caml_int64_mod(x,y){return x.mod(y)}
    function unix_readlink(name)
     {var root=resolve_fs_device(name);
      if(! root.device.readlink)
       caml_failwith("unix_readlink: not implemented");
      return root.device.readlink(root.rest,true)}
    function caml_obj_set_tag(x,tag){x[0] = tag;return 0}
    function caml_int32_bswap(x)
     {return (x & 0x000000FF)
             <<
             24
             |
             (x & 0x0000FF00)
             <<
             8
             |
             (x & 0x00FF0000)
             >>>
             8
             |
             (x & 0xFF000000)
             >>>
             24}
    function win_startup(){}
    function caml_ba_set_3(ba,i0,i1,i2,v)
     {ba.set(ba.offset([i0,i1,i2]),v);return 0}
    function caml_js_instanceof(o,c){return o instanceof c?1:0}
    function caml_get_major_bucket(n){return 0}
    var caml_blit_bigstring_to_string=caml_bigstring_blit_ba_to_bytes;
    function set_digit_nat_native(nat,ofs,digit)
     {nat.data[ofs] = digit;return 0}
    function nth_digit_nat_native(nat,ofs){return nat.data[ofs]}
    function caml_string_set64(s,i,i64){return caml_bytes_set64(s,i,i64)}
    function caml_gr_state_create(canvas,w,h)
     {var context=canvas.getContext("2d");
      return {context:context,
              canvas:canvas,
              x:0,
              y:0,
              width:w,
              height:h,
              line_width:1,
              font:caml_string_of_jsbytes("fixed"),
              text_size:26,
              color:0x000000,
              title:caml_string_of_jsbytes("")}}
    function caml_js_wrap_callback(f)
     {return function()
       {var len=arguments.length;
        if(len > 0)
         {var args=new Array(len);
          for(var i=0;i < len;i++)args[i] = arguments[i];
          return caml_call_gen(f,args)}
        else
         return caml_call_gen(f,[undefined])}}
    function caml_gr_draw_arc(x,y,rx,ry,a1,a2)
     {var s=caml_gr_state_get();
      s.context.beginPath();
      caml_gr_arc_aux(s.context,x,s.height - y,rx,ry,a1,a2);
      s.context.stroke();
      return 0}
    function caml_ba_map_file(vfd,kind,layout,shared,dims,pos)
     {caml_failwith("caml_ba_map_file not implemented")}
    function caml_ba_map_file_bytecode(argv,argn)
     {return caml_ba_map_file(argv[0],argv[1],argv[2],argv[3],argv[4],argv[5])}
    function unix_symlink(to_dir,src,dst)
     {var src_root=resolve_fs_device(src),dst_root=resolve_fs_device(dst);
      if(src_root.device != dst_root.device)
       caml_failwith("unix_symlink: cannot symlink between two filesystems");
      if(! src_root.device.symlink)
       caml_failwith("unix_symlink: not implemented");
      return src_root.device.symlink(to_dir,src_root.rest,dst_root.rest,true)}
    function caml_ba_create_from(data1,data2,jstyp,kind,layout,dims)
     {if(data2 || caml_ba_get_size_per_element(kind) == 2)
       caml_invalid_argument
        ("caml_ba_create_from: use return caml_ba_create_unsafe");
      return caml_ba_create_unsafe(kind,layout,dims,data1)}
    function caml_tanh_float(x){return Math.tanh(x)}
    function caml_gr_draw_str(str)
     {var s=caml_gr_state_get(),m=s.context.measureText(str),dx=m.width;
      s.context.fillText(str,s.x,s.height - s.y);
      s.x += dx | 0;
      return 0}
    function caml_gr_draw_string(str)
     {caml_gr_draw_str(caml_jsstring_of_string(str));return 0}
    function caml_gr_draw_char(c)
     {caml_gr_draw_str(String.fromCharCode(c));return 0}
    function caml_unmount(name)
     {var
       path=caml_make_path(name),
       name=caml_trailing_slash(path.join("/")),
       idx=- 1;
      for(var i=0;i < jsoo_mount_point.length;i++)
       if(jsoo_mount_point[i].path == name)idx = i;
      if(idx > - 1)jsoo_mount_point.splice(idx,1);
      return 0}
    function caml_input_value_from_string(s,ofs)
     {var reader=new MlStringReader(s,typeof ofs == "number"?ofs:ofs[0]);
      return caml_input_value_from_reader(reader,ofs)}
    function caml_ml_pos_in_64(chanid)
     {return caml_int64_of_float(caml_ml_channels[chanid].offset)}
    function caml_gr_draw_image(im,x,y)
     {var s=caml_gr_state_get();
      if(! im.image)
       {var canvas=document.createElement("canvas");
        canvas.width = s.width;
        canvas.height = s.height;
        canvas.getContext("2d").putImageData(im,0,0);
        var image=new (globalThis.Image)();
        image.onload
        =
        function()
         {s.context.drawImage(image,x,s.height - im.height - y);
          im.image = image};
        image.src = canvas.toDataURL("image/png")}
      else
       s.context.drawImage(im.image,x,s.height - im.height - y);
      return 0}
    function caml_register_channel_for_spacetime(_channel){return 0}
    function caml_string_set(s,i,c)
     {if(i >>> 0 >= s.l)caml_string_bound_error();
      return caml_string_unsafe_set(s,i,c)}
    function caml_sys_rmdir(name)
     {var root=resolve_fs_device(name);root.device.rmdir(root.rest);return 0}
    function caml_ml_pos_out(chanid)
     {caml_ml_flush(chanid);return caml_ml_channels[chanid].offset}
    function caml_spacetime_enabled(_unit){return 0}
    function caml_bytes_notequal(s1,s2){return 1 - caml_bytes_equal(s1,s2)}
    function caml_runtime_parameters(_unit){return caml_string_of_jsbytes("")}
    function caml_js_object(a)
     {var o={};
      for(var i=1;i < a.length;i++)
       {var p=a[i];o[caml_jsstring_of_string(p[1])] = p[2]}
      return o}
    function caml_ba_create(kind,layout,dims_ml)
     {var
       dims=caml_js_from_array(dims_ml),
       data=caml_ba_create_buffer(kind,caml_ba_get_size(dims));
      return caml_ba_create_unsafe(kind,layout,dims,data)}
    function caml_weak_blit(a1,i1,a2,i2,len)
     {caml_array_blit
       (a1,caml_ephe_key_offset + i1 - 1,a2,caml_ephe_key_offset + i2 - 1,len);
      return 0}
    function caml_gr_remember_mode()
     {caml_failwith("caml_gr_remember_mode not Implemented")}
    function caml_fma_float(x,y,z)
     {var
       SPLIT=Math.pow(2,27) + 1,
       MIN_VALUE=Math.pow(2,- 1022),
       EPSILON=Math.pow(2,- 52),
       C=416,
       A=Math.pow(2,+ C),
       B=Math.pow(2,- C);
      function multiply(a,b)
       {var
         at=SPLIT * a,
         ahi=at - (at - a),
         alo=a - ahi,
         bt=SPLIT * b,
         bhi=bt - (bt - b),
         blo=b - bhi,
         p=a * b,
         e=ahi * bhi - p + ahi * blo + alo * bhi + alo * blo;
        return {p:p,e:e}}
      function add(a,b)
       {var s=a + b,v=s - a,e=a - (s - v) + (b - v);return {s:s,e:e}}
      function adjust(x,y)
       {return x !== 0 && y !== 0 && SPLIT * x - (SPLIT * x - x) === x
                ?x * (1 + (x < 0?- 1:+ 1) * (y < 0?- 1:+ 1) * EPSILON)
                :x}
      if
       (x
        ===
        0
        ||
        x
        !==
        x
        ||
        x
        ===
        +
        (1 / 0)
        ||
        x
        ===
        -
        (1 / 0)
        ||
        y
        ===
        0
        ||
        y
        !==
        y
        ||
        y
        ===
        +
        (1 / 0)
        ||
        y
        ===
        -
        (1 / 0))
       return x * y + z;
      if(z === 0)return x * y;
      if(z !== z || z === + (1 / 0) || z === - (1 / 0))return z;
      var scale=1;
      while(Math.abs(x) > A){scale *= A;x *= B}
      while(Math.abs(y) > A){scale *= A;y *= B}
      if(scale === 1 / 0)return x * y * scale;
      while(Math.abs(x) < B){scale *= B;x *= A}
      while(Math.abs(y) < B){scale *= B;y *= A}
      if(scale === 0)return z;
      var xs=x,ys=y,zs=z / scale;
      if(Math.abs(zs) > Math.abs(xs * ys) * 4 / EPSILON)return z;
      if(Math.abs(zs) < Math.abs(xs * ys) * EPSILON / 4 * EPSILON / 4)
       zs = (z < 0?- 1:+ 1) * MIN_VALUE;
      var
       xy=multiply(xs,ys),
       s=add(xy.p,zs),
       u=add(xy.e,s.e),
       i=add(s.s,u.s),
       f=i.s + adjust(i.e,u.e);
      if(f === 0)return f;
      var fs=f * scale;
      if(Math.abs(fs) > MIN_VALUE)return fs;
      return fs + adjust(f - fs / scale,i.e) * scale}
    function caml_bswap16(x){return (x & 0x00FF) << 8 | (x & 0xFF00) >> 8}
    function caml_ml_set_binary_mode(chanid,mode)
     {var chan=caml_ml_channels[chanid],data=caml_global_data.fds[chan.fd];
      data.flags.text = ! mode;
      data.flags.binary = mode;
      return 0}
    function caml_final_register(){return 0}
    function caml_gr_draw_rect(x,y,w,h)
     {var s=caml_gr_state_get();
      s.context.strokeRect(x,s.height - y,w,- h);
      return 0}
    function caml_string_get16(s,i)
     {if(i >>> 0 >= caml_ml_string_length(s) - 1)caml_string_bound_error();
      var b1=caml_string_unsafe_get(s,i),b2=caml_string_unsafe_get(s,i + 1);
      return b2 << 8 | b1}
    function caml_ephe_unset_data(x,data)
     {x[caml_ephe_data_offset] = undefined;return 0}
    function caml_output_value(chanid,v,flags)
     {var s=caml_output_value_to_string(v,flags);
      caml_ml_output(chanid,s,0,caml_ml_string_length(s));
      return 0}
    function caml_ba_get_3(ba,i0,i1,i2){return ba.get(ba.offset([i0,i1,i2]))}
    var
     caml_ephe_blit_key=caml_weak_blit,
     caml_initial_time=new Date().getTime() * 0.001;
    function caml_sys_time()
     {var now=new Date().getTime();return now * 0.001 - caml_initial_time}
    function caml_sys_time_include_children(b){return caml_sys_time()}
    function caml_check_bound(array,index)
     {if(index >>> 0 >= array.length - 1)caml_array_bound_error();
      return array}
    function unix_getpwuid(unit){caml_raise_not_found()}
    function caml_hash_mix_string(h,v)
     {return caml_hash_mix_jsbytes(h,caml_jsbytes_of_string(v))}
    function caml_hash(count,limit,seed,obj)
     {var queue,rd,wr,sz,num,h,v,i,len;
      sz = limit;
      if(sz < 0 || sz > 256)sz = 256;
      num = count;
      h = seed;
      queue = [obj];
      rd = 0;
      wr = 1;
      while(rd < wr && num > 0)
       {v = queue[rd++];
        if(v && v.caml_custom)
         {if
           (caml_custom_ops[v.caml_custom]
            &&
            caml_custom_ops[v.caml_custom].hash)
           {var hh=caml_custom_ops[v.caml_custom].hash(v);
            h = caml_hash_mix_int(h,hh);
            num--}}
        else
         if(v instanceof Array && v[0] === (v[0] | 0))
          switch(v[0])
           {case 248:h = caml_hash_mix_int(h,v[2]);num--;break;
            case 250:queue[--rd] = v[1];break;
            default:
             var tag=v.length - 1 << 10 | v[0];
             h = caml_hash_mix_int(h,tag);
             for(i = 1,len = v.length;i < len;i++)
              {if(wr >= sz)break;queue[wr++] = v[i]}
             break}
         else
          if(caml_is_ml_bytes(v))
           {h = caml_hash_mix_bytes(h,v);num--}
          else
           if(caml_is_ml_string(v))
            {h = caml_hash_mix_string(h,v);num--}
           else
            if(typeof v === "string")
             {h = caml_hash_mix_jsbytes(h,v);num--}
            else
             if(v === (v | 0))
              {h = caml_hash_mix_int(h,v + v + 1);num--}
             else
              if(v === + v){h = caml_hash_mix_float(h,v);num--}}
      h = caml_hash_mix_final(h);
      return h & 0x3FFFFFFF}
    function caml_obj_tag(x)
     {if(x instanceof Array && x[0] == x[0] >>> 0)
       return x[0];
      else
       if(caml_is_ml_bytes(x))
        return 252;
       else
        if(caml_is_ml_string(x))
         return 252;
        else
         if(x instanceof Function || typeof x == "function")
          return 247;
         else
          if(x && x.caml_custom)return 255;else return 1000}
    function caml_ba_to_typed_array(ba){return ba.data}
    function caml_bytes_get32(s,i)
     {if(i >>> 0 >= s.l - 3)caml_bytes_bound_error();
      var
       b1=caml_bytes_unsafe_get(s,i),
       b2=caml_bytes_unsafe_get(s,i + 1),
       b3=caml_bytes_unsafe_get(s,i + 2),
       b4=caml_bytes_unsafe_get(s,i + 3);
      return b4 << 24 | b3 << 16 | b2 << 8 | b1}
    function caml_frexp_float(x)
     {if(x == 0 || ! isFinite(x))return [0,x,0];
      var neg=x < 0;
      if(neg)x = - x;
      var exp=Math.max(- 1023,jsoo_floor_log2(x) + 1);
      x *= Math.pow(2,- exp);
      while(x < 0.5){x *= 2;exp--}
      while(x >= 1){x *= 0.5;exp++}
      if(neg)x = - x;
      return [0,x,exp]}
    function caml_string_get64(s,i)
     {if(i >>> 0 >= caml_ml_string_length(s) - 7)caml_string_bound_error();
      var a=new Array(8);
      for(var j=0;j < 8;j++)a[7 - j] = caml_string_unsafe_get(s,i + j);
      return caml_int64_of_bytes(a)}
    function caml_js_error_option_of_exception(exn)
     {if(exn.js_error)return [0,exn.js_error];return 0}
    function caml_ml_pos_out_64(chanid)
     {caml_ml_flush(chanid);
      return caml_int64_of_float(caml_ml_channels[chanid].offset)}
    function caml_gr_close_subwindow(a)
     {caml_failwith("caml_gr_close_subwindow not Implemented")}
    function caml_floatarray_blit(a1,i1,a2,i2,len)
     {if(i2 <= i1)
       for(var j=1;j <= len;j++)a2[i2 + j] = a1[i1 + j];
      else
       for(var j=len;j >= 1;j--)a2[i2 + j] = a1[i1 + j];
      return 0}
    function caml_get_minor_free(unit){return 0}
    function caml_set_static_env(k,v)
     {if(! globalThis.jsoo_static_env)globalThis.jsoo_static_env = {};
      globalThis.jsoo_static_env[k] = v;
      return 0}
    function caml_ba_change_layout(ba,layout)
     {if(ba.layout == layout)return ba;
      var new_dims=[];
      for(var i=0;i < ba.dims.length;i++)
       new_dims[i] = ba.dims[ba.dims.length - i - 1];
      return caml_ba_create_unsafe(ba.kind,layout,new_dims,ba.data)}
    function caml_js_new(c,a)
     {switch(a.length)
       {case 1:return new c();
        case 2:return new c(a[1]);
        case 3:return new c(a[1],a[2]);
        case 4:return new c(a[1],a[2],a[3]);
        case 5:return new c(a[1],a[2],a[3],a[4]);
        case 6:return new c(a[1],a[2],a[3],a[4],a[5]);
        case 7:return new c(a[1],a[2],a[3],a[4],a[5],a[6]);
        case 8:return new c(a[1],a[2],a[3],a[4],a[5],a[6],a[7])
        }
      function F(){return c.apply(this,caml_js_from_array(a))}
      F.prototype = c.prototype;
      return new F()}
    function unix_mkdir(name,perm)
     {var root=resolve_fs_device(name);
      if(! root.device.mkdir)caml_failwith("unix_mkdir: not implemented");
      return root.device.mkdir(root.rest,perm,true)}
    function caml_gr_current_y(){var s=caml_gr_state_get();return s.y}
    function caml_format_int(fmt,i)
     {if(caml_jsbytes_of_string(fmt) == "%d")
       return caml_string_of_jsbytes("" + i);
      var f=caml_parse_format(fmt);
      if(i < 0)if(f.signedconv){f.sign = - 1;i = - i}else i >>>= 0;
      var s=i.toString(f.base);
      if(f.prec >= 0)
       {f.filler = " ";
        var n=f.prec - s.length;
        if(n > 0)s = caml_str_repeat(n,"0") + s}
      return caml_finish_formatting(f,s)}
    function caml_obj_truncate(x,s)
     {if(s <= 0 || s + 1 > x.length)caml_invalid_argument("Obj.truncate");
      if(x.length != s + 1)x.length = s + 1;
      return 0}
    function caml_js_to_string(s){return caml_string_of_jsstring(s)}
    function is_digit_odd(nat,ofs){if(nat.data[ofs] & 1)return 1;return 0}
    function caml_runtime_variant(_unit){return caml_string_of_jsbytes("")}
    function caml_ml_open_descriptor_out(fd)
     {var data=caml_global_data.fds[fd];
      if(data.flags.rdonly)caml_raise_sys_error("fd " + fd + " is readonly");
      var
       channel=
        {file:data.file,
         offset:data.offset,
         fd:fd,
         opened:true,
         out:true,
         buffer:""};
      caml_ml_channels[channel.fd] = channel;
      return channel.fd}
    function caml_array_concat(l)
     {var a=[0];
      while(l !== 0)
       {var b=l[1];for(var i=1;i < b.length;i++)a.push(b[i]);l = l[2]}
      return a}
    function caml_gr_open_graph(info)
     {var g=globalThis,info=caml_jsstring_of_string(info);
      function get(name)
       {var res=info.match("(^|,) *" + name + " *= *([a-zA-Z0-9_]+) *(,|$)");
        if(res)return res[2]}
      var specs=[];
      if(! (info == ""))specs.push(info);
      var target=get("target");
      if(! target)target = "";
      var status=get("status");
      if(! status)specs.push("status=1");
      var w=get("width");
      w = w?parseInt(w):200;
      specs.push("width=" + w);
      var h=get("height");
      h = h?parseInt(h):200;
      specs.push("height=" + h);
      var win=g.open("about:blank",target,specs.join(","));
      if(! win)caml_failwith("Graphics.open_graph: cannot open the window");
      var doc=win.document,canvas=doc.createElement("canvas");
      canvas.width = w;
      canvas.height = h;
      var ctx=caml_gr_state_create(canvas,w,h);
      ctx.set_title = function(title){doc.title = title};
      caml_gr_state_set(ctx);
      var body=doc.body;
      body.style.margin = "0px";
      body.appendChild(canvas);
      return 0}
    function caml_ephe_set_data(x,data)
     {x[caml_ephe_data_offset] = data;return 0}
    function caml_make_float_vect(len)
     {if(len < 0)caml_array_bound_error();
      var len=len + 1 | 0,b=new Array(len);
      b[0] = 254;
      for(var i=1;i < len;i++)b[i] = 0;
      return b}
    function caml_cbrt_float(x){return Math.cbrt(x)}
    function caml_memprof_stop(unit){return 0}
    function caml_eventlog_pause(unit){return 0}
    function caml_greaterequal(x,y)
     {return + (caml_compare_val(x,y,false) >= 0)}
    function caml_get_exception_raw_backtrace(){return [0]}
    function caml_log1p_float(x){return Math.log1p(x)}
    function caml_int64_or(x,y){return x.or(y)}
    function caml_lazy_make_forward(v){return [250,v]}
    function lor_digit_nat(nat1,ofs1,nat2,ofs2)
     {nat1.data[ofs1] |= nat2.data[ofs2];return 0}
    function caml_gr_blit_image(im,x,y)
     {var
       s=caml_gr_state_get(),
       im2=
        s.context.getImageData(x,s.height - im.height - y,im.width,im.height);
      for(var i=0;i < im2.data.length;i += 4)
       {im.data[i] = im2.data[i];
        im.data[i + 1] = im2.data[i + 1];
        im.data[i + 2] = im2.data[i + 2];
        im.data[i + 3] = im2.data[i + 3]}
      return 0}
    function caml_gr_window_id(a)
     {caml_failwith("caml_gr_window_id not Implemented")}
    function caml_js_on_ie()
     {var ua=globalThis.navigator?globalThis.navigator.userAgent:"";
      return ua.indexOf("MSIE") != - 1 && ua.indexOf("Opera") != 0}
    function caml_int64_shift_right(x,s){return x.shift_right(s)}
    function caml_ba_layout(ba){return ba.layout}
    function caml_convert_raw_backtrace(){return [0]}
    function caml_array_set(array,index,newval)
     {if(index < 0 || index >= array.length - 1)caml_array_bound_error();
      array[index + 1] = newval;
      return 0}
    function caml_bytes_greaterequal(s1,s2)
     {return caml_bytes_lessequal(s2,s1)}
    function set_digit_nat(nat,ofs,digit){nat.data[ofs] = digit;return 0}
    function caml_gr_doc_of_state(state)
     {if(state.canvas.ownerDocument)return state.canvas.ownerDocument}
    function caml_ml_output_int(chanid,i)
     {var
       arr=[i >> 24 & 0xFF,i >> 16 & 0xFF,i >> 8 & 0xFF,i & 0xFF],
       s=caml_string_of_array(arr);
      caml_ml_output(chanid,s,0,4);
      return 0}
    function caml_obj_with_tag(tag,x)
     {var l=x.length,a=new Array(l);
      a[0] = tag;
      for(var i=1;i < l;i++)a[i] = x[i];
      return a}
    function caml_ml_channel_size(chanid)
     {var chan=caml_ml_channels[chanid];return chan.file.length()}
    function caml_raw_backtrace_slot()
     {caml_invalid_argument
       ("Printexc.get_raw_backtrace_slot: index out of bounds")}
    function caml_hexstring_of_float(x,prec,style)
     {if(! isFinite(x))
       {if(isNaN(x))return caml_string_of_jsstring("nan");
        return caml_string_of_jsstring(x > 0?"infinity":"-infinity")}
      var sign=x == 0 && 1 / x == - Infinity?1:x >= 0?0:1;
      if(sign)x = - x;
      var exp=0;
      if(x == 0)
       ;
      else
       if(x < 1)
        while(x < 1 && exp > - 1022){x *= 2;exp--}
       else
        while(x >= 2){x /= 2;exp++}
      var exp_sign=exp < 0?"":"+",sign_str="";
      if(sign)
       sign_str = "-";
      else
       switch(style)
        {case 43:sign_str = "+";break;
         case 32:sign_str = " ";break;
         default:break}
      if(prec >= 0 && prec < 13)
       {var cst=Math.pow(2,prec * 4);x = Math.round(x * cst) / cst}
      var x_str=x.toString(16);
      if(prec >= 0)
       {var idx=x_str.indexOf(".");
        if(idx < 0)
         x_str += "." + caml_str_repeat(prec,"0");
        else
         {var size=idx + 1 + prec;
          if(x_str.length < size)
           x_str += caml_str_repeat(size - x_str.length,"0");
          else
           x_str = x_str.substr(0,size)}}
      return caml_string_of_jsstring
              (sign_str + "0x" + x_str + "p" + exp_sign + exp.toString(10))}
    function caml_js_wrap_meth_callback_strict(arity,f)
     {return function()
       {var args=new Array(arity + 1),len=Math.min(arguments.length,arity);
        args[0] = this;
        for(var i=0;i < len;i++)args[i + 1] = arguments[i];
        return caml_call_gen(f,args)}}
    function caml_backtrace_status(){return 0}
    function caml_sys_argv(a){return caml_argv}
    function caml_install_signal_handler(){return 0}
    function caml_ba_fill(ba,v){ba.fill(v);return 0}
    function caml_modf_float(x)
     {if(isFinite(x))
       {var neg=1 / x < 0;
        x = Math.abs(x);
        var i=Math.floor(x),f=x - i;
        if(neg){i = - i;f = - f}
        return [0,f,i]}
      if(isNaN(x))return [0,NaN,NaN];
      return [0,1 / x,x]}
    function caml_gc_get(){return [0,0,0,0,0,0,0,0,0]}
    function caml_float_compare(x,y)
     {if(x === y)return 0;
      if(x < y)return - 1;
      if(x > y)return 1;
      if(x === x)return 1;
      if(y === y)return - 1;
      return 0}
    function caml_string_set32(s,i,i32){return caml_bytes_set32(s,i,i32)}
    function caml_parse_engine(tables,env,cmd,arg)
     {var
       ERRCODE=256,
       loop=6,
       testshift=7,
       shift=8,
       shift_recover=9,
       reduce=10,
       READ_TOKEN=0,
       RAISE_PARSE_ERROR=1,
       GROW_STACKS_1=2,
       GROW_STACKS_2=3,
       COMPUTE_SEMANTIC_ACTION=4,
       CALL_ERROR_FUNCTION=5,
       env_s_stack=1,
       env_v_stack=2,
       env_symb_start_stack=3,
       env_symb_end_stack=4,
       env_stacksize=5,
       env_stackbase=6,
       env_curr_char=7,
       env_lval=8,
       env_symb_start=9,
       env_symb_end=10,
       env_asp=11,
       env_rule_len=12,
       env_rule_number=13,
       env_sp=14,
       env_state=15,
       env_errflag=16,
       tbl_transl_const=2,
       tbl_transl_block=3,
       tbl_lhs=4,
       tbl_len=5,
       tbl_defred=6,
       tbl_dgoto=7,
       tbl_sindex=8,
       tbl_rindex=9,
       tbl_gindex=10,
       tbl_tablesize=11,
       tbl_table=12,
       tbl_check=13;
      if(! tables.dgoto)
       {tables.defred = caml_lex_array(tables[tbl_defred]);
        tables.sindex = caml_lex_array(tables[tbl_sindex]);
        tables.check = caml_lex_array(tables[tbl_check]);
        tables.rindex = caml_lex_array(tables[tbl_rindex]);
        tables.table = caml_lex_array(tables[tbl_table]);
        tables.len = caml_lex_array(tables[tbl_len]);
        tables.lhs = caml_lex_array(tables[tbl_lhs]);
        tables.gindex = caml_lex_array(tables[tbl_gindex]);
        tables.dgoto = caml_lex_array(tables[tbl_dgoto])}
      var
       res=0,
       n,
       n1,
       n2,
       state1,
       sp=env[env_sp],
       state=env[env_state],
       errflag=env[env_errflag];
      exit:
      for(;;)
       switch(cmd)
        {case 0:state = 0;errflag = 0;
         case 6:
          n = tables.defred[state];
          if(n != 0){cmd = reduce;break}
          if(env[env_curr_char] >= 0){cmd = testshift;break}
          res = READ_TOKEN;
          break exit;
         case 1:
          if(arg instanceof Array)
           {env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1];
            env[env_lval] = arg[1]}
          else
           {env[env_curr_char] = tables[tbl_transl_const][arg + 1];
            env[env_lval] = 0}
         case 7:
          n1 = tables.sindex[state];
          n2 = n1 + env[env_curr_char];
          if
           (n1
            !=
            0
            &&
            n2
            >=
            0
            &&
            n2
            <=
            tables[tbl_tablesize]
            &&
            tables.check[n2]
            ==
            env[env_curr_char])
           {cmd = shift;break}
          n1 = tables.rindex[state];
          n2 = n1 + env[env_curr_char];
          if
           (n1
            !=
            0
            &&
            n2
            >=
            0
            &&
            n2
            <=
            tables[tbl_tablesize]
            &&
            tables.check[n2]
            ==
            env[env_curr_char])
           {n = tables.table[n2];cmd = reduce;break}
          if(errflag <= 0){res = CALL_ERROR_FUNCTION;break exit}
         case 5:
          if(errflag < 3)
           {errflag = 3;
            for(;;)
             {state1 = env[env_s_stack][sp + 1];
              n1 = tables.sindex[state1];
              n2 = n1 + ERRCODE;
              if
               (n1
                !=
                0
                &&
                n2
                >=
                0
                &&
                n2
                <=
                tables[tbl_tablesize]
                &&
                tables.check[n2]
                ==
                ERRCODE)
               {cmd = shift_recover;break}
              else
               {if(sp <= env[env_stackbase])return RAISE_PARSE_ERROR;sp--}}}
          else
           {if(env[env_curr_char] == 0)return RAISE_PARSE_ERROR;
            env[env_curr_char] = - 1;
            cmd = loop;
            break}
         case 8:env[env_curr_char] = - 1;if(errflag > 0)errflag--;
         case 9:
          state = tables.table[n2];
          sp++;
          if(sp >= env[env_stacksize]){res = GROW_STACKS_1;break exit}
         case 2:
          env[env_s_stack][sp + 1] = state;
          env[env_v_stack][sp + 1] = env[env_lval];
          env[env_symb_start_stack][sp + 1] = env[env_symb_start];
          env[env_symb_end_stack][sp + 1] = env[env_symb_end];
          cmd = loop;
          break;
         case 10:
          var m=tables.len[n];
          env[env_asp] = sp;
          env[env_rule_number] = n;
          env[env_rule_len] = m;
          sp = sp - m + 1;
          m = tables.lhs[n];
          state1 = env[env_s_stack][sp];
          n1 = tables.gindex[m];
          n2 = n1 + state1;
          if
           (n1
            !=
            0
            &&
            n2
            >=
            0
            &&
            n2
            <=
            tables[tbl_tablesize]
            &&
            tables.check[n2]
            ==
            state1)
           state = tables.table[n2];
          else
           state = tables.dgoto[m];
          if(sp >= env[env_stacksize]){res = GROW_STACKS_2;break exit}
         case 3:res = COMPUTE_SEMANTIC_ACTION;break exit;
         case 4:
          env[env_s_stack][sp + 1] = state;
          env[env_v_stack][sp + 1] = arg;
          var asp=env[env_asp];
          env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
          if(sp > asp)
           env[env_symb_start_stack][sp + 1]
           =
           env[env_symb_end_stack][asp + 1];
          cmd = loop;
          break;
         default:return RAISE_PARSE_ERROR}
      env[env_sp] = sp;
      env[env_state] = state;
      env[env_errflag] = errflag;
      return res}
    function caml_update_dummy(x,y)
     {if(typeof y === "function"){x.fun = y;return 0}
      if(y.fun){x.fun = y.fun;return 0}
      var i=y.length;
      while(i--)x[i] = y[i];
      return 0}
    function caml_array_fill(array,ofs,len,v)
     {for(var i=0;i < len;i++)array[ofs + i + 1] = v;return 0}
    function caml_sys_mkdir(name,perm)
     {var root=resolve_fs_device(name);
      root.device.mkdir(root.rest,perm);
      return 0}
    function caml_string_notequal(s1,s2){return 1 - caml_string_equal(s1,s2)}
    function caml_bytes_greaterthan(s1,s2){return caml_bytes_lessthan(s2,s1)}
    function caml_gr_make_image(arr)
     {var
       s=caml_gr_state_get(),
       h=arr.length - 1,
       w=arr[1].length - 1,
       im=s.context.createImageData(w,h);
      for(var i=0;i < h;i++)
       for(var j=0;j < w;j++)
        {var c=arr[i + 1][j + 1],o=i * (w * 4) + j * 4;
         if(c == - 1)
          {im.data[o + 0] = 0;
           im.data[o + 1] = 0;
           im.data[o + 2] = 0;
           im.data[o + 3] = 0}
         else
          {im.data[o + 0] = c >> 16 & 0xff;
           im.data[o + 1] = c >> 8 & 0xff;
           im.data[o + 2] = c >> 0 & 0Xff;
           im.data[o + 3] = 0xff}}
      return im}
    function caml_ml_set_channel_output(chanid,f)
     {var chan=caml_ml_channels[chanid];
      caml_global_data.fds[chan.fd].output = f;
      return 0}
    function caml_read_file_content(name)
     {var
       name=typeof name == "string"?caml_string_of_jsbytes(name):name,
       root=resolve_fs_device(name);
      if(root.device.exists(root.rest))
       {var
         file=root.device.open(root.rest,{rdonly:1}),
         len=file.length(),
         buf=caml_create_bytes(len);
        file.read(0,buf,0,len);
        return caml_string_of_bytes(buf)}
      caml_raise_no_such_file(caml_jsbytes_of_string(name))}
    function caml_js_to_float(x){return x}
    function caml_setup_uncaught_exception_handler()
     {var g=globalThis;
      if(g.process && g.process.on)
       g.process.on
        ("uncaughtException",
         function(err,origin)
          {caml_fatal_uncaught_exception(err);g.process.exit(2)});
      else
       if(g.addEventListener)
        g.addEventListener
         ("error",
          function(event)
           {if(event.error)caml_fatal_uncaught_exception(event.error)})}
    caml_setup_uncaught_exception_handler();
    globalThis.jsoo_runtime
    =
    {caml_ephe_key_offset:caml_ephe_key_offset,
     caml_ephe_data_offset:caml_ephe_data_offset,
     caml_weak_create:caml_weak_create,
     caml_weak_set:caml_weak_set,
     caml_weak_get:caml_weak_get,
     caml_weak_get_copy:caml_weak_get_copy,
     caml_weak_check:caml_weak_check,
     caml_weak_blit:caml_weak_blit,
     caml_ephe_create:caml_ephe_create,
     caml_ephe_blit_key:caml_ephe_blit_key,
     caml_ephe_get_key:caml_ephe_get_key,
     caml_ephe_get_key_copy:caml_ephe_get_key_copy,
     caml_ephe_check_key:caml_ephe_check_key,
     caml_ephe_set_key:caml_ephe_set_key,
     caml_ephe_unset_key:caml_ephe_unset_key,
     caml_ephe_blit_data:caml_ephe_blit_data,
     caml_ephe_get_data:caml_ephe_get_data,
     caml_ephe_get_data_copy:caml_ephe_get_data_copy,
     caml_ephe_set_data:caml_ephe_set_data,
     caml_ephe_unset_data:caml_ephe_unset_data,
     caml_ephe_check_data:caml_ephe_check_data,
     unix_gettimeofday:unix_gettimeofday,
     unix_time:unix_time,
     unix_gmtime:unix_gmtime,
     unix_localtime:unix_localtime,
     unix_mktime:unix_mktime,
     win_startup:win_startup,
     win_cleanup:win_cleanup,
     win_handle_fd:win_handle_fd,
     unix_isatty:unix_isatty,
     make_unix_err_args:make_unix_err_args,
     unix_stat:unix_stat,
     unix_stat_64:unix_stat_64,
     unix_lstat:unix_lstat,
     unix_lstat_64:unix_lstat_64,
     unix_mkdir:unix_mkdir,
     unix_rmdir:unix_rmdir,
     unix_symlink:unix_symlink,
     unix_readlink:unix_readlink,
     unix_unlink:unix_unlink,
     unix_getuid:unix_getuid,
     unix_getpwuid:unix_getpwuid,
     unix_has_symlink:unix_has_symlink,
     re_match:re_match,
     re_search_forward:re_search_forward,
     re_search_backward:re_search_backward,
     re_string_match:re_string_match,
     re_partial_match:re_partial_match,
     re_replacement_text:re_replacement_text,
     caml_raise_sys_error:caml_raise_sys_error,
     caml_sys_exit:caml_sys_exit,
     caml_is_special_exception:caml_is_special_exception,
     caml_format_exception:caml_format_exception,
     caml_fatal_uncaught_exception:caml_fatal_uncaught_exception,
     caml_set_static_env:caml_set_static_env,
     caml_sys_getenv:caml_sys_getenv,
     caml_sys_unsafe_getenv:caml_sys_unsafe_getenv,
     caml_argv:caml_argv,
     caml_executable_name:caml_executable_name,
     caml_sys_get_argv:caml_sys_get_argv,
     caml_sys_argv:caml_sys_argv,
     caml_sys_modify_argv:caml_sys_modify_argv,
     caml_sys_executable_name:caml_sys_executable_name,
     caml_sys_system_command:caml_sys_system_command,
     caml_sys_time:caml_sys_time,
     caml_sys_time_include_children:caml_sys_time_include_children,
     caml_sys_random_seed:caml_sys_random_seed,
     caml_sys_const_big_endian:caml_sys_const_big_endian,
     caml_sys_const_word_size:caml_sys_const_word_size,
     caml_sys_const_int_size:caml_sys_const_int_size,
     caml_sys_const_max_wosize:caml_sys_const_max_wosize,
     caml_sys_const_ostype_unix:caml_sys_const_ostype_unix,
     caml_sys_const_ostype_win32:caml_sys_const_ostype_win32,
     caml_sys_const_ostype_cygwin:caml_sys_const_ostype_cygwin,
     caml_sys_const_backend_type:caml_sys_const_backend_type,
     os_type:os_type,
     caml_sys_get_config:caml_sys_get_config,
     caml_sys_isatty:caml_sys_isatty,
     caml_runtime_variant:caml_runtime_variant,
     caml_runtime_parameters:caml_runtime_parameters,
     caml_install_signal_handler:caml_install_signal_handler,
     unix_inet_addr_of_string:unix_inet_addr_of_string,
     caml_runtime_warnings:caml_runtime_warnings,
     caml_ml_enable_runtime_warnings:caml_ml_enable_runtime_warnings,
     caml_ml_runtime_warnings_enabled:caml_ml_runtime_warnings_enabled,
     caml_spacetime_enabled:caml_spacetime_enabled,
     caml_sys_const_naked_pointers_checked:
     caml_sys_const_naked_pointers_checked,
     caml_register_channel_for_spacetime:caml_register_channel_for_spacetime,
     caml_spacetime_only_works_for_native_code:
     caml_spacetime_only_works_for_native_code,
     caml_call_gen:caml_call_gen,
     caml_named_values:caml_named_values,
     caml_register_named_value:caml_register_named_value,
     caml_named_value:caml_named_value,
     caml_global_data:caml_global_data,
     caml_register_global:caml_register_global,
     caml_get_global_data:caml_get_global_data,
     caml_is_printable:caml_is_printable,
     caml_parse_engine:caml_parse_engine,
     caml_set_parser_trace:caml_set_parser_trace,
     caml_update_dummy:caml_update_dummy,
     caml_obj_is_block:caml_obj_is_block,
     caml_obj_tag:caml_obj_tag,
     caml_obj_set_tag:caml_obj_set_tag,
     caml_obj_block:caml_obj_block,
     caml_obj_with_tag:caml_obj_with_tag,
     caml_obj_dup:caml_obj_dup,
     caml_obj_truncate:caml_obj_truncate,
     caml_obj_make_forward:caml_obj_make_forward,
     caml_lazy_make_forward:caml_lazy_make_forward,
     caml_get_public_method:caml_get_public_method,
     caml_oo_last_id:caml_oo_last_id,
     caml_set_oo_id:caml_set_oo_id,
     caml_fresh_oo_id:caml_fresh_oo_id,
     caml_obj_raw_field:caml_obj_raw_field,
     caml_obj_set_raw_field:caml_obj_set_raw_field,
     caml_obj_reachable_words:caml_obj_reachable_words,
     caml_obj_add_offset:caml_obj_add_offset,
     initialize_nat:initialize_nat,
     MlNat:MlNat,
     caml_hash_nat:caml_hash_nat,
     nat_of_array:nat_of_array,
     create_nat:create_nat,
     set_to_zero_nat:set_to_zero_nat,
     blit_nat:blit_nat,
     set_digit_nat:set_digit_nat,
     nth_digit_nat:nth_digit_nat,
     set_digit_nat_native:set_digit_nat_native,
     nth_digit_nat_native:nth_digit_nat_native,
     num_digits_nat:num_digits_nat,
     num_leading_zero_bits_in_digit:num_leading_zero_bits_in_digit,
     is_digit_int:is_digit_int,
     is_digit_zero:is_digit_zero,
     is_digit_odd:is_digit_odd,
     incr_nat:incr_nat,
     add_nat:add_nat,
     complement_nat:complement_nat,
     decr_nat:decr_nat,
     sub_nat:sub_nat,
     mult_digit_nat:mult_digit_nat,
     mult_nat:mult_nat,
     square_nat:square_nat,
     shift_left_nat:shift_left_nat,
     div_helper:div_helper,
     div_digit_nat:div_digit_nat,
     div_nat:div_nat,
     shift_right_nat:shift_right_nat,
     compare_digits_nat:compare_digits_nat,
     compare_nat:compare_nat,
     compare_nat_real:compare_nat_real,
     land_digit_nat:land_digit_nat,
     lor_digit_nat:lor_digit_nat,
     lxor_digit_nat:lxor_digit_nat,
     serialize_nat:serialize_nat,
     deserialize_nat:deserialize_nat,
     caml_str_repeat:caml_str_repeat,
     caml_subarray_to_jsbytes:caml_subarray_to_jsbytes,
     caml_utf8_of_utf16:caml_utf8_of_utf16,
     caml_utf16_of_utf8:caml_utf16_of_utf8,
     jsoo_is_ascii:jsoo_is_ascii,
     caml_bytes_unsafe_get:caml_bytes_unsafe_get,
     caml_bytes_unsafe_set:caml_bytes_unsafe_set,
     caml_string_bound_error:caml_string_bound_error,
     caml_bytes_bound_error:caml_bytes_bound_error,
     caml_string_get:caml_string_get,
     caml_string_get16:caml_string_get16,
     caml_bytes_get16:caml_bytes_get16,
     caml_string_get32:caml_string_get32,
     caml_bytes_get32:caml_bytes_get32,
     caml_string_get64:caml_string_get64,
     caml_bytes_get64:caml_bytes_get64,
     caml_bytes_get:caml_bytes_get,
     caml_string_set:caml_string_set,
     caml_bytes_set16:caml_bytes_set16,
     caml_string_set16:caml_string_set16,
     caml_bytes_set32:caml_bytes_set32,
     caml_string_set32:caml_string_set32,
     caml_bytes_set64:caml_bytes_set64,
     caml_string_set64:caml_string_set64,
     caml_bytes_set:caml_bytes_set,
     caml_bytes_of_utf16_jsstring:caml_bytes_of_utf16_jsstring,
     MlBytes:MlBytes,
     caml_convert_string_to_bytes:caml_convert_string_to_bytes,
     caml_convert_bytes_to_array:caml_convert_bytes_to_array,
     caml_array_of_bytes:caml_array_of_bytes,
     caml_array_of_string:caml_array_of_string,
     caml_create_string:caml_create_string,
     caml_create_bytes:caml_create_bytes,
     caml_string_of_array:caml_string_of_array,
     caml_bytes_of_array:caml_bytes_of_array,
     caml_bytes_compare:caml_bytes_compare,
     caml_bytes_equal:caml_bytes_equal,
     caml_string_notequal:caml_string_notequal,
     caml_bytes_notequal:caml_bytes_notequal,
     caml_bytes_lessequal:caml_bytes_lessequal,
     caml_bytes_lessthan:caml_bytes_lessthan,
     caml_string_greaterequal:caml_string_greaterequal,
     caml_bytes_greaterequal:caml_bytes_greaterequal,
     caml_string_greaterthan:caml_string_greaterthan,
     caml_bytes_greaterthan:caml_bytes_greaterthan,
     caml_fill_bytes:caml_fill_bytes,
     caml_fill_string:caml_fill_string,
     caml_blit_bytes:caml_blit_bytes,
     caml_blit_string:caml_blit_string,
     caml_ml_bytes_length:caml_ml_bytes_length,
     caml_bytes_of_jsbytes:caml_bytes_of_jsbytes,
     caml_string_unsafe_get:caml_string_unsafe_get,
     caml_string_unsafe_set:caml_string_unsafe_set,
     caml_ml_string_length:caml_ml_string_length,
     caml_string_compare:caml_string_compare,
     caml_string_equal:caml_string_equal,
     caml_string_lessequal:caml_string_lessequal,
     caml_string_lessthan:caml_string_lessthan,
     caml_string_of_bytes:caml_string_of_bytes,
     caml_bytes_of_string:caml_bytes_of_string,
     caml_string_of_jsbytes:caml_string_of_jsbytes,
     caml_jsbytes_of_string:caml_jsbytes_of_string,
     caml_jsstring_of_string:caml_jsstring_of_string,
     caml_string_of_jsstring:caml_string_of_jsstring,
     caml_is_ml_bytes:caml_is_ml_bytes,
     caml_ml_bytes_content:caml_ml_bytes_content,
     caml_is_ml_string:caml_is_ml_string,
     caml_js_to_byte_string:caml_js_to_byte_string,
     caml_new_string:caml_new_string,
     caml_js_from_string:caml_js_from_string,
     caml_to_js_string:caml_to_js_string,
     caml_js_to_string:caml_js_to_string,
     caml_md5_chan:caml_md5_chan,
     caml_md5_string:caml_md5_string,
     caml_md5_bytes:caml_md5_bytes,
     caml_marshal_constants:caml_marshal_constants,
     MlStringReader:MlStringReader,
     BigStringReader:BigStringReader,
     caml_float_of_bytes:caml_float_of_bytes,
     caml_input_value_from_string:caml_input_value_from_string,
     caml_input_value_from_bytes:caml_input_value_from_bytes,
     caml_int64_unmarshal:caml_int64_unmarshal,
     caml_int64_marshal:caml_int64_marshal,
     caml_int32_unmarshal:caml_int32_unmarshal,
     caml_nativeint_unmarshal:caml_nativeint_unmarshal,
     caml_custom_ops:caml_custom_ops,
     caml_input_value_from_reader:caml_input_value_from_reader,
     caml_marshal_data_size:caml_marshal_data_size,
     MlObjectTable:MlObjectTable,
     caml_legacy_custom_code:caml_legacy_custom_code,
     caml_output_val:caml_output_val,
     caml_output_value_to_string:caml_output_value_to_string,
     caml_output_value_to_bytes:caml_output_value_to_bytes,
     caml_output_value_to_buffer:caml_output_value_to_buffer,
     caml_lex_array:caml_lex_array,
     caml_lex_engine:caml_lex_engine,
     caml_new_lex_engine:caml_new_lex_engine,
     caml_js_on_ie:caml_js_on_ie,
     caml_js_html_escape:caml_js_html_escape,
     caml_js_html_entities:caml_js_html_entities,
     caml_js_get_console:caml_js_get_console,
     caml_xmlhttprequest_create:caml_xmlhttprequest_create,
     caml_js_error_of_exception:caml_js_error_of_exception,
     caml_js_pure_expr:caml_js_pure_expr,
     caml_js_set:caml_js_set,
     caml_js_get:caml_js_get,
     caml_js_delete:caml_js_delete,
     caml_js_instanceof:caml_js_instanceof,
     caml_js_typeof:caml_js_typeof,
     caml_trampoline:caml_trampoline,
     caml_trampoline_return:caml_trampoline_return,
     js_print_stdout:js_print_stdout,
     js_print_stderr:js_print_stderr,
     caml_is_js:caml_is_js,
     caml_wrap_exception:caml_wrap_exception,
     caml_exn_with_js_backtrace:caml_exn_with_js_backtrace,
     caml_js_error_option_of_exception:caml_js_error_option_of_exception,
     caml_js_from_bool:caml_js_from_bool,
     caml_js_to_bool:caml_js_to_bool,
     caml_js_from_float:caml_js_from_float,
     caml_js_to_float:caml_js_to_float,
     caml_js_from_array:caml_js_from_array,
     caml_js_to_array:caml_js_to_array,
     caml_list_of_js_array:caml_list_of_js_array,
     caml_list_to_js_array:caml_list_to_js_array,
     caml_js_var:caml_js_var,
     caml_js_call:caml_js_call,
     caml_js_fun_call:caml_js_fun_call,
     caml_js_meth_call:caml_js_meth_call,
     caml_js_new:caml_js_new,
     caml_ojs_new_arr:caml_ojs_new_arr,
     caml_js_wrap_callback:caml_js_wrap_callback,
     caml_js_wrap_callback_arguments:caml_js_wrap_callback_arguments,
     caml_js_wrap_callback_strict:caml_js_wrap_callback_strict,
     caml_js_wrap_meth_callback:caml_js_wrap_meth_callback,
     caml_js_wrap_meth_callback_arguments:caml_js_wrap_meth_callback_arguments,
     caml_js_wrap_meth_callback_strict:caml_js_wrap_meth_callback_strict,
     caml_js_wrap_meth_callback_unsafe:caml_js_wrap_meth_callback_unsafe,
     caml_js_equals:caml_js_equals,
     caml_js_eval_string:caml_js_eval_string,
     caml_js_expr:caml_js_expr,
     caml_pure_js_expr:caml_pure_js_expr,
     caml_js_object:caml_js_object,
     caml_sys_close:caml_sys_close,
     caml_std_output:caml_std_output,
     caml_sys_open:caml_sys_open,
     caml_ml_set_channel_name:caml_ml_set_channel_name,
     caml_ml_channels:caml_ml_channels,
     caml_ml_out_channels_list:caml_ml_out_channels_list,
     caml_ml_open_descriptor_out:caml_ml_open_descriptor_out,
     caml_ml_open_descriptor_in:caml_ml_open_descriptor_in,
     caml_channel_descriptor:caml_channel_descriptor,
     win_filedescr_of_channel:win_filedescr_of_channel,
     caml_ml_set_binary_mode:caml_ml_set_binary_mode,
     caml_ml_close_channel:caml_ml_close_channel,
     caml_ml_channel_size:caml_ml_channel_size,
     caml_ml_channel_size_64:caml_ml_channel_size_64,
     caml_ml_set_channel_output:caml_ml_set_channel_output,
     caml_ml_set_channel_refill:caml_ml_set_channel_refill,
     caml_ml_refill_input:caml_ml_refill_input,
     caml_ml_may_refill_input:caml_ml_may_refill_input,
     caml_ml_input:caml_ml_input,
     caml_input_value:caml_input_value,
     caml_ml_input_char:caml_ml_input_char,
     caml_ml_input_int:caml_ml_input_int,
     caml_ml_seek_in:caml_ml_seek_in,
     caml_ml_seek_in_64:caml_ml_seek_in_64,
     caml_ml_pos_in:caml_ml_pos_in,
     caml_ml_pos_in_64:caml_ml_pos_in_64,
     caml_ml_input_scan_line:caml_ml_input_scan_line,
     caml_ml_flush:caml_ml_flush,
     caml_ml_output_bytes:caml_ml_output_bytes,
     caml_ml_output:caml_ml_output,
     caml_ml_output_char:caml_ml_output_char,
     caml_output_value:caml_output_value,
     caml_ml_seek_out:caml_ml_seek_out,
     caml_ml_seek_out_64:caml_ml_seek_out_64,
     caml_ml_pos_out:caml_ml_pos_out,
     caml_ml_pos_out_64:caml_ml_pos_out_64,
     caml_ml_output_int:caml_ml_output_int,
     caml_ml_is_buffered:caml_ml_is_buffered,
     caml_ml_set_buffered:caml_ml_set_buffered,
     caml_format_int:caml_format_int,
     caml_parse_sign_and_base:caml_parse_sign_and_base,
     caml_parse_digit:caml_parse_digit,
     caml_int_of_string:caml_int_of_string,
     caml_mul:caml_mul,
     caml_div:caml_div,
     caml_mod:caml_mod,
     caml_bswap16:caml_bswap16,
     caml_int32_bswap:caml_int32_bswap,
     caml_int64_bswap:caml_int64_bswap,
     caml_int64_offset:caml_int64_offset,
     MlInt64:MlInt64,
     caml_int64_ult:caml_int64_ult,
     caml_int64_compare:caml_int64_compare,
     caml_int64_neg:caml_int64_neg,
     caml_int64_add:caml_int64_add,
     caml_int64_sub:caml_int64_sub,
     caml_int64_mul:caml_int64_mul,
     caml_int64_is_zero:caml_int64_is_zero,
     caml_int64_is_negative:caml_int64_is_negative,
     caml_int64_and:caml_int64_and,
     caml_int64_or:caml_int64_or,
     caml_int64_xor:caml_int64_xor,
     caml_int64_shift_left:caml_int64_shift_left,
     caml_int64_shift_right_unsigned:caml_int64_shift_right_unsigned,
     caml_int64_shift_right:caml_int64_shift_right,
     caml_int64_div:caml_int64_div,
     caml_int64_mod:caml_int64_mod,
     caml_int64_of_int32:caml_int64_of_int32,
     caml_int64_to_int32:caml_int64_to_int32,
     caml_int64_to_float:caml_int64_to_float,
     caml_int64_of_float:caml_int64_of_float,
     caml_int64_format:caml_int64_format,
     caml_int64_of_string:caml_int64_of_string,
     caml_int64_create_lo_mi_hi:caml_int64_create_lo_mi_hi,
     caml_int64_create_lo_hi:caml_int64_create_lo_hi,
     caml_int64_lo32:caml_int64_lo32,
     caml_int64_hi32:caml_int64_hi32,
     caml_int64_of_bytes:caml_int64_of_bytes,
     caml_int64_to_bytes:caml_int64_to_bytes,
     caml_int64_hash:caml_int64_hash,
     jsoo_floor_log2:jsoo_floor_log2,
     caml_int64_bits_of_float:caml_int64_bits_of_float,
     caml_int32_bits_of_float:caml_int32_bits_of_float,
     caml_hexstring_of_float:caml_hexstring_of_float,
     caml_int64_float_of_bits:caml_int64_float_of_bits,
     caml_nextafter_float:caml_nextafter_float,
     caml_trunc_float:caml_trunc_float,
     caml_int32_float_of_bits:caml_int32_float_of_bits,
     caml_classify_float:caml_classify_float,
     caml_modf_float:caml_modf_float,
     caml_ldexp_float:caml_ldexp_float,
     caml_frexp_float:caml_frexp_float,
     caml_float_compare:caml_float_compare,
     caml_copysign_float:caml_copysign_float,
     caml_signbit_float:caml_signbit_float,
     caml_expm1_float:caml_expm1_float,
     caml_exp2_float:caml_exp2_float,
     caml_log1p_float:caml_log1p_float,
     caml_log2_float:caml_log2_float,
     caml_hypot_float:caml_hypot_float,
     caml_log10_float:caml_log10_float,
     caml_cosh_float:caml_cosh_float,
     caml_acosh_float:caml_acosh_float,
     caml_sinh_float:caml_sinh_float,
     caml_asinh_float:caml_asinh_float,
     caml_tanh_float:caml_tanh_float,
     caml_atanh_float:caml_atanh_float,
     caml_round_float:caml_round_float,
     caml_cbrt_float:caml_cbrt_float,
     caml_erf_float:caml_erf_float,
     caml_erfc_float:caml_erfc_float,
     caml_fma_float:caml_fma_float,
     caml_format_float:caml_format_float,
     caml_float_of_string:caml_float_of_string,
     caml_hash_univ_param:caml_hash_univ_param,
     caml_hash_mix_int:caml_hash_mix_int,
     caml_hash_mix_final:caml_hash_mix_final,
     caml_hash_mix_float:caml_hash_mix_float,
     caml_hash_mix_int64:caml_hash_mix_int64,
     caml_hash_mix_jsbytes:caml_hash_mix_jsbytes,
     caml_hash_mix_bytes_arr:caml_hash_mix_bytes_arr,
     caml_hash_mix_bytes:caml_hash_mix_bytes,
     caml_hash_mix_string:caml_hash_mix_string,
     caml_hash:caml_hash,
     caml_gr_state:caml_gr_state,
     caml_gr_state_get:caml_gr_state_get,
     caml_gr_state_set:caml_gr_state_set,
     caml_gr_open_graph:caml_gr_open_graph,
     caml_gr_state_init:caml_gr_state_init,
     caml_gr_state_create:caml_gr_state_create,
     caml_gr_doc_of_state:caml_gr_doc_of_state,
     caml_gr_close_graph:caml_gr_close_graph,
     caml_gr_set_window_title:caml_gr_set_window_title,
     caml_gr_resize_window:caml_gr_resize_window,
     caml_gr_clear_graph:caml_gr_clear_graph,
     caml_gr_size_x:caml_gr_size_x,
     caml_gr_size_y:caml_gr_size_y,
     caml_gr_set_color:caml_gr_set_color,
     caml_gr_plot:caml_gr_plot,
     caml_gr_point_color:caml_gr_point_color,
     caml_gr_moveto:caml_gr_moveto,
     caml_gr_current_x:caml_gr_current_x,
     caml_gr_current_y:caml_gr_current_y,
     caml_gr_lineto:caml_gr_lineto,
     caml_gr_draw_rect:caml_gr_draw_rect,
     caml_gr_arc_aux:caml_gr_arc_aux,
     caml_gr_draw_arc:caml_gr_draw_arc,
     caml_gr_set_line_width:caml_gr_set_line_width,
     caml_gr_fill_rect:caml_gr_fill_rect,
     caml_gr_fill_poly:caml_gr_fill_poly,
     caml_gr_fill_arc:caml_gr_fill_arc,
     caml_gr_draw_str:caml_gr_draw_str,
     caml_gr_draw_char:caml_gr_draw_char,
     caml_gr_draw_string:caml_gr_draw_string,
     caml_gr_set_font:caml_gr_set_font,
     caml_gr_set_text_size:caml_gr_set_text_size,
     caml_gr_text_size:caml_gr_text_size,
     caml_gr_make_image:caml_gr_make_image,
     caml_gr_dump_image:caml_gr_dump_image,
     caml_gr_draw_image:caml_gr_draw_image,
     caml_gr_create_image:caml_gr_create_image,
     caml_gr_blit_image:caml_gr_blit_image,
     caml_gr_sigio_handler:caml_gr_sigio_handler,
     caml_gr_sigio_signal:caml_gr_sigio_signal,
     caml_gr_wait_event:caml_gr_wait_event,
     caml_gr_synchronize:caml_gr_synchronize,
     caml_gr_remember_mode:caml_gr_remember_mode,
     caml_gr_display_mode:caml_gr_display_mode,
     caml_gr_window_id:caml_gr_window_id,
     caml_gr_open_subwindow:caml_gr_open_subwindow,
     caml_gr_close_subwindow:caml_gr_close_subwindow,
     caml_gc_minor:caml_gc_minor,
     caml_gc_major:caml_gc_major,
     caml_gc_full_major:caml_gc_full_major,
     caml_gc_compaction:caml_gc_compaction,
     caml_gc_counters:caml_gc_counters,
     caml_gc_quick_stat:caml_gc_quick_stat,
     caml_gc_stat:caml_gc_stat,
     caml_gc_set:caml_gc_set,
     caml_gc_get:caml_gc_get,
     caml_memprof_set:caml_memprof_set,
     caml_final_register:caml_final_register,
     caml_final_register_called_without_value:
     caml_final_register_called_without_value,
     caml_final_release:caml_final_release,
     caml_memprof_start:caml_memprof_start,
     caml_memprof_stop:caml_memprof_stop,
     caml_eventlog_resume:caml_eventlog_resume,
     caml_eventlog_pause:caml_eventlog_pause,
     caml_gc_huge_fallback_count:caml_gc_huge_fallback_count,
     caml_gc_major_slice:caml_gc_major_slice,
     caml_gc_minor_words:caml_gc_minor_words,
     caml_get_minor_free:caml_get_minor_free,
     caml_get_major_bucket:caml_get_major_bucket,
     caml_get_major_credit:caml_get_major_credit,
     fs_node_supported:fs_node_supported,
     MlNodeDevice:MlNodeDevice,
     MlNodeFile:MlNodeFile,
     MlFakeDevice:MlFakeDevice,
     MlFakeFile:MlFakeFile,
     caml_trailing_slash:caml_trailing_slash,
     caml_current_dir:caml_current_dir,
     caml_get_root:caml_get_root,
     caml_root:caml_root,
     MlFile:MlFile,
     path_is_absolute:path_is_absolute,
     caml_make_path:caml_make_path,
     jsoo_mount_point:jsoo_mount_point,
     caml_list_mount_point:caml_list_mount_point,
     resolve_fs_device:resolve_fs_device,
     caml_mount_autoload:caml_mount_autoload,
     caml_unmount:caml_unmount,
     caml_sys_getcwd:caml_sys_getcwd,
     caml_sys_chdir:caml_sys_chdir,
     caml_raise_no_such_file:caml_raise_no_such_file,
     caml_raise_not_a_dir:caml_raise_not_a_dir,
     caml_sys_file_exists:caml_sys_file_exists,
     caml_sys_read_directory:caml_sys_read_directory,
     caml_sys_remove:caml_sys_remove,
     caml_sys_is_directory:caml_sys_is_directory,
     caml_sys_rename:caml_sys_rename,
     caml_sys_mkdir:caml_sys_mkdir,
     caml_sys_rmdir:caml_sys_rmdir,
     caml_ba_map_file:caml_ba_map_file,
     caml_ba_map_file_bytecode:caml_ba_map_file_bytecode,
     jsoo_create_file_extern:jsoo_create_file_extern,
     caml_fs_init:caml_fs_init,
     caml_create_file:caml_create_file,
     jsoo_create_file:jsoo_create_file,
     caml_read_file_content:caml_read_file_content,
     caml_parse_format:caml_parse_format,
     caml_finish_formatting:caml_finish_formatting,
     caml_raise_constant:caml_raise_constant,
     caml_return_exn_constant:caml_return_exn_constant,
     caml_raise_with_arg:caml_raise_with_arg,
     caml_raise_with_args:caml_raise_with_args,
     caml_raise_with_string:caml_raise_with_string,
     caml_failwith:caml_failwith,
     caml_invalid_argument:caml_invalid_argument,
     caml_raise_end_of_file:caml_raise_end_of_file,
     caml_raise_zero_divide:caml_raise_zero_divide,
     caml_raise_not_found:caml_raise_not_found,
     caml_array_bound_error:caml_array_bound_error,
     caml_compare_val_tag:caml_compare_val_tag,
     caml_compare_val_get_custom:caml_compare_val_get_custom,
     caml_compare_val_number_custom:caml_compare_val_number_custom,
     caml_compare_val:caml_compare_val,
     caml_compare:caml_compare,
     caml_int_compare:caml_int_compare,
     caml_equal:caml_equal,
     caml_notequal:caml_notequal,
     caml_greaterequal:caml_greaterequal,
     caml_greaterthan:caml_greaterthan,
     caml_lessequal:caml_lessequal,
     caml_lessthan:caml_lessthan,
     caml_blit_bigstring_to_bigstring:caml_blit_bigstring_to_bigstring,
     caml_blit_bigstring_to_string:caml_blit_bigstring_to_string,
     caml_blit_string_to_bigstring:caml_blit_string_to_bigstring,
     caml_hash_mix_bigstring:caml_hash_mix_bigstring,
     bigstring_to_array_buffer:bigstring_to_array_buffer,
     bigstring_to_typed_array:bigstring_to_typed_array,
     bigstring_of_array_buffer:bigstring_of_array_buffer,
     bigstring_of_typed_array:bigstring_of_typed_array,
     caml_bigstring_memcmp:caml_bigstring_memcmp,
     caml_bigstring_blit_ba_to_ba:caml_bigstring_blit_ba_to_ba,
     caml_bigstring_blit_string_to_ba:caml_bigstring_blit_string_to_ba,
     caml_bigstring_blit_bytes_to_ba:caml_bigstring_blit_bytes_to_ba,
     caml_bigstring_blit_ba_to_bytes:caml_bigstring_blit_ba_to_bytes,
     caml_ba_init:caml_ba_init,
     caml_ba_get_size:caml_ba_get_size,
     caml_ba_get_size_per_element:caml_ba_get_size_per_element,
     caml_ba_create_buffer:caml_ba_create_buffer,
     caml_ba_custom_name:caml_ba_custom_name,
     Ml_Bigarray:Ml_Bigarray,
     Ml_Bigarray_c_1_1:Ml_Bigarray_c_1_1,
     caml_ba_compare:caml_ba_compare,
     caml_ba_create_unsafe:caml_ba_create_unsafe,
     caml_ba_create:caml_ba_create,
     caml_ba_change_layout:caml_ba_change_layout,
     caml_ba_kind:caml_ba_kind,
     caml_ba_layout:caml_ba_layout,
     caml_ba_num_dims:caml_ba_num_dims,
     caml_ba_dim:caml_ba_dim,
     caml_ba_dim_1:caml_ba_dim_1,
     caml_ba_dim_2:caml_ba_dim_2,
     caml_ba_dim_3:caml_ba_dim_3,
     caml_ba_get_generic:caml_ba_get_generic,
     caml_ba_uint8_get16:caml_ba_uint8_get16,
     caml_ba_uint8_get32:caml_ba_uint8_get32,
     caml_ba_uint8_get64:caml_ba_uint8_get64,
     caml_ba_get_1:caml_ba_get_1,
     caml_ba_get_2:caml_ba_get_2,
     caml_ba_get_3:caml_ba_get_3,
     caml_ba_set_generic:caml_ba_set_generic,
     caml_ba_uint8_set16:caml_ba_uint8_set16,
     caml_ba_uint8_set32:caml_ba_uint8_set32,
     caml_ba_uint8_set64:caml_ba_uint8_set64,
     caml_ba_set_1:caml_ba_set_1,
     caml_ba_set_2:caml_ba_set_2,
     caml_ba_set_3:caml_ba_set_3,
     caml_ba_fill:caml_ba_fill,
     caml_ba_blit:caml_ba_blit,
     caml_ba_sub:caml_ba_sub,
     caml_ba_slice:caml_ba_slice,
     caml_ba_reshape:caml_ba_reshape,
     caml_ba_serialize:caml_ba_serialize,
     caml_ba_deserialize:caml_ba_deserialize,
     caml_ba_create_from:caml_ba_create_from,
     caml_ba_hash:caml_ba_hash,
     caml_ba_to_typed_array:caml_ba_to_typed_array,
     caml_ba_kind_of_typed_array:caml_ba_kind_of_typed_array,
     caml_ba_from_typed_array:caml_ba_from_typed_array,
     caml_ml_debug_info_status:caml_ml_debug_info_status,
     caml_backtrace_status:caml_backtrace_status,
     caml_get_exception_backtrace:caml_get_exception_backtrace,
     caml_get_exception_raw_backtrace:caml_get_exception_raw_backtrace,
     caml_record_backtrace:caml_record_backtrace,
     caml_convert_raw_backtrace:caml_convert_raw_backtrace,
     caml_raw_backtrace_length:caml_raw_backtrace_length,
     caml_raw_backtrace_next_slot:caml_raw_backtrace_next_slot,
     caml_raw_backtrace_slot:caml_raw_backtrace_slot,
     caml_restore_raw_backtrace:caml_restore_raw_backtrace,
     caml_get_current_callstack:caml_get_current_callstack,
     caml_convert_raw_backtrace_slot:caml_convert_raw_backtrace_slot,
     caml_array_sub:caml_array_sub,
     caml_array_append:caml_array_append,
     caml_array_concat:caml_array_concat,
     caml_array_blit:caml_array_blit,
     caml_floatarray_blit:caml_floatarray_blit,
     caml_array_set:caml_array_set,
     caml_array_get:caml_array_get,
     caml_array_fill:caml_array_fill,
     caml_check_bound:caml_check_bound,
     caml_make_vect:caml_make_vect,
     caml_make_float_vect:caml_make_float_vect,
     caml_floatarray_create:caml_floatarray_create};
    caml_fs_init();
    caml_register_global
     (0,[248,caml_string_of_jsbytes("Out_of_memory"),-1],"Out_of_memory");
    caml_register_global
     (1,[248,caml_string_of_jsbytes("Sys_error"),-2],"Sys_error");
    caml_register_global
     (2,[248,caml_string_of_jsbytes("Failure"),-3],"Failure");
    caml_register_global
     (3,
      [248,caml_string_of_jsbytes("Invalid_argument"),-4],
      "Invalid_argument");
    caml_register_global
     (4,[248,caml_string_of_jsbytes("End_of_file"),-5],"End_of_file");
    caml_register_global
     (5,
      [248,caml_string_of_jsbytes("Division_by_zero"),-6],
      "Division_by_zero");
    caml_register_global
     (6,[248,caml_string_of_jsbytes("Not_found"),-7],"Not_found");
    caml_register_global
     (7,[248,caml_string_of_jsbytes("Match_failure"),-8],"Match_failure");
    caml_register_global
     (8,[248,caml_string_of_jsbytes("Stack_overflow"),-9],"Stack_overflow");
    caml_register_global
     (9,[248,caml_string_of_jsbytes("Sys_blocked_io"),-10],"Sys_blocked_io");
    caml_register_global
     (10,[248,caml_string_of_jsbytes("Assert_failure"),-11],"Assert_failure");
    caml_register_global
     (11,
      [248,caml_string_of_jsbytes("Undefined_recursive_module"),-12],
      "Undefined_recursive_module");
    return}
  (globalThis));


//# 1 "../.js/stdlib/stdlib.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_array_concat=runtime.caml_array_concat,
     caml_array_get=runtime.caml_array_get,
     caml_array_set=runtime.caml_array_set,
     caml_array_sub=runtime.caml_array_sub,
     caml_ba_change_layout=runtime.caml_ba_change_layout,
     caml_ba_create=runtime.caml_ba_create,
     caml_ba_dim_1=runtime.caml_ba_dim_1,
     caml_ba_dim_2=runtime.caml_ba_dim_2,
     caml_ba_kind=runtime.caml_ba_kind,
     caml_ba_num_dims=runtime.caml_ba_num_dims,
     caml_ba_reshape=runtime.caml_ba_reshape,
     caml_ba_set_1=runtime.caml_ba_set_1,
     caml_ba_set_2=runtime.caml_ba_set_2,
     caml_ba_set_3=runtime.caml_ba_set_3,
     caml_ba_set_generic=runtime.caml_ba_set_generic,
     caml_ba_slice=runtime.caml_ba_slice,
     caml_blit_bytes=runtime.caml_blit_bytes,
     caml_blit_string=runtime.caml_blit_string,
     caml_bswap16=runtime.caml_bswap16,
     caml_bytes_get=runtime.caml_bytes_get,
     caml_bytes_get16=runtime.caml_bytes_get16,
     caml_bytes_get32=runtime.caml_bytes_get32,
     caml_bytes_get64=runtime.caml_bytes_get64,
     caml_bytes_of_string=runtime.caml_bytes_of_string,
     caml_bytes_set=runtime.caml_bytes_set,
     caml_bytes_set16=runtime.caml_bytes_set16,
     caml_bytes_set32=runtime.caml_bytes_set32,
     caml_bytes_set64=runtime.caml_bytes_set64,
     caml_bytes_unsafe_get=runtime.caml_bytes_unsafe_get,
     caml_bytes_unsafe_set=runtime.caml_bytes_unsafe_set,
     caml_check_bound=runtime.caml_check_bound,
     caml_compare=runtime.caml_compare,
     caml_create_bytes=runtime.caml_create_bytes,
     caml_div=runtime.caml_div,
     caml_ephe_set_key=runtime.caml_ephe_set_key,
     caml_ephe_unset_key=runtime.caml_ephe_unset_key,
     caml_equal=runtime.caml_equal,
     caml_fill_bytes=runtime.caml_fill_bytes,
     caml_float_compare=runtime.caml_float_compare,
     caml_float_of_string=runtime.caml_float_of_string,
     caml_floatarray_blit=runtime.caml_floatarray_blit,
     caml_floatarray_create=runtime.caml_floatarray_create,
     caml_format_float=runtime.caml_format_float,
     caml_format_int=runtime.caml_format_int,
     caml_fresh_oo_id=runtime.caml_fresh_oo_id,
     caml_get_exception_raw_backtra=runtime.caml_get_exception_raw_backtrace,
     caml_get_public_method=runtime.caml_get_public_method,
     caml_greaterequal=runtime.caml_greaterequal,
     caml_greaterthan=runtime.caml_greaterthan,
     caml_hash=runtime.caml_hash,
     caml_input_value=runtime.caml_input_value,
     caml_int32_bswap=runtime.caml_int32_bswap,
     caml_int64_add=runtime.caml_int64_add,
     caml_int64_bswap=runtime.caml_int64_bswap,
     caml_int64_compare=runtime.caml_int64_compare,
     caml_int64_float_of_bits=runtime.caml_int64_float_of_bits,
     caml_int64_format=runtime.caml_int64_format,
     caml_int64_mul=runtime.caml_int64_mul,
     caml_int64_of_int32=runtime.caml_int64_of_int32,
     caml_int64_of_string=runtime.caml_int64_of_string,
     caml_int64_or=runtime.caml_int64_or,
     caml_int64_shift_left=runtime.caml_int64_shift_left,
     caml_int64_shift_right_unsigne=runtime.caml_int64_shift_right_unsigned,
     caml_int64_sub=runtime.caml_int64_sub,
     caml_int_compare=runtime.caml_int_compare,
     caml_int_of_string=runtime.caml_int_of_string,
     caml_lessequal=runtime.caml_lessequal,
     caml_lessthan=runtime.caml_lessthan,
     caml_make_vect=runtime.caml_make_vect,
     caml_marshal_data_size=runtime.caml_marshal_data_size,
     caml_md5_string=runtime.caml_md5_string,
     caml_ml_bytes_length=runtime.caml_ml_bytes_length,
     caml_ml_channel_size=runtime.caml_ml_channel_size,
     caml_ml_channel_size_64=runtime.caml_ml_channel_size_64,
     caml_ml_close_channel=runtime.caml_ml_close_channel,
     caml_ml_flush=runtime.caml_ml_flush,
     caml_ml_input=runtime.caml_ml_input,
     caml_ml_input_char=runtime.caml_ml_input_char,
     caml_ml_open_descriptor_in=runtime.caml_ml_open_descriptor_in,
     caml_ml_open_descriptor_out=runtime.caml_ml_open_descriptor_out,
     caml_ml_output=runtime.caml_ml_output,
     caml_ml_output_bytes=runtime.caml_ml_output_bytes,
     caml_ml_output_char=runtime.caml_ml_output_char,
     caml_ml_pos_in=runtime.caml_ml_pos_in,
     caml_ml_set_binary_mode=runtime.caml_ml_set_binary_mode,
     caml_ml_set_channel_name=runtime.caml_ml_set_channel_name,
     caml_ml_string_length=runtime.caml_ml_string_length,
     caml_mod=runtime.caml_mod,
     caml_mul=runtime.caml_mul,
     caml_nextafter_float=runtime.caml_nextafter_float,
     caml_notequal=runtime.caml_notequal,
     caml_obj_block=runtime.caml_obj_block,
     caml_obj_make_forward=runtime.caml_obj_make_forward,
     caml_obj_tag=runtime.caml_obj_tag,
     caml_output_value=runtime.caml_output_value,
     caml_register_global=runtime.caml_register_global,
     caml_register_named_value=runtime.caml_register_named_value,
     caml_restore_raw_backtrace=runtime.caml_restore_raw_backtrace,
     caml_set_oo_id=runtime.caml_set_oo_id,
     caml_signbit_float=runtime.caml_signbit_float,
     caml_string_compare=runtime.caml_string_compare,
     caml_string_equal=runtime.caml_string_equal,
     caml_string_get=runtime.caml_string_get,
     caml_string_notequal=runtime.caml_string_notequal,
     caml_string_of_bytes=runtime.caml_string_of_bytes,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes,
     caml_string_unsafe_get=runtime.caml_string_unsafe_get,
     caml_sys_argv=runtime.caml_sys_argv,
     caml_sys_getenv=runtime.caml_sys_getenv,
     caml_sys_open=runtime.caml_sys_open,
     caml_sys_random_seed=runtime.caml_sys_random_seed,
     caml_trampoline=runtime.caml_trampoline,
     caml_trampoline_return=runtime.caml_trampoline_return,
     caml_wrap_exception=runtime.caml_wrap_exception;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    function caml_call5(f,a0,a1,a2,a3,a4)
     {return f.length == 5
              ?f(a0,a1,a2,a3,a4)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4])}
    function caml_call7(f,a0,a1,a2,a3,a4,a5,a6)
     {return f.length == 7
              ?f(a0,a1,a2,a3,a4,a5,a6)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5,a6])}
    var
     global_data=runtime.caml_get_global_data(),
     cst$0=caml_string_of_jsbytes("%,"),
     cst_really_input=caml_string_of_jsbytes("really_input"),
     cst_input=caml_string_of_jsbytes("input"),
     cst_output_substring=caml_string_of_jsbytes("output_substring"),
     cst_output=caml_string_of_jsbytes("output"),
     cst_12g=caml_string_of_jsbytes("%.12g"),
     cst=caml_string_of_jsbytes("."),
     cst_false$1=caml_string_of_jsbytes("false"),
     cst_true$1=caml_string_of_jsbytes("true"),
     cst_false$0=caml_string_of_jsbytes("false"),
     cst_true$0=caml_string_of_jsbytes("true"),
     cst_bool_of_string=caml_string_of_jsbytes("bool_of_string"),
     cst_true=caml_string_of_jsbytes("true"),
     cst_false=caml_string_of_jsbytes("false"),
     cst_char_of_int=caml_string_of_jsbytes("char_of_int"),
     cst_Stdlib_Exit=caml_string_of_jsbytes("Stdlib.Exit"),
     cst_Stdlib_Pervasives_Exit=
      caml_string_of_jsbytes("Stdlib.Pervasives.Exit"),
     cst_Stdlib_Sys_Break=caml_string_of_jsbytes("Stdlib.Sys.Break"),
     ocaml_version=caml_string_of_jsbytes("4.14.0"),
     ocaml_release=[0,4,14,0,0],
     cst_Obj_Ephemeron_blit_key=
      caml_string_of_jsbytes("Obj.Ephemeron.blit_key"),
     cst_Obj_Ephemeron_check_key=
      caml_string_of_jsbytes("Obj.Ephemeron.check_key"),
     cst_Obj_Ephemeron_unset_key=
      caml_string_of_jsbytes("Obj.Ephemeron.unset_key"),
     cst_Obj_Ephemeron_set_key=caml_string_of_jsbytes("Obj.Ephemeron.set_key"),
     cst_Obj_Ephemeron_get_key_copy=
      caml_string_of_jsbytes("Obj.Ephemeron.get_key_copy"),
     cst_Obj_Ephemeron_get_key=caml_string_of_jsbytes("Obj.Ephemeron.get_key"),
     cst_Obj_Ephemeron_create=caml_string_of_jsbytes("Obj.Ephemeron.create"),
     cst_Obj_extension_constructor$0=
      caml_string_of_jsbytes("Obj.extension_constructor"),
     cst_Obj_extension_constructor=
      caml_string_of_jsbytes("Obj.extension_constructor"),
     cst_CamlinternalLazy_Undefined=
      caml_string_of_jsbytes("CamlinternalLazy.Undefined"),
     cst_Seq_drop=caml_string_of_jsbytes("Seq.drop"),
     cst_Seq_take=caml_string_of_jsbytes("Seq.take"),
     cst_Seq_init=caml_string_of_jsbytes("Seq.init"),
     cst_Stdlib_Seq_Forced_twice=
      caml_string_of_jsbytes("Stdlib.Seq.Forced_twice"),
     cst_option_is_None=caml_string_of_jsbytes("option is None"),
     cst_result_is_Ok=caml_string_of_jsbytes("result is Ok _"),
     cst_result_is_Error=caml_string_of_jsbytes("result is Error _"),
     cst_true$2=caml_string_of_jsbytes("true"),
     cst_false$2=caml_string_of_jsbytes("false"),
     cst$1=caml_string_of_jsbytes("\\\\"),
     cst$2=caml_string_of_jsbytes("\\'"),
     cst_b=caml_string_of_jsbytes("\\b"),
     cst_t=caml_string_of_jsbytes("\\t"),
     cst_n=caml_string_of_jsbytes("\\n"),
     cst_r=caml_string_of_jsbytes("\\r"),
     cst_Char_chr=caml_string_of_jsbytes("Char.chr"),
     cst_is_not_a_latin1_character=
      caml_string_of_jsbytes(" is not a latin1 character"),
     cst_04X=caml_string_of_jsbytes("%04X"),
     cst_U=caml_string_of_jsbytes("U+"),
     cst_is_not_an_Unicode_scalar_v=
      caml_string_of_jsbytes(" is not an Unicode scalar value"),
     cst_X=caml_string_of_jsbytes("%X"),
     err_no_pred=caml_string_of_jsbytes("U+0000 has no predecessor"),
     err_no_succ=caml_string_of_jsbytes("U+10FFFF has no successor"),
     cst_List_map2=caml_string_of_jsbytes("List.map2"),
     cst_List_iter2=caml_string_of_jsbytes("List.iter2"),
     cst_List_fold_left2=caml_string_of_jsbytes("List.fold_left2"),
     cst_List_fold_right2=caml_string_of_jsbytes("List.fold_right2"),
     cst_List_for_all2=caml_string_of_jsbytes("List.for_all2"),
     cst_List_exists2=caml_string_of_jsbytes("List.exists2"),
     cst_List_combine=caml_string_of_jsbytes("List.combine"),
     cst_List_rev_map2=caml_string_of_jsbytes("List.rev_map2"),
     cst_List_init=caml_string_of_jsbytes("List.init"),
     cst_List_nth$0=caml_string_of_jsbytes("List.nth"),
     cst_nth=caml_string_of_jsbytes("nth"),
     cst_List_nth=caml_string_of_jsbytes("List.nth"),
     cst_tl=caml_string_of_jsbytes("tl"),
     cst_hd=caml_string_of_jsbytes("hd"),
     cst_index_out_of_bounds$2=caml_string_of_jsbytes("index out of bounds"),
     cst_index_out_of_bounds$1=caml_string_of_jsbytes("index out of bounds"),
     cst_index_out_of_bounds$0=caml_string_of_jsbytes("index out of bounds"),
     cst_index_out_of_bounds=caml_string_of_jsbytes("index out of bounds"),
     cst_Bytes_of_seq_cannot_grow_b=
      caml_string_of_jsbytes("Bytes.of_seq: cannot grow bytes"),
     cst_String_rcontains_from_Byte=
      caml_string_of_jsbytes("String.rcontains_from / Bytes.rcontains_from"),
     cst_String_contains_from_Bytes=
      caml_string_of_jsbytes("String.contains_from / Bytes.contains_from"),
     cst_String_rindex_from_opt_Byt=
      caml_string_of_jsbytes("String.rindex_from_opt / Bytes.rindex_from_opt"),
     cst_String_rindex_from_Bytes_r=
      caml_string_of_jsbytes("String.rindex_from / Bytes.rindex_from"),
     cst_String_index_from_opt_Byte=
      caml_string_of_jsbytes("String.index_from_opt / Bytes.index_from_opt"),
     cst_String_index_from_Bytes_in=
      caml_string_of_jsbytes("String.index_from / Bytes.index_from"),
     cst_Bytes_concat=caml_string_of_jsbytes("Bytes.concat"),
     cst_String_blit_Bytes_blit_str=
      caml_string_of_jsbytes("String.blit / Bytes.blit_string"),
     cst_Bytes_blit=caml_string_of_jsbytes("Bytes.blit"),
     cst_String_fill_Bytes_fill=
      caml_string_of_jsbytes("String.fill / Bytes.fill"),
     cst_Bytes_extend=caml_string_of_jsbytes("Bytes.extend"),
     cst_String_sub_Bytes_sub=caml_string_of_jsbytes("String.sub / Bytes.sub"),
     cst_String_rcontains_from_Byte$0=
      caml_string_of_jsbytes("String.rcontains_from / Bytes.rcontains_from"),
     cst_String_contains_from_Bytes$0=
      caml_string_of_jsbytes("String.contains_from / Bytes.contains_from"),
     cst_String_rindex_from_opt_Byt$0=
      caml_string_of_jsbytes("String.rindex_from_opt / Bytes.rindex_from_opt"),
     cst_String_rindex_from_Bytes_r$0=
      caml_string_of_jsbytes("String.rindex_from / Bytes.rindex_from"),
     cst_String_index_from_opt_Byte$0=
      caml_string_of_jsbytes("String.index_from_opt / Bytes.index_from_opt"),
     cst_String_index_from_Bytes_in$0=
      caml_string_of_jsbytes("String.index_from / Bytes.index_from"),
     cst$4=caml_string_of_jsbytes(""),
     cst$3=caml_string_of_jsbytes(""),
     cst_String_concat=caml_string_of_jsbytes("String.concat"),
     empty$1=caml_string_of_jsbytes(""),
     cst$5=caml_string_of_jsbytes("()"),
     cst_Marshal_from_bytes=caml_string_of_jsbytes("Marshal.from_bytes"),
     cst_Marshal_from_bytes$0=caml_string_of_jsbytes("Marshal.from_bytes"),
     cst_Marshal_data_size=caml_string_of_jsbytes("Marshal.data_size"),
     cst_Marshal_to_buffer_substrin=
      caml_string_of_jsbytes("Marshal.to_buffer: substring out of bounds"),
     cst_Array_combine=caml_string_of_jsbytes("Array.combine"),
     cst_Array_exists2=caml_string_of_jsbytes("Array.exists2"),
     cst_Array_for_all2=caml_string_of_jsbytes("Array.for_all2"),
     cst_Array_map2_arrays_must_hav=
      caml_string_of_jsbytes("Array.map2: arrays must have the same length"),
     cst_Array_iter2_arrays_must_ha=
      caml_string_of_jsbytes("Array.iter2: arrays must have the same length"),
     cst_Array_blit=caml_string_of_jsbytes("Array.blit"),
     cst_Array_fill=caml_string_of_jsbytes("Array.fill"),
     cst_Array_sub=caml_string_of_jsbytes("Array.sub"),
     cst_Array_init=caml_string_of_jsbytes("Array.init"),
     cst_Stdlib_Array_Bottom=caml_string_of_jsbytes("Stdlib.Array.Bottom"),
     cst_Float_Array_map2_arrays_mu=
      caml_string_of_jsbytes
       ("Float.Array.map2: arrays must have the same length"),
     cst_Float_Array_iter2_arrays_m=
      caml_string_of_jsbytes
       ("Float.Array.iter2: arrays must have the same length"),
     cst_Float_array_blit=caml_string_of_jsbytes("Float.array.blit"),
     cst_Float_array_blit$0=caml_string_of_jsbytes("Float.array.blit"),
     cst_Float_Array_fill=caml_string_of_jsbytes("Float.Array.fill"),
     cst_Float_Array_sub=caml_string_of_jsbytes("Float.Array.sub"),
     cst_Float_Array_concat=caml_string_of_jsbytes("Float.Array.concat"),
     cst_Float_Array_init=caml_string_of_jsbytes("Float.Array.init"),
     cst_Stdlib_Float_Array_Bottom=
      caml_string_of_jsbytes("Stdlib.Float.Array.Bottom"),
     cst_d=caml_string_of_jsbytes("%d"),
     cst_d$0=caml_string_of_jsbytes("%d"),
     zero$2=runtime.caml_int64_create_lo_mi_hi(0,0,0),
     one$2=runtime.caml_int64_create_lo_mi_hi(1,0,0),
     minus_one$2=runtime.caml_int64_create_lo_mi_hi(16777215,16777215,65535),
     min_int$2=runtime.caml_int64_create_lo_mi_hi(0,0,32768),
     max_int$2=runtime.caml_int64_create_lo_mi_hi(16777215,16777215,32767),
     cst_d$1=caml_string_of_jsbytes("%d"),
     cst_Lexing_lex_refill_cannot_g=
      caml_string_of_jsbytes("Lexing.lex_refill: cannot grow buffer"),
     dummy_pos=[0,caml_string_of_jsbytes(""),0,0,-1],
     zero_pos=[0,caml_string_of_jsbytes(""),1,0,0],
     cst_syntax_error=caml_string_of_jsbytes("syntax error"),
     cst_Stdlib_Parsing_YYexit=caml_string_of_jsbytes("Stdlib.Parsing.YYexit"),
     cst_Stdlib_Parsing_Parse_error=
      caml_string_of_jsbytes("Stdlib.Parsing.Parse_error"),
     cst_Set_remove_min_elt=caml_string_of_jsbytes("Set.remove_min_elt"),
     cst_Set_bal=caml_string_of_jsbytes("Set.bal"),
     cst_Set_bal$0=caml_string_of_jsbytes("Set.bal"),
     cst_Set_bal$1=caml_string_of_jsbytes("Set.bal"),
     cst_Set_bal$2=caml_string_of_jsbytes("Set.bal"),
     cst_Map_remove_min_elt=caml_string_of_jsbytes("Map.remove_min_elt"),
     cst_Map_bal=caml_string_of_jsbytes("Map.bal"),
     cst_Map_bal$0=caml_string_of_jsbytes("Map.bal"),
     cst_Map_bal$1=caml_string_of_jsbytes("Map.bal"),
     cst_Map_bal$2=caml_string_of_jsbytes("Map.bal"),
     cst_Stdlib_Stack_Empty=caml_string_of_jsbytes("Stdlib.Stack.Empty"),
     cst_Stdlib_Queue_Empty=caml_string_of_jsbytes("Stdlib.Queue.Empty"),
     cst_count=caml_string_of_jsbytes("{count = "),
     cst_data=caml_string_of_jsbytes("; data = "),
     cst$6=caml_string_of_jsbytes("}"),
     cst_Sempty=caml_string_of_jsbytes("Sempty"),
     cst_Scons=caml_string_of_jsbytes("Scons ("),
     cst$7=caml_string_of_jsbytes(", "),
     cst$8=caml_string_of_jsbytes(")"),
     cst_Sapp=caml_string_of_jsbytes("Sapp ("),
     cst$9=caml_string_of_jsbytes(", "),
     cst$10=caml_string_of_jsbytes(")"),
     cst_Slazy=caml_string_of_jsbytes("Slazy"),
     cst_Sgen=caml_string_of_jsbytes("Sgen"),
     cst_Sbuffio=caml_string_of_jsbytes("Sbuffio"),
     cst_Stdlib_Stream_Failure=caml_string_of_jsbytes("Stdlib.Stream.Failure"),
     cst_Stdlib_Stream_Error=caml_string_of_jsbytes("Stdlib.Stream.Error"),
     cst_Buffer_truncate=caml_string_of_jsbytes("Buffer.truncate"),
     cst_Buffer_add_channel=caml_string_of_jsbytes("Buffer.add_channel"),
     cst_Buffer_add_substring_add_s=
      caml_string_of_jsbytes("Buffer.add_substring/add_subbytes"),
     cst_Buffer_add_cannot_grow_buf=
      caml_string_of_jsbytes("Buffer.add: cannot grow buffer"),
     cst_Buffer_nth=caml_string_of_jsbytes("Buffer.nth"),
     cst_Buffer_blit=caml_string_of_jsbytes("Buffer.blit"),
     cst_Buffer_sub=caml_string_of_jsbytes("Buffer.sub"),
     cst_c=caml_string_of_jsbytes("%c"),
     cst_s=caml_string_of_jsbytes("%s"),
     cst_i=caml_string_of_jsbytes("%i"),
     cst_li=caml_string_of_jsbytes("%li"),
     cst_ni=caml_string_of_jsbytes("%ni"),
     cst_Li=caml_string_of_jsbytes("%Li"),
     cst_f=caml_string_of_jsbytes("%f"),
     cst_B=caml_string_of_jsbytes("%B"),
     cst$21=caml_string_of_jsbytes("%{"),
     cst$22=caml_string_of_jsbytes("%}"),
     cst$23=caml_string_of_jsbytes("%("),
     cst$24=caml_string_of_jsbytes("%)"),
     cst_a=caml_string_of_jsbytes("%a"),
     cst_t$0=caml_string_of_jsbytes("%t"),
     cst$25=caml_string_of_jsbytes("%?"),
     cst_r$0=caml_string_of_jsbytes("%r"),
     cst_r$1=caml_string_of_jsbytes("%_r"),
     cst_u$0=caml_string_of_jsbytes("%u"),
     cst_Printf_bad_conversion=
      caml_string_of_jsbytes("Printf: bad conversion %["),
     cst_Printf_bad_conversion$0=
      caml_string_of_jsbytes("Printf: bad conversion %_"),
     cst$30=caml_string_of_jsbytes("@{"),
     cst$31=caml_string_of_jsbytes("@["),
     cst$32=caml_string_of_jsbytes("@{"),
     cst$33=caml_string_of_jsbytes("@["),
     cst$34=caml_string_of_jsbytes("@{"),
     cst$35=caml_string_of_jsbytes("@["),
     cst_0=caml_string_of_jsbytes("0"),
     cst_padding=caml_string_of_jsbytes("padding"),
     cst_precision=caml_string_of_jsbytes("precision"),
     cst$40=caml_string_of_jsbytes("'*'"),
     cst$38=caml_string_of_jsbytes("'-'"),
     cst_0$2=caml_string_of_jsbytes("'0'"),
     cst$39=caml_string_of_jsbytes("'*'"),
     cst_0$0=caml_string_of_jsbytes("0"),
     cst_0$1=caml_string_of_jsbytes("0"),
     cst_precision$0=caml_string_of_jsbytes("precision"),
     cst_precision$1=caml_string_of_jsbytes("precision"),
     cst$41=caml_string_of_jsbytes("'+'"),
     cst$42=caml_string_of_jsbytes("'#'"),
     cst$43=caml_string_of_jsbytes("' '"),
     cst_padding$0=caml_string_of_jsbytes("`padding'"),
     cst_precision$2=caml_string_of_jsbytes("`precision'"),
     cst$44=caml_string_of_jsbytes("'+'"),
     cst$45=caml_string_of_jsbytes("'_'"),
     sub_format=[0,0,caml_string_of_jsbytes("")],
     formatting_lit=[0,caml_string_of_jsbytes("@;"),1,0],
     cst_digit=caml_string_of_jsbytes("digit"),
     cst_character=caml_string_of_jsbytes("character ')'"),
     cst_character$0=caml_string_of_jsbytes("character '}'"),
     cst$49=caml_string_of_jsbytes("'#'"),
     cst$46=caml_string_of_jsbytes("'+'"),
     cst$47=caml_string_of_jsbytes("'+'"),
     cst$48=caml_string_of_jsbytes("' '"),
     cst$50=caml_string_of_jsbytes("'+'"),
     cst_non_zero_widths_are_unsupp=
      caml_string_of_jsbytes
       ("non-zero widths are unsupported for %c conversions"),
     cst_unexpected_end_of_format=
      caml_string_of_jsbytes("unexpected end of format"),
     cst$36=caml_string_of_jsbytes(""),
     cst$37=caml_string_of_jsbytes(""),
     cst_b$0=caml_string_of_jsbytes("b"),
     cst_h=caml_string_of_jsbytes("h"),
     cst_hov=caml_string_of_jsbytes("hov"),
     cst_hv=caml_string_of_jsbytes("hv"),
     cst_v=caml_string_of_jsbytes("v"),
     cst_nan=caml_string_of_jsbytes("nan"),
     cst_neg_infinity=caml_string_of_jsbytes("neg_infinity"),
     cst_infinity=caml_string_of_jsbytes("infinity"),
     cst$29=caml_string_of_jsbytes("."),
     cst_nd$0=caml_string_of_jsbytes("%+nd"),
     cst_nd$1=caml_string_of_jsbytes("% nd"),
     cst_ni$1=caml_string_of_jsbytes("%+ni"),
     cst_ni$2=caml_string_of_jsbytes("% ni"),
     cst_nx=caml_string_of_jsbytes("%nx"),
     cst_nx$0=caml_string_of_jsbytes("%#nx"),
     cst_nX=caml_string_of_jsbytes("%nX"),
     cst_nX$0=caml_string_of_jsbytes("%#nX"),
     cst_no=caml_string_of_jsbytes("%no"),
     cst_no$0=caml_string_of_jsbytes("%#no"),
     cst_nd=caml_string_of_jsbytes("%nd"),
     cst_ni$0=caml_string_of_jsbytes("%ni"),
     cst_nu=caml_string_of_jsbytes("%nu"),
     cst_ld$0=caml_string_of_jsbytes("%+ld"),
     cst_ld$1=caml_string_of_jsbytes("% ld"),
     cst_li$1=caml_string_of_jsbytes("%+li"),
     cst_li$2=caml_string_of_jsbytes("% li"),
     cst_lx=caml_string_of_jsbytes("%lx"),
     cst_lx$0=caml_string_of_jsbytes("%#lx"),
     cst_lX=caml_string_of_jsbytes("%lX"),
     cst_lX$0=caml_string_of_jsbytes("%#lX"),
     cst_lo=caml_string_of_jsbytes("%lo"),
     cst_lo$0=caml_string_of_jsbytes("%#lo"),
     cst_ld=caml_string_of_jsbytes("%ld"),
     cst_li$0=caml_string_of_jsbytes("%li"),
     cst_lu=caml_string_of_jsbytes("%lu"),
     cst_Ld$0=caml_string_of_jsbytes("%+Ld"),
     cst_Ld$1=caml_string_of_jsbytes("% Ld"),
     cst_Li$1=caml_string_of_jsbytes("%+Li"),
     cst_Li$2=caml_string_of_jsbytes("% Li"),
     cst_Lx=caml_string_of_jsbytes("%Lx"),
     cst_Lx$0=caml_string_of_jsbytes("%#Lx"),
     cst_LX=caml_string_of_jsbytes("%LX"),
     cst_LX$0=caml_string_of_jsbytes("%#LX"),
     cst_Lo=caml_string_of_jsbytes("%Lo"),
     cst_Lo$0=caml_string_of_jsbytes("%#Lo"),
     cst_Ld=caml_string_of_jsbytes("%Ld"),
     cst_Li$0=caml_string_of_jsbytes("%Li"),
     cst_Lu=caml_string_of_jsbytes("%Lu"),
     cst_d$3=caml_string_of_jsbytes("%+d"),
     cst_d$4=caml_string_of_jsbytes("% d"),
     cst_i$1=caml_string_of_jsbytes("%+i"),
     cst_i$2=caml_string_of_jsbytes("% i"),
     cst_x=caml_string_of_jsbytes("%x"),
     cst_x$0=caml_string_of_jsbytes("%#x"),
     cst_X$0=caml_string_of_jsbytes("%X"),
     cst_X$1=caml_string_of_jsbytes("%#X"),
     cst_o=caml_string_of_jsbytes("%o"),
     cst_o$0=caml_string_of_jsbytes("%#o"),
     cst_d$2=caml_string_of_jsbytes("%d"),
     cst_i$0=caml_string_of_jsbytes("%i"),
     cst_u=caml_string_of_jsbytes("%u"),
     cst$26=caml_string_of_jsbytes("%!"),
     cst$27=caml_string_of_jsbytes("@{"),
     cst$28=caml_string_of_jsbytes("@["),
     cst_0c=caml_string_of_jsbytes("0c"),
     cst$20=caml_string_of_jsbytes("%%"),
     cst$12=caml_string_of_jsbytes("@]"),
     cst$13=caml_string_of_jsbytes("@}"),
     cst$14=caml_string_of_jsbytes("@?"),
     cst$15=caml_string_of_jsbytes("@\n"),
     cst$16=caml_string_of_jsbytes("@."),
     cst$17=caml_string_of_jsbytes("@@"),
     cst$18=caml_string_of_jsbytes("@%"),
     cst$19=caml_string_of_jsbytes("@"),
     cst$11=caml_string_of_jsbytes(".*"),
     cst_CamlinternalFormat_Type_mi=
      caml_string_of_jsbytes("CamlinternalFormat.Type_mismatch"),
     cst$58=caml_string_of_jsbytes(""),
     cst$59=caml_string_of_jsbytes("\n"),
     cst_a_boolean=caml_string_of_jsbytes("a boolean"),
     cst_an_integer=caml_string_of_jsbytes("an integer"),
     cst_an_integer$0=caml_string_of_jsbytes("an integer"),
     cst_a_float=caml_string_of_jsbytes("a float"),
     cst_a_float$0=caml_string_of_jsbytes("a float"),
     cst$55=caml_string_of_jsbytes(""),
     cst$56=caml_string_of_jsbytes(" "),
     cst$57=caml_string_of_jsbytes(""),
     cst_one_of=caml_string_of_jsbytes("one of: "),
     cst_Arg_Expand_is_is_only_allo=
      caml_string_of_jsbytes
       ("Arg.Expand is is only allowed with Arg.parse_and_expand_argv_dynamic"),
     cst_no_argument=caml_string_of_jsbytes("no argument"),
     cst$54=caml_string_of_jsbytes("(?)"),
     cst_help$3=caml_string_of_jsbytes("--help"),
     cst_help$4=caml_string_of_jsbytes("-help"),
     cst_help$2=caml_string_of_jsbytes("-help"),
     cst_Display_this_list_of_optio=
      caml_string_of_jsbytes(" Display this list of options"),
     cst_help=caml_string_of_jsbytes("-help"),
     cst_help$1=caml_string_of_jsbytes("--help"),
     cst_Display_this_list_of_optio$0=
      caml_string_of_jsbytes(" Display this list of options"),
     cst_help$0=caml_string_of_jsbytes("--help"),
     cst$51=caml_string_of_jsbytes("}"),
     cst$52=caml_string_of_jsbytes("|"),
     cst$53=caml_string_of_jsbytes("{"),
     cst_none=caml_string_of_jsbytes("<none>"),
     cst_Stdlib_Arg_Bad=caml_string_of_jsbytes("Stdlib.Arg.Bad"),
     cst_Stdlib_Arg_Help=caml_string_of_jsbytes("Stdlib.Arg.Help"),
     cst_Stdlib_Arg_Stop=caml_string_of_jsbytes("Stdlib.Arg.Stop"),
     cst$61=caml_string_of_jsbytes(""),
     cst_Fatal_error_out_of_memory_=
      caml_string_of_jsbytes
       ("Fatal error: out of memory in uncaught exception handler"),
     cst$65=caml_string_of_jsbytes(""),
     cst_Program_not_linked_with_g_=
      caml_string_of_jsbytes
       ("(Program not linked with -g, cannot print stack backtrace)\n"),
     cst_Raised_at=caml_string_of_jsbytes("Raised at"),
     cst_Re_raised_at=caml_string_of_jsbytes("Re-raised at"),
     cst_Raised_by_primitive_operat=
      caml_string_of_jsbytes("Raised by primitive operation at"),
     cst_Called_from=caml_string_of_jsbytes("Called from"),
     cst_inlined=caml_string_of_jsbytes(" (inlined)"),
     cst$64=caml_string_of_jsbytes(""),
     partial=[4,0,0,0,[12,45,[4,0,0,0,0]]],
     cst_Out_of_memory=caml_string_of_jsbytes("Out of memory"),
     cst_Stack_overflow=caml_string_of_jsbytes("Stack overflow"),
     cst_Pattern_matching_failed=
      caml_string_of_jsbytes("Pattern matching failed"),
     cst_Assertion_failed=caml_string_of_jsbytes("Assertion failed"),
     cst_Undefined_recursive_module=
      caml_string_of_jsbytes("Undefined recursive module"),
     cst$62=caml_string_of_jsbytes(""),
     cst$63=caml_string_of_jsbytes(""),
     cst$60=caml_string_of_jsbytes("_"),
     locfmt=
      [0,
       [11,
        caml_string_of_jsbytes('File "'),
        [2,
         0,
         [11,
          caml_string_of_jsbytes('", line '),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(", characters "),
            [4,
             0,
             0,
             0,
             [12,45,[4,0,0,0,[11,caml_string_of_jsbytes(": "),[2,0,0]]]]]]]]]],
       caml_string_of_jsbytes('File "%s", line %d, characters %d-%d: %s')],
     cst_Fun_Finally_raised=caml_string_of_jsbytes("Fun.Finally_raised: "),
     cst_Stdlib_Fun_Finally_raised=
      caml_string_of_jsbytes("Stdlib.Fun.Finally_raised"),
     cst_Digest_from_hex$0=caml_string_of_jsbytes("Digest.from_hex"),
     cst_Digest_from_hex=caml_string_of_jsbytes("Digest.from_hex"),
     cst_Digest_to_hex=caml_string_of_jsbytes("Digest.to_hex"),
     cst_Digest_substring=caml_string_of_jsbytes("Digest.substring"),
     cst_Random_int64=caml_string_of_jsbytes("Random.int64"),
     cst_Random_int32=caml_string_of_jsbytes("Random.int32"),
     cst_Random_full_int=caml_string_of_jsbytes("Random.full_int"),
     cst_Random_int=caml_string_of_jsbytes("Random.int"),
     cst_x$1=caml_string_of_jsbytes("x"),
     cst_Hashtbl_unsupported_hash_t=
      caml_string_of_jsbytes("Hashtbl: unsupported hash table format"),
     cst_OCAMLRUNPARAM=caml_string_of_jsbytes("OCAMLRUNPARAM"),
     cst_CAMLRUNPARAM=caml_string_of_jsbytes("CAMLRUNPARAM"),
     cst$66=caml_string_of_jsbytes(""),
     cst_Weak_Make_hash_bucket_cann=
      caml_string_of_jsbytes("Weak.Make: hash bucket cannot grow more"),
     cst_Weak_fill=caml_string_of_jsbytes("Weak.fill"),
     cst_Weak_blit=caml_string_of_jsbytes("Weak.blit"),
     cst_Weak_check=caml_string_of_jsbytes("Weak.check"),
     cst_Weak_get_copy=caml_string_of_jsbytes("Weak.get_copy"),
     cst_Weak_get=caml_string_of_jsbytes("Weak.get"),
     cst_Weak_set=caml_string_of_jsbytes("Weak.set"),
     cst_Weak_create=caml_string_of_jsbytes("Weak.create"),
     cst$84=caml_string_of_jsbytes(""),
     cst$85=caml_string_of_jsbytes(""),
     cst$83=caml_string_of_jsbytes("."),
     cst$80=caml_string_of_jsbytes(">"),
     cst$81=caml_string_of_jsbytes("<\/"),
     cst$82=caml_string_of_jsbytes(""),
     cst$77=caml_string_of_jsbytes(">"),
     cst$78=caml_string_of_jsbytes("<"),
     cst$79=caml_string_of_jsbytes(""),
     cst$76=caml_string_of_jsbytes("\n"),
     cst_Format_pp_set_geometry=
      caml_string_of_jsbytes("Format.pp_set_geometry: "),
     cst$72=caml_string_of_jsbytes(""),
     cst$73=caml_string_of_jsbytes(""),
     cst$74=caml_string_of_jsbytes(""),
     cst$75=caml_string_of_jsbytes(""),
     cst$68=caml_string_of_jsbytes(""),
     cst$69=caml_string_of_jsbytes(""),
     cst$70=caml_string_of_jsbytes(""),
     cst$71=caml_string_of_jsbytes(""),
     cst$67=caml_string_of_jsbytes(""),
     cst_Stdlib_Format_String_tag=
      caml_string_of_jsbytes("Stdlib.Format.String_tag"),
     cst_end_of_input_not_found=
      caml_string_of_jsbytes("end of input not found"),
     cst_scanf_bad_conversion_a=
      caml_string_of_jsbytes('scanf: bad conversion "%a"'),
     cst_scanf_bad_conversion_t=
      caml_string_of_jsbytes('scanf: bad conversion "%t"'),
     cst_scanf_missing_reader=caml_string_of_jsbytes("scanf: missing reader"),
     cst_scanf_bad_conversion_custo=
      caml_string_of_jsbytes('scanf: bad conversion "%?" (custom converter)'),
     cst_scanf_bad_conversion=
      caml_string_of_jsbytes('scanf: bad conversion "%*"'),
     cst_scanf_bad_conversion$0=
      caml_string_of_jsbytes('scanf: bad conversion "%*"'),
     cst_scanf_bad_conversion$1=
      caml_string_of_jsbytes('scanf: bad conversion "%-"'),
     cst_scanf_bad_conversion$2=
      caml_string_of_jsbytes('scanf: bad conversion "%*"'),
     cst$91=caml_string_of_jsbytes('"'),
     cst$92=caml_string_of_jsbytes('"'),
     cst$89=caml_string_of_jsbytes('"'),
     cst$90=caml_string_of_jsbytes('"'),
     cst$88=caml_string_of_jsbytes('"'),
     cst_in_format=caml_string_of_jsbytes(' in format "'),
     cst_an=caml_string_of_jsbytes("an"),
     cst_x$2=caml_string_of_jsbytes("x"),
     cst_nfinity=caml_string_of_jsbytes("nfinity"),
     cst_digits=caml_string_of_jsbytes("digits"),
     cst_decimal_digits=caml_string_of_jsbytes("decimal digits"),
     cst_0b=caml_string_of_jsbytes("0b"),
     cst_0o=caml_string_of_jsbytes("0o"),
     cst_0u=caml_string_of_jsbytes("0u"),
     cst_0x=caml_string_of_jsbytes("0x"),
     cst_false$3=caml_string_of_jsbytes("false"),
     cst_true$3=caml_string_of_jsbytes("true"),
     cst_not_a_valid_float_in_hexad=
      caml_string_of_jsbytes("not a valid float in hexadecimal notation"),
     cst_no_dot_or_exponent_part_fo=
      caml_string_of_jsbytes("no dot or exponent part found in float token"),
     cst$87=caml_string_of_jsbytes("-"),
     cst_unnamed_function=caml_string_of_jsbytes("unnamed function"),
     cst_unnamed_character_string=
      caml_string_of_jsbytes("unnamed character string"),
     cst_unnamed_Stdlib_input_chann=
      caml_string_of_jsbytes("unnamed Stdlib input channel"),
     cst$86=caml_string_of_jsbytes("-"),
     cst_Stdlib_Scanf_Scan_failure=
      caml_string_of_jsbytes("Stdlib.Scanf.Scan_failure"),
     cst_binary=caml_string_of_jsbytes("binary"),
     cst_octal=caml_string_of_jsbytes("octal"),
     cst_hexadecimal=caml_string_of_jsbytes("hexadecimal"),
     cst_a_Char=caml_string_of_jsbytes("a Char"),
     cst_a_String=caml_string_of_jsbytes("a String"),
     cst$93=caml_string_of_jsbytes(""),
     cst_CamlinternalMod_update_mod=
      caml_string_of_jsbytes("CamlinternalMod.update_mod: not a module"),
     cst_CamlinternalMod_init_mod_n=
      caml_string_of_jsbytes("CamlinternalMod.init_mod: not a module"),
     cst$94=caml_string_of_jsbytes(""),
     cst$95=caml_string_of_jsbytes(""),
     cst$96=caml_string_of_jsbytes(""),
     cst$97=caml_string_of_jsbytes(""),
     cst$99=caml_string_of_jsbytes(""),
     cst$98=caml_string_of_jsbytes(""),
     cst_Illegal_character=caml_string_of_jsbytes("Illegal character "),
     cst_Filename_chop_extension=
      caml_string_of_jsbytes("Filename.chop_extension"),
     cst$127=caml_string_of_jsbytes(""),
     cst_Filename_chop_suffix=caml_string_of_jsbytes("Filename.chop_suffix"),
     cst$126=caml_string_of_jsbytes(""),
     cst_2_1$0=caml_string_of_jsbytes(" 2>&1"),
     cst_2$0=caml_string_of_jsbytes(" 2>"),
     cst$125=caml_string_of_jsbytes(""),
     cst$117=caml_string_of_jsbytes(" >"),
     cst$124=caml_string_of_jsbytes(""),
     cst$118=caml_string_of_jsbytes(" <"),
     cst$123=caml_string_of_jsbytes(""),
     cst$119=caml_string_of_jsbytes(" "),
     cst$120=caml_string_of_jsbytes(" "),
     cst$121=caml_string_of_jsbytes('"'),
     cst$122=caml_string_of_jsbytes(""),
     cst_Filename_quote_command_bad=
      caml_string_of_jsbytes("Filename.quote_command: bad file name "),
     cst$115=caml_string_of_jsbytes('"'),
     cst$116=caml_string_of_jsbytes('"'),
     cst$113=caml_string_of_jsbytes("./"),
     cst$112=caml_string_of_jsbytes(".\\"),
     cst$111=caml_string_of_jsbytes("../"),
     cst$110=caml_string_of_jsbytes("..\\"),
     cst_2_1=caml_string_of_jsbytes(" 2>&1"),
     cst_2=caml_string_of_jsbytes(" 2>"),
     cst$109=caml_string_of_jsbytes(""),
     cst$104=caml_string_of_jsbytes(" >"),
     cst$108=caml_string_of_jsbytes(""),
     cst$105=caml_string_of_jsbytes(" <"),
     cst$107=caml_string_of_jsbytes(""),
     cst$106=caml_string_of_jsbytes(" "),
     cst$103=caml_string_of_jsbytes("./"),
     cst$102=caml_string_of_jsbytes("../"),
     cst$101=caml_string_of_jsbytes(""),
     cst$100=caml_string_of_jsbytes(""),
     null$0=caml_string_of_jsbytes("/dev/null"),
     current_dir_name=caml_string_of_jsbytes("."),
     parent_dir_name=caml_string_of_jsbytes(".."),
     dir_sep=caml_string_of_jsbytes("/"),
     cst_TMPDIR=caml_string_of_jsbytes("TMPDIR"),
     cst_tmp=caml_string_of_jsbytes("/tmp"),
     quotequote=caml_string_of_jsbytes("'\\''"),
     null$1=caml_string_of_jsbytes("NUL"),
     current_dir_name$0=caml_string_of_jsbytes("."),
     parent_dir_name$0=caml_string_of_jsbytes(".."),
     dir_sep$0=caml_string_of_jsbytes("\\"),
     cst_TEMP=caml_string_of_jsbytes("TEMP"),
     cst$114=caml_string_of_jsbytes("."),
     null$2=caml_string_of_jsbytes("/dev/null"),
     current_dir_name$1=caml_string_of_jsbytes("."),
     parent_dir_name$1=caml_string_of_jsbytes(".."),
     dir_sep$1=caml_string_of_jsbytes("/"),
     cst_Cygwin=caml_string_of_jsbytes("Cygwin"),
     cst_Win32=caml_string_of_jsbytes("Win32"),
     zero$4=[254,0.,0.],
     one$4=[254,1.,0.],
     i=[254,0.,1.],
     cst_Bigarray_array3_of_genarra=
      caml_string_of_jsbytes("Bigarray.array3_of_genarray"),
     cst_Bigarray_array2_of_genarra=
      caml_string_of_jsbytes("Bigarray.array2_of_genarray"),
     cst_Bigarray_array1_of_genarra=
      caml_string_of_jsbytes("Bigarray.array1_of_genarray"),
     cst_Bigarray_array0_of_genarra=
      caml_string_of_jsbytes("Bigarray.array0_of_genarray"),
     cst_Bigarray_Array3_of_array_n=
      caml_string_of_jsbytes("Bigarray.Array3.of_array: non-cubic data"),
     cst_Bigarray_Array3_of_array_n$0=
      caml_string_of_jsbytes("Bigarray.Array3.of_array: non-cubic data"),
     cst_Bigarray_Array2_of_array_n=
      caml_string_of_jsbytes("Bigarray.Array2.of_array: non-rectangular data"),
     cst_In_channel_input_all_chann=
      caml_string_of_jsbytes
       ("In_channel.input_all: channel content is larger than maximum string length"),
     Invalid_argument=global_data.Invalid_argument,
     Failure=global_data.Failure,
     Match_failure=global_data.Match_failure,
     Assert_failure=global_data.Assert_failure,
     Not_found=global_data.Not_found,
     Out_of_memory=global_data.Out_of_memory,
     Stack_overflow=global_data.Stack_overflow,
     Sys_error=global_data.Sys_error,
     End_of_file=global_data.End_of_file,
     Division_by_zero=global_data.Division_by_zero,
     Sys_blocked_io=global_data.Sys_blocked_io,
     Undefined_recursive_module=global_data.Undefined_recursive_module,
     _l_=[0,0,[0,6,0]],
     _k_=[0,0,[0,7,0]],
     _j_=[0,1,[0,3,[0,4,[0,6,0]]]],
     _i_=[0,1,[0,3,[0,4,[0,7,0]]]],
     _g_=[0,1],
     _h_=[0,0],
     _a_=runtime.caml_int64_create_lo_mi_hi(0,0,32752),
     _b_=runtime.caml_int64_create_lo_mi_hi(0,0,65520),
     _c_=runtime.caml_int64_create_lo_mi_hi(1,0,32752),
     _d_=runtime.caml_int64_create_lo_mi_hi(16777215,16777215,32751),
     _e_=runtime.caml_int64_create_lo_mi_hi(0,0,16),
     _f_=runtime.caml_int64_create_lo_mi_hi(0,0,15536),
     _n_=[0,caml_string_of_jsbytes("obj.ml"),95,4],
     _r_=[0,caml_string_of_jsbytes("seq.ml"),596,4],
     _x_=[0,caml_string_of_jsbytes("uchar.ml"),88,18],
     _w_=[0,caml_string_of_jsbytes("uchar.ml"),91,7],
     _v_=[0,caml_string_of_jsbytes("uchar.ml"),80,18],
     _u_=[0,caml_string_of_jsbytes("uchar.ml"),85,7],
     _A_=[0,0,0],
     _G_=[0,caml_string_of_jsbytes("bytes.ml"),808,20],
     _F_=[0,caml_string_of_jsbytes("bytes.ml"),819,9],
     _E_=[0,caml_string_of_jsbytes("bytes.ml"),754,20],
     _D_=[0,caml_string_of_jsbytes("bytes.ml"),765,9],
     _C_=[0,caml_string_of_jsbytes("bytes.ml"),642,20],
     _B_=[0,caml_string_of_jsbytes("bytes.ml"),667,9],
     _H_=[0,caml_string_of_jsbytes("array.ml"),322,4],
     _J_=[0,caml_string_of_jsbytes("float.ml"),395,6],
     _I_=[0,caml_string_of_jsbytes("float.ml"),222,14],
     _U_=runtime.caml_int64_create_lo_mi_hi(16777215,16777215,65535),
     _T_=runtime.caml_int64_create_lo_mi_hi(0,0,0),
     _S_=runtime.caml_int64_create_lo_mi_hi(1,0,0),
     _R_=runtime.caml_int64_create_lo_mi_hi(1,0,0),
     _V_=[0,0,0,0],
     _W_=[0,0,0],
     _X_=[0,caml_string_of_jsbytes("set.ml"),570,18],
     _Y_=[0,0,0,0],
     _Z_=[0,caml_string_of_jsbytes("map.ml"),400,10],
     ___=[0,0,0],
     _$_=[0,caml_string_of_jsbytes("stream.ml"),53,12],
     _aa_=[0,0],
     _ab_=[0,caml_string_of_jsbytes("stream.ml"),82,12],
     _af_=[0,caml_string_of_jsbytes("buffer.ml"),231,9],
     _ae_=[0,caml_string_of_jsbytes("buffer.ml"),212,2],
     _ad_=[0,caml_string_of_jsbytes("buffer.ml"),93,2],
     _ac_=[0,caml_string_of_jsbytes("buffer.ml"),94,2],
     _ah_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),850,23],
     _as_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),814,21],
     _ak_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),815,21],
     _at_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),818,21],
     _al_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),819,21],
     _au_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),822,19],
     _am_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),823,19],
     _av_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),826,22],
     _an_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),827,22],
     _aw_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),831,30],
     _ao_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),832,30],
     _aq_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),836,26],
     _ai_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),837,26],
     _ar_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),846,28],
     _aj_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),847,28],
     _ap_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),851,23],
     _ay_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),1558,4],
     _az_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),1626,39],
     _aA_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),1649,31],
     _aB_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),1650,31],
     _aC_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),1830,8],
     _a6_=
      [0,
       [11,
        caml_string_of_jsbytes("bad input: format type mismatch between "),
        [3,0,[11,caml_string_of_jsbytes(" and "),[3,0,0]]]],
       caml_string_of_jsbytes
        ("bad input: format type mismatch between %S and %S")],
     _a5_=
      [0,
       [11,
        caml_string_of_jsbytes("bad input: format type mismatch between "),
        [3,0,[11,caml_string_of_jsbytes(" and "),[3,0,0]]]],
       caml_string_of_jsbytes
        ("bad input: format type mismatch between %S and %S")],
     _aI_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,0,0,0,[11,caml_string_of_jsbytes(", duplicate flag "),[1,0]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: at character number %d, duplicate flag %C")],
     _aJ_=[0,1,0],
     _aK_=[0,0],
     _aL_=[1,0],
     _aM_=[1,1],
     _aO_=[1,1],
     _aN_=[1,1],
     _aS_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(", flag "),
            [1,
             [11,
              caml_string_of_jsbytes(" is only allowed after the '"),
              [12,
               37,
               [11,
                caml_string_of_jsbytes("', before padding and precision"),
                0]]]]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: at character number %d, flag %C is only allowed after the '%%', before padding and precision")],
     _aP_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(', invalid conversion "'),
            [12,37,[0,[12,34,0]]]]]]]],
       caml_string_of_jsbytes
        ('invalid format %S: at character number %d, invalid conversion "%%%c"')],
     _aQ_=[0,0],
     _aR_=[0,0],
     _aT_=[0,[12,64,0]],
     _aU_=[0,caml_string_of_jsbytes("@ "),1,0],
     _aV_=[0,caml_string_of_jsbytes("@,"),0,0],
     _aW_=[2,60],
     _aX_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": '"),
          [12,
           37,
           [11,
            caml_string_of_jsbytes
             ("' alone is not accepted in character sets, use "),
            [12,
             37,
             [12,
              37,
              [11,
               caml_string_of_jsbytes(" instead at position "),
               [4,0,0,0,[12,46,0]]]]]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: '%%' alone is not accepted in character sets, use %%%% instead at position %d.")],
     _aY_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": integer "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(" is greater than the limit "),
            [4,0,0,0,0]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: integer %d is greater than the limit %d")],
     _aZ_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),2837,11],
     _a0_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(': unclosed sub-format, expected "'),
          [12,
           37,
           [0,
            [11,caml_string_of_jsbytes('" at character number '),[4,0,0,0,0]]]]]]],
       caml_string_of_jsbytes
        ('invalid format %S: unclosed sub-format, expected "%%%c" at character number %d')],
     _a1_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),2899,34],
     _a2_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),2935,28],
     _a3_=[0,caml_string_of_jsbytes("camlinternalFormat.ml"),2957,11],
     _a4_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(", "),
            [2,
             0,
             [11,
              caml_string_of_jsbytes(" is incompatible with '"),
              [0,[11,caml_string_of_jsbytes("' in sub-format "),[3,0,0]]]]]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S")],
     _aH_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(", "),
            [2,0,[11,caml_string_of_jsbytes(" expected, read "),[1,0]]]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: at character number %d, %s expected, read %C")],
     _aG_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,
           0,
           0,
           0,
           [11,
            caml_string_of_jsbytes(", '"),
            [0,[11,caml_string_of_jsbytes("' without "),[2,0,0]]]]]]]],
       caml_string_of_jsbytes
        ("invalid format %S: at character number %d, '%c' without %s")],
     _aF_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid format "),
        [3,
         0,
         [11,
          caml_string_of_jsbytes(": at character number "),
          [4,0,0,0,[11,caml_string_of_jsbytes(", "),[2,0,0]]]]]],
       caml_string_of_jsbytes("invalid format %S: at character number %d, %s")],
     _aE_=
      [0,
       [11,caml_string_of_jsbytes("invalid box description "),[3,0,0]],
       caml_string_of_jsbytes("invalid box description %S")],
     _aD_=[0,0,4],
     _ax_=[0,103],
     _ag_=[0,0,0],
     _bq_=[0,[2,0,[0,0]],caml_string_of_jsbytes("%s%c")],
     _bk_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _bl_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _bi_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _bj_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _bg_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _bh_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _ba_=
      [0,
       [2,
        0,
        [11,
         caml_string_of_jsbytes(": unknown option '"),
         [2,0,[11,caml_string_of_jsbytes("'.\n"),0]]]],
       caml_string_of_jsbytes("%s: unknown option '%s'.\n")],
     _bd_=
      [0,
       [2,
        0,
        [11,
         caml_string_of_jsbytes(": wrong argument '"),
         [2,
          0,
          [11,
           caml_string_of_jsbytes("'; option '"),
           [2,
            0,
            [11,
             caml_string_of_jsbytes("' expects "),
             [2,0,[11,caml_string_of_jsbytes(".\n"),0]]]]]]]],
       caml_string_of_jsbytes
        ("%s: wrong argument '%s'; option '%s' expects %s.\n")],
     _be_=
      [0,
       [2,
        0,
        [11,
         caml_string_of_jsbytes(": option '"),
         [2,0,[11,caml_string_of_jsbytes("' needs an argument.\n"),0]]]],
       caml_string_of_jsbytes("%s: option '%s' needs an argument.\n")],
     _bf_=
      [0,
       [2,
        0,
        [11,
         caml_string_of_jsbytes(": "),
         [2,0,[11,caml_string_of_jsbytes(".\n"),0]]]],
       caml_string_of_jsbytes("%s: %s.\n")],
     _bb_=[0,caml_string_of_jsbytes("-help")],
     _bc_=[0,caml_string_of_jsbytes("--help")],
     _a$_=[0,[2,0,0],caml_string_of_jsbytes("%s")],
     _a__=[0,[2,0,[12,10,0]],caml_string_of_jsbytes("%s\n")],
     _a9_=[0,caml_string_of_jsbytes("-help")],
     _a7_=
      [0,
       [11,caml_string_of_jsbytes("  "),[2,0,[12,32,[2,0,[12,10,0]]]]],
       caml_string_of_jsbytes("  %s %s\n")],
     _a8_=
      [0,
       [11,caml_string_of_jsbytes("  "),[2,0,[12,32,[2,0,[2,0,[12,10,0]]]]]],
       caml_string_of_jsbytes("  %s %s%s\n")],
     _bv_=
      [0,
       [11,caml_string_of_jsbytes(", "),[2,0,[2,0,0]]],
       caml_string_of_jsbytes(", %s%s")],
     _bH_=
      [0,
       [11,caml_string_of_jsbytes("Fatal error: exception "),[2,0,[12,10,0]]],
       caml_string_of_jsbytes("Fatal error: exception %s\n")],
     _bI_=
      [0,
       [11,
        caml_string_of_jsbytes
         ("Fatal error in uncaught exception handler: exception "),
        [2,0,[12,10,0]]],
       caml_string_of_jsbytes
        ("Fatal error in uncaught exception handler: exception %s\n")],
     _bG_=
      [0,
       [11,caml_string_of_jsbytes("Fatal error: exception "),[2,0,[12,10,0]]],
       caml_string_of_jsbytes("Fatal error: exception %s\n")],
     _bE_=[0,[2,0,[12,10,0]],caml_string_of_jsbytes("%s\n")],
     _bC_=[0,[2,0,[12,10,0]],caml_string_of_jsbytes("%s\n")],
     _bD_=
      [0,
       [11,
        caml_string_of_jsbytes
         ("(Program not linked with -g, cannot print stack backtrace)\n"),
        0],
       caml_string_of_jsbytes
        ("(Program not linked with -g, cannot print stack backtrace)\n")],
     _bA_=
      [0,
       [2,
        0,
        [12,
         32,
         [2,
          0,
          [11,
           caml_string_of_jsbytes(' in file "'),
           [2,
            0,
            [12,
             34,
             [2,
              0,
              [11,
               caml_string_of_jsbytes(", line "),
               [4,0,0,0,[11,caml_string_of_jsbytes(", characters "),partial]]]]]]]]]],
       caml_string_of_jsbytes
        ('%s %s in file "%s"%s, line %d, characters %d-%d')],
     _bB_=
      [0,
       [2,0,[11,caml_string_of_jsbytes(" unknown location"),0]],
       caml_string_of_jsbytes("%s unknown location")],
     _bz_=
      [0,
       [11,caml_string_of_jsbytes("Uncaught exception: "),[2,0,[12,10,0]]],
       caml_string_of_jsbytes("Uncaught exception: %s\n")],
     _by_=
      [0,
       [11,caml_string_of_jsbytes("Uncaught exception: "),[2,0,[12,10,0]]],
       caml_string_of_jsbytes("Uncaught exception: %s\n")],
     _bw_=[0,[12,40,[2,0,[2,0,[12,41,0]]]],caml_string_of_jsbytes("(%s%s)")],
     _bx_=[0,[12,40,[2,0,[12,41,0]]],caml_string_of_jsbytes("(%s)")],
     _bu_=[0,[4,0,0,0,0],caml_string_of_jsbytes("%d")],
     _bt_=[0,[3,0,0],caml_string_of_jsbytes("%S")],
     _bF_=
      [0,
       caml_string_of_jsbytes(""),
       caml_string_of_jsbytes
        ("(Cannot print locations:\n bytecode executable program file not found)"),
       caml_string_of_jsbytes
        ("(Cannot print locations:\n bytecode executable program file appears to be corrupt)"),
       caml_string_of_jsbytes
        ("(Cannot print locations:\n bytecode executable program file has wrong magic number)"),
       caml_string_of_jsbytes
        ("(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)")],
     _bP_=
      [0,
       [11,
        caml_string_of_jsbytes("minor_collections:      "),
        [4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("minor_collections:      %d\n")],
     _bQ_=
      [0,
       [11,
        caml_string_of_jsbytes("major_collections:      "),
        [4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("major_collections:      %d\n")],
     _bR_=
      [0,
       [11,
        caml_string_of_jsbytes("compactions:            "),
        [4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("compactions:            %d\n")],
     _bS_=
      [0,
       [11,
        caml_string_of_jsbytes("forced_major_collections: "),
        [4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("forced_major_collections: %d\n")],
     _bT_=[0,[12,10,0],caml_string_of_jsbytes("\n")],
     _bU_=[0,[8,[0,0,0],0,[0,0],0],caml_string_of_jsbytes("%.0f")],
     _bV_=
      [0,
       [11,
        caml_string_of_jsbytes("minor_words:    "),
        [8,[0,0,0],[1,1],[0,0],[12,10,0]]],
       caml_string_of_jsbytes("minor_words:    %*.0f\n")],
     _bW_=
      [0,
       [11,
        caml_string_of_jsbytes("promoted_words: "),
        [8,[0,0,0],[1,1],[0,0],[12,10,0]]],
       caml_string_of_jsbytes("promoted_words: %*.0f\n")],
     _bX_=
      [0,
       [11,
        caml_string_of_jsbytes("major_words:    "),
        [8,[0,0,0],[1,1],[0,0],[12,10,0]]],
       caml_string_of_jsbytes("major_words:    %*.0f\n")],
     _bY_=[0,[12,10,0],caml_string_of_jsbytes("\n")],
     _bZ_=[0,[4,0,0,0,0],caml_string_of_jsbytes("%d")],
     _b0_=
      [0,
       [11,caml_string_of_jsbytes("top_heap_words: "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("top_heap_words: %*d\n")],
     _b1_=
      [0,
       [11,caml_string_of_jsbytes("heap_words:     "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("heap_words:     %*d\n")],
     _b2_=
      [0,
       [11,caml_string_of_jsbytes("live_words:     "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("live_words:     %*d\n")],
     _b3_=
      [0,
       [11,caml_string_of_jsbytes("free_words:     "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("free_words:     %*d\n")],
     _b4_=
      [0,
       [11,caml_string_of_jsbytes("largest_free:   "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("largest_free:   %*d\n")],
     _b5_=
      [0,
       [11,caml_string_of_jsbytes("fragments:      "),[4,0,[1,1],0,[12,10,0]]],
       caml_string_of_jsbytes("fragments:      %*d\n")],
     _b6_=[0,[12,10,0],caml_string_of_jsbytes("\n")],
     _b7_=
      [0,
       [11,caml_string_of_jsbytes("live_blocks: "),[4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("live_blocks: %d\n")],
     _b8_=
      [0,
       [11,caml_string_of_jsbytes("free_blocks: "),[4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("free_blocks: %d\n")],
     _b9_=
      [0,
       [11,caml_string_of_jsbytes("heap_chunks: "),[4,0,0,0,[12,10,0]]],
       caml_string_of_jsbytes("heap_chunks: %d\n")],
     _cf_=runtime.caml_int64_create_lo_mi_hi(1,0,0),
     _cg_=runtime.caml_int64_create_lo_mi_hi(0,0,0),
     _ch_=
      [0,
       987910699,
       495797812,
       364182224,
       414272206,
       318284740,
       990407751,
       383018966,
       270373319,
       840823159,
       24560019,
       536292337,
       512266505,
       189156120,
       730249596,
       143776328,
       51606627,
       140166561,
       366354223,
       1003410265,
       700563762,
       981890670,
       913149062,
       526082594,
       1021425055,
       784300257,
       667753350,
       630144451,
       949649812,
       48546892,
       415514493,
       258888527,
       511570777,
       89983870,
       283659902,
       308386020,
       242688715,
       482270760,
       865188196,
       1027664170,
       207196989,
       193777847,
       619708188,
       671350186,
       149669678,
       257044018,
       87658204,
       558145612,
       183450813,
       28133145,
       901332182,
       710253903,
       510646120,
       652377910,
       409934019,
       801085050],
     _ck_=[0,0],
     _cq_=[3,0,3],
     _cp_=[1,caml_string_of_jsbytes("max_indent < 2")],
     _cn_=[1,caml_string_of_jsbytes("margin <= max_indent")],
     _co_=[0,0],
     _cm_=[0,caml_string_of_jsbytes("")],
     _cl_=[0,caml_string_of_jsbytes(""),0,caml_string_of_jsbytes("")],
     _cG_=[0,91],
     _cF_=[0,123],
     _cH_=[0,caml_string_of_jsbytes("scanf.ml"),1453,13],
     _cI_=[0,[3,0,[10,0]],caml_string_of_jsbytes("%S%!")],
     _cE_=[0,37,caml_string_of_jsbytes("")],
     _cD_=
      [0,
       [11,
        caml_string_of_jsbytes("scanf: bad input at char number "),
        [4,3,0,0,[11,caml_string_of_jsbytes(": "),[2,0,0]]]],
       caml_string_of_jsbytes("scanf: bad input at char number %i: %s")],
     _cC_=
      [0,
       [11,
        caml_string_of_jsbytes("the character "),
        [1,[11,caml_string_of_jsbytes(" cannot start a boolean"),0]]],
       caml_string_of_jsbytes("the character %C cannot start a boolean")],
     _cB_=
      [0,
       [11,
        caml_string_of_jsbytes("bad character hexadecimal encoding \\"),
        [0,[0,0]]],
       caml_string_of_jsbytes("bad character hexadecimal encoding \\%c%c")],
     _cA_=
      [0,
       [11,
        caml_string_of_jsbytes("bad character decimal encoding \\"),
        [0,[0,[0,0]]]],
       caml_string_of_jsbytes("bad character decimal encoding \\%c%c%c")],
     _cz_=
      [0,
       [11,
        caml_string_of_jsbytes("character "),
        [1,
         [11,
          caml_string_of_jsbytes(" is not a valid "),
          [2,0,[11,caml_string_of_jsbytes(" digit"),0]]]]],
       caml_string_of_jsbytes("character %C is not a valid %s digit")],
     _cy_=
      [0,
       [11,
        caml_string_of_jsbytes("character "),
        [1,[11,caml_string_of_jsbytes(" is not a decimal digit"),0]]],
       caml_string_of_jsbytes("character %C is not a decimal digit")],
     _cx_=[0,caml_string_of_jsbytes("scanf.ml"),555,9],
     _cw_=
      [0,
       [11,caml_string_of_jsbytes("invalid boolean '"),[2,0,[12,39,0]]],
       caml_string_of_jsbytes("invalid boolean '%s'")],
     _cv_=
      [0,
       [11,
        caml_string_of_jsbytes("looking for "),
        [1,[11,caml_string_of_jsbytes(", found "),[1,0]]]],
       caml_string_of_jsbytes("looking for %C, found %C")],
     _cu_=
      [0,
       [11,
        caml_string_of_jsbytes("scanning of "),
        [2,
         0,
         [11,
          caml_string_of_jsbytes
           (" failed: premature end of file occurred before end of token"),
          0]]],
       caml_string_of_jsbytes
        ("scanning of %s failed: premature end of file occurred before end of token")],
     _ct_=
      [0,
       [11,
        caml_string_of_jsbytes("scanning of "),
        [2,
         0,
         [11,
          caml_string_of_jsbytes
           (" failed: the specified length was too short for token"),
          0]]],
       caml_string_of_jsbytes
        ("scanning of %s failed: the specified length was too short for token")],
     _cs_=
      [0,
       [11,caml_string_of_jsbytes("illegal escape character "),[1,0]],
       caml_string_of_jsbytes("illegal escape character %C")],
     _cP_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),439,17],
     _cO_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),421,13],
     _cN_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),418,13],
     _cM_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),415,13],
     _cL_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),412,13],
     _cK_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),409,13],
     _cJ_=[0,caml_string_of_jsbytes("camlinternalOO.ml"),281,50],
     _cQ_=[0,caml_string_of_jsbytes("camlinternalMod.ml"),72,5],
     _cR_=[0,caml_string_of_jsbytes("camlinternalMod.ml"),81,2],
     _cU_=[0,0],
     _cT_=[0,0],
     _cS_=[0,0],
     _cZ_=[0,7,0],
     _cY_=[0,1,[0,3,[0,5,0]]],
     _cX_=[0,[2,0,[4,6,[0,2,6],0,[2,0,0]]],caml_string_of_jsbytes("%s%06x%s")],
     _cW_=[0,caml_string_of_jsbytes('"'),0],
     _c0_=[254,0.,0.],
     _c1_=[0,0];
    function erase_rel(param)
     {if(typeof param === "number")
       return 0;
      else
       switch(param[0])
        {case 0:var rest=param[1];return [0,erase_rel(rest)];
         case 1:var rest$0=param[1];return [1,erase_rel(rest$0)];
         case 2:var rest$1=param[1];return [2,erase_rel(rest$1)];
         case 3:var rest$2=param[1];return [3,erase_rel(rest$2)];
         case 4:var rest$3=param[1];return [4,erase_rel(rest$3)];
         case 5:var rest$4=param[1];return [5,erase_rel(rest$4)];
         case 6:var rest$5=param[1];return [6,erase_rel(rest$5)];
         case 7:var rest$6=param[1];return [7,erase_rel(rest$6)];
         case 8:
          var rest$7=param[2],ty=param[1];return [8,ty,erase_rel(rest$7)];
         case 9:
          var rest$8=param[3],ty1=param[1];
          return [9,ty1,ty1,erase_rel(rest$8)];
         case 10:var rest$9=param[1];return [10,erase_rel(rest$9)];
         case 11:var rest$10=param[1];return [11,erase_rel(rest$10)];
         case 12:var rest$11=param[1];return [12,erase_rel(rest$11)];
         case 13:var rest$12=param[1];return [13,erase_rel(rest$12)];
         default:var rest$13=param[1];return [14,erase_rel(rest$13)]}}
    function concat_fmtty(fmtty1,fmtty2)
     {if(typeof fmtty1 === "number")
       return fmtty2;
      else
       switch(fmtty1[0])
        {case 0:var rest=fmtty1[1];return [0,concat_fmtty(rest,fmtty2)];
         case 1:var rest$0=fmtty1[1];return [1,concat_fmtty(rest$0,fmtty2)];
         case 2:var rest$1=fmtty1[1];return [2,concat_fmtty(rest$1,fmtty2)];
         case 3:var rest$2=fmtty1[1];return [3,concat_fmtty(rest$2,fmtty2)];
         case 4:var rest$3=fmtty1[1];return [4,concat_fmtty(rest$3,fmtty2)];
         case 5:var rest$4=fmtty1[1];return [5,concat_fmtty(rest$4,fmtty2)];
         case 6:var rest$5=fmtty1[1];return [6,concat_fmtty(rest$5,fmtty2)];
         case 7:var rest$6=fmtty1[1];return [7,concat_fmtty(rest$6,fmtty2)];
         case 8:
          var rest$7=fmtty1[2],ty=fmtty1[1];
          return [8,ty,concat_fmtty(rest$7,fmtty2)];
         case 9:
          var rest$8=fmtty1[3],ty2=fmtty1[2],ty1=fmtty1[1];
          return [9,ty1,ty2,concat_fmtty(rest$8,fmtty2)];
         case 10:var rest$9=fmtty1[1];return [10,concat_fmtty(rest$9,fmtty2)];
         case 11:
          var rest$10=fmtty1[1];return [11,concat_fmtty(rest$10,fmtty2)];
         case 12:
          var rest$11=fmtty1[1];return [12,concat_fmtty(rest$11,fmtty2)];
         case 13:
          var rest$12=fmtty1[1];return [13,concat_fmtty(rest$12,fmtty2)];
         default:
          var rest$13=fmtty1[1];return [14,concat_fmtty(rest$13,fmtty2)]}}
    function concat_fmt(fmt1,fmt2)
     {if(typeof fmt1 === "number")
       return fmt2;
      else
       switch(fmt1[0])
        {case 0:var rest=fmt1[1];return [0,concat_fmt(rest,fmt2)];
         case 1:var rest$0=fmt1[1];return [1,concat_fmt(rest$0,fmt2)];
         case 2:
          var rest$1=fmt1[2],pad=fmt1[1];
          return [2,pad,concat_fmt(rest$1,fmt2)];
         case 3:
          var rest$2=fmt1[2],pad$0=fmt1[1];
          return [3,pad$0,concat_fmt(rest$2,fmt2)];
         case 4:
          var rest$3=fmt1[4],prec=fmt1[3],pad$1=fmt1[2],iconv=fmt1[1];
          return [4,iconv,pad$1,prec,concat_fmt(rest$3,fmt2)];
         case 5:
          var rest$4=fmt1[4],prec$0=fmt1[3],pad$2=fmt1[2],iconv$0=fmt1[1];
          return [5,iconv$0,pad$2,prec$0,concat_fmt(rest$4,fmt2)];
         case 6:
          var rest$5=fmt1[4],prec$1=fmt1[3],pad$3=fmt1[2],iconv$1=fmt1[1];
          return [6,iconv$1,pad$3,prec$1,concat_fmt(rest$5,fmt2)];
         case 7:
          var rest$6=fmt1[4],prec$2=fmt1[3],pad$4=fmt1[2],iconv$2=fmt1[1];
          return [7,iconv$2,pad$4,prec$2,concat_fmt(rest$6,fmt2)];
         case 8:
          var rest$7=fmt1[4],prec$3=fmt1[3],pad$5=fmt1[2],fconv=fmt1[1];
          return [8,fconv,pad$5,prec$3,concat_fmt(rest$7,fmt2)];
         case 9:
          var rest$8=fmt1[2],pad$6=fmt1[1];
          return [9,pad$6,concat_fmt(rest$8,fmt2)];
         case 10:var rest$9=fmt1[1];return [10,concat_fmt(rest$9,fmt2)];
         case 11:
          var rest$10=fmt1[2],str=fmt1[1];
          return [11,str,concat_fmt(rest$10,fmt2)];
         case 12:
          var rest$11=fmt1[2],chr=fmt1[1];
          return [12,chr,concat_fmt(rest$11,fmt2)];
         case 13:
          var rest$12=fmt1[3],fmtty=fmt1[2],pad$7=fmt1[1];
          return [13,pad$7,fmtty,concat_fmt(rest$12,fmt2)];
         case 14:
          var rest$13=fmt1[3],fmtty$0=fmt1[2],pad$8=fmt1[1];
          return [14,pad$8,fmtty$0,concat_fmt(rest$13,fmt2)];
         case 15:var rest$14=fmt1[1];return [15,concat_fmt(rest$14,fmt2)];
         case 16:var rest$15=fmt1[1];return [16,concat_fmt(rest$15,fmt2)];
         case 17:
          var rest$16=fmt1[2],fmting_lit=fmt1[1];
          return [17,fmting_lit,concat_fmt(rest$16,fmt2)];
         case 18:
          var rest$17=fmt1[2],fmting_gen=fmt1[1];
          return [18,fmting_gen,concat_fmt(rest$17,fmt2)];
         case 19:var rest$18=fmt1[1];return [19,concat_fmt(rest$18,fmt2)];
         case 20:
          var rest$19=fmt1[3],char_set=fmt1[2],width_opt=fmt1[1];
          return [20,width_opt,char_set,concat_fmt(rest$19,fmt2)];
         case 21:
          var rest$20=fmt1[2],counter=fmt1[1];
          return [21,counter,concat_fmt(rest$20,fmt2)];
         case 22:var rest$21=fmt1[1];return [22,concat_fmt(rest$21,fmt2)];
         case 23:
          var rest$22=fmt1[2],ign=fmt1[1];
          return [23,ign,concat_fmt(rest$22,fmt2)];
         default:
          var rest$23=fmt1[3],f=fmt1[2],arity=fmt1[1];
          return [24,arity,f,concat_fmt(rest$23,fmt2)]}}
    var CamlinternalFormatBasics=[0,concat_fmtty,erase_rel,concat_fmt];
    caml_register_global
     (761,CamlinternalFormatBasics,"CamlinternalFormatBasics");
    function make(v){return [0,v]}
    function get(r){return r[1]}
    function set(r,v){r[1] = v;return 0}
    function exchange(r,v){var cur=r[1];r[1] = v;return cur}
    function compare_and_set(r,seen,v)
     {var cur=r[1];return cur === seen?(r[1] = v,1):0}
    function fetch_and_add(r,n){var cur=r[1];r[1] = cur + n | 0;return cur}
    function incr(r){fetch_and_add(r,1);return 0}
    function decr(r){fetch_and_add(r,-1);return 0}
    var
     include=
      [0,make,get,set,exchange,compare_and_set,fetch_and_add,incr,decr];
    caml_register_global(762,include,"CamlinternalAtomic");
    function failwith(s){throw [0,Failure,s]}
    function invalid_arg(s){throw [0,Invalid_argument,s]}
    var Exit=[248,cst_Stdlib_Exit,caml_fresh_oo_id(0)];
    function min(x,y){return caml_lessequal(x,y)?x:y}
    function max(x,y){return caml_greaterequal(x,y)?x:y}
    function abs(x){return 0 <= x?x:- x | 0}
    function lnot(x){return x ^ -1}
    var
     infinity=caml_int64_float_of_bits(_a_),
     neg_infinity=caml_int64_float_of_bits(_b_),
     nan=caml_int64_float_of_bits(_c_),
     max_float=caml_int64_float_of_bits(_d_),
     min_float=caml_int64_float_of_bits(_e_),
     epsilon=caml_int64_float_of_bits(_f_),
     max_int=2147483647,
     min_int=-2147483648;
    function cat(s1,s2)
     {var
       l1=caml_ml_string_length(s1),
       l2=caml_ml_string_length(s2),
       s=caml_create_bytes(l1 + l2 | 0);
      caml_blit_string(s1,0,s,0,l1);
      caml_blit_string(s2,0,s,l1,l2);
      return caml_string_of_bytes(s)}
    function char_of_int(n)
     {if(0 <= n && ! (255 < n))return n;return invalid_arg(cst_char_of_int)}
    function string_of_bool(b){return b?cst_true:cst_false}
    function bool_of_string(param)
     {return caml_string_notequal(param,cst_false$0)
              ?caml_string_notequal(param,cst_true$0)
                ?invalid_arg(cst_bool_of_string)
                :1
              :0}
    function bool_of_string_opt(param)
     {return caml_string_notequal(param,cst_false$1)
              ?caml_string_notequal(param,cst_true$1)?0:_g_
              :_h_}
    function string_of_int(n){return caml_string_of_jsbytes("" + n)}
    function int_of_string_opt(s)
     {try
       {var _EE_=[0,caml_int_of_string(s)];return _EE_}
      catch(_EF_)
       {_EF_ = caml_wrap_exception(_EF_);
        if(_EF_[1] === Failure)return 0;
        throw _EF_}}
    function valid_float_lexem(s)
     {var l=caml_ml_string_length(s),i=0;
      for(;;)
       {if(l <= i)return cat(s,cst);
        var match=caml_string_get(s,i),switch$0=0;
        if(48 <= match)
         {if(! (58 <= match))switch$0 = 1}
        else
         if(45 === match)switch$0 = 1;
        if(switch$0){var i$0=i + 1 | 0,i=i$0;continue}
        return s}}
    function to_string(f)
     {return valid_float_lexem(caml_format_float(cst_12g,f))}
    function of_string_opt(s)
     {try
       {var _EC_=[0,caml_float_of_string(s)];return _EC_}
      catch(_ED_)
       {_ED_ = caml_wrap_exception(_ED_);
        if(_ED_[1] === Failure)return 0;
        throw _ED_}}
    function append(l1,l2)
     {if(l1){var tl=l1[2],hd=l1[1];return [0,hd,append(tl,l2)]}return l2}
    var
     stdin=caml_ml_open_descriptor_in(0),
     stdout=caml_ml_open_descriptor_out(1),
     stderr=caml_ml_open_descriptor_out(2);
    function open_gen(mode,perm,name)
     {var c=caml_ml_open_descriptor_out(caml_sys_open(name,mode,perm));
      caml_ml_set_channel_name(c,name);
      return c}
    function open_text(name){return open_gen(_i_,438,name)}
    function open_bin(name){return open_gen(_j_,438,name)}
    function flush_all(param)
     {function iter(param)
       {var param$0=param;
        for(;;)
         {if(param$0)
           {var l=param$0[2],a=param$0[1];
            try
             {caml_ml_flush(a)}
            catch(_EB_)
             {_EB_ = caml_wrap_exception(_EB_);
              if(_EB_[1] !== Sys_error)throw _EB_;
              var _EA_=_EB_}
            var param$0=l;
            continue}
          return 0}}
      return iter(runtime.caml_ml_out_channels_list(0))}
    function output_bytes(oc,s)
     {return caml_ml_output_bytes(oc,s,0,caml_ml_bytes_length(s))}
    function output_string(oc,s)
     {return caml_ml_output(oc,s,0,caml_ml_string_length(s))}
    function output(oc,s,ofs,len)
     {if
       (0 <= ofs && 0 <= len && ! ((caml_ml_bytes_length(s) - len | 0) < ofs))
       return caml_ml_output_bytes(oc,s,ofs,len);
      return invalid_arg(cst_output)}
    function output_substring(oc,s,ofs,len)
     {if
       (0
        <=
        ofs
        &&
        0
        <=
        len
        &&
        !
        ((caml_ml_string_length(s) - len | 0) < ofs))
       return caml_ml_output(oc,s,ofs,len);
      return invalid_arg(cst_output_substring)}
    function output_value(chan,v){return caml_output_value(chan,v,0)}
    function close(oc){caml_ml_flush(oc);return caml_ml_close_channel(oc)}
    function close_noerr(oc)
     {try {caml_ml_flush(oc)}catch(_Ez_){}
      try
       {var _Ex_=caml_ml_close_channel(oc);return _Ex_}
      catch(_Ey_){return 0}}
    function open_gen$0(mode,perm,name)
     {var c=caml_ml_open_descriptor_in(caml_sys_open(name,mode,perm));
      caml_ml_set_channel_name(c,name);
      return c}
    function open_text$0(name){return open_gen$0(_k_,0,name)}
    function open_bin$0(name){return open_gen$0(_l_,0,name)}
    function input(ic,s,ofs,len)
     {if
       (0 <= ofs && 0 <= len && ! ((caml_ml_bytes_length(s) - len | 0) < ofs))
       return caml_ml_input(ic,s,ofs,len);
      return invalid_arg(cst_input)}
    function unsafe_really_input(ic,s,ofs,len)
     {var ofs$0=ofs,len$0=len;
      for(;;)
       {if(0 < len$0)
         {var r=caml_ml_input(ic,s,ofs$0,len$0);
          if(0 === r)throw End_of_file;
          var len$1=len$0 - r | 0,ofs$1=ofs$0 + r | 0,ofs$0=ofs$1,len$0=len$1;
          continue}
        return 0}}
    function really_input(ic,s,ofs,len)
     {if
       (0 <= ofs && 0 <= len && ! ((caml_ml_bytes_length(s) - len | 0) < ofs))
       return unsafe_really_input(ic,s,ofs,len);
      return invalid_arg(cst_really_input)}
    function really_input_string(ic,len)
     {var s=caml_create_bytes(len);
      really_input(ic,s,0,len);
      return caml_string_of_bytes(s)}
    function input_line(chan)
     {function build_result(buf,pos,param)
       {var pos$0=pos,param$0=param;
        for(;;)
         {if(param$0)
           {var tl=param$0[2],hd=param$0[1],len=caml_ml_bytes_length(hd);
            caml_blit_bytes(hd,0,buf,pos$0 - len | 0,len);
            var pos$1=pos$0 - len | 0,pos$0=pos$1,param$0=tl;
            continue}
          return buf}}
      var accu=0,len=0;
      for(;;)
       {var n=runtime.caml_ml_input_scan_line(chan);
        if(0 === n)
         {if(! accu)throw End_of_file;
          var _Ew_=build_result(caml_create_bytes(len),len,accu)}
        else
         {if(! (0 < n))
           {var beg=caml_create_bytes(- n | 0);
            caml_ml_input(chan,beg,0,- n | 0);
            var len$1=len - n | 0,accu$0=[0,beg,accu],accu=accu$0,len=len$1;
            continue}
          var res=caml_create_bytes(n - 1 | 0);
          caml_ml_input(chan,res,0,n - 1 | 0);
          caml_ml_input_char(chan);
          if(accu)
           var
            len$0=(len + n | 0) - 1 | 0,
            _Ew_=build_result(caml_create_bytes(len$0),len$0,[0,res,accu]);
          else
           var _Ew_=res}
        return caml_string_of_bytes(_Ew_)}}
    function close_noerr$0(ic)
     {try
       {var _Eu_=caml_ml_close_channel(ic);return _Eu_}
      catch(_Ev_){return 0}}
    function print_char(c){return caml_ml_output_char(stdout,c)}
    function print_string(s){return output_string(stdout,s)}
    function print_bytes(s){return output_bytes(stdout,s)}
    function print_int(i)
     {return output_string(stdout,caml_string_of_jsbytes("" + i))}
    function print_float(f){return output_string(stdout,to_string(f))}
    function print_endline(s)
     {output_string(stdout,s);
      caml_ml_output_char(stdout,10);
      return caml_ml_flush(stdout)}
    function print_newline(param)
     {caml_ml_output_char(stdout,10);return caml_ml_flush(stdout)}
    function prerr_char(c){return caml_ml_output_char(stderr,c)}
    function prerr_string(s){return output_string(stderr,s)}
    function prerr_bytes(s){return output_bytes(stderr,s)}
    function prerr_int(i)
     {return output_string(stderr,caml_string_of_jsbytes("" + i))}
    function prerr_float(f){return output_string(stderr,to_string(f))}
    function prerr_endline(s)
     {output_string(stderr,s);
      caml_ml_output_char(stderr,10);
      return caml_ml_flush(stderr)}
    function prerr_newline(param)
     {caml_ml_output_char(stderr,10);return caml_ml_flush(stderr)}
    function read_line(param){caml_ml_flush(stdout);return input_line(stdin)}
    function read_int(param){return caml_int_of_string(read_line(0))}
    function read_int_opt(param){return int_of_string_opt(read_line(0))}
    function read_float(param){return caml_float_of_string(read_line(0))}
    function read_float_opt(param){return of_string_opt(read_line(0))}
    function string_of_format(param){var str=param[2];return str}
    function symbol(param,_Es_)
     {var
       str2=_Es_[2],
       fmt2=_Es_[1],
       str1=param[2],
       fmt1=param[1],
       _Et_=cat(str1,cat(cst$0,str2));
      return [0,concat_fmt(fmt1,fmt2),_Et_]}
    var exit_function=[0,flush_all];
    function at_exit(f)
     {for(;;)
       {var
         f_yet_to_run=[0,1],
         old_exit=exit_function[1],
         new_exit$0=
          function(f_yet_to_run,old_exit)
           {function new_exit(param)
             {if(compare_and_set(f_yet_to_run,1,0))caml_call1(f,0);
              return caml_call1(old_exit,0)}
            return new_exit},
         new_exit=new_exit$0(f_yet_to_run,old_exit),
         success=compare_and_set(exit_function,old_exit,new_exit),
         _Er_=1 - success;
        if(_Er_)continue;
        return _Er_}}
    function do_at_exit(param){return caml_call1(exit_function[1],0)}
    function exit(retcode)
     {do_at_exit(0);return runtime.caml_sys_exit(retcode)}
    caml_register_named_value
     (caml_string_of_jsbytes("Pervasives.do_at_exit"),do_at_exit);
    var
     _m_=
      [0,
       runtime.caml_ml_seek_out_64,
       runtime.caml_ml_pos_out_64,
       caml_ml_channel_size_64,
       runtime.caml_ml_seek_in_64,
       runtime.caml_ml_pos_in_64,
       caml_ml_channel_size_64],
     set_binary_mode=caml_ml_set_binary_mode,
     close$0=caml_ml_close_channel,
     in_channel_length=caml_ml_channel_size,
     pos_in=caml_ml_pos_in,
     seek_in=runtime.caml_ml_seek_in,
     input_value=caml_input_value,
     input_binary_int=runtime.caml_ml_input_int,
     input_byte=caml_ml_input_char,
     input_char=caml_ml_input_char,
     set_binary_mode$0=caml_ml_set_binary_mode,
     out_channel_length=caml_ml_channel_size,
     pos_out=runtime.caml_ml_pos_out,
     seek_out=runtime.caml_ml_seek_out,
     output_binary_int=runtime.caml_ml_output_int,
     output_byte=caml_ml_output_char,
     output_char=caml_ml_output_char,
     flush=caml_ml_flush,
     Stdlib=
      [0,
       invalid_arg,
       failwith,
       Exit,
       Match_failure,
       Assert_failure,
       Invalid_argument,
       Failure,
       Not_found,
       Out_of_memory,
       Stack_overflow,
       Sys_error,
       End_of_file,
       Division_by_zero,
       Sys_blocked_io,
       Undefined_recursive_module,
       min,
       max,
       abs,
       max_int,
       min_int,
       lnot,
       infinity,
       neg_infinity,
       nan,
       max_float,
       min_float,
       epsilon,
       cat,
       char_of_int,
       string_of_bool,
       bool_of_string_opt,
       bool_of_string,
       string_of_int,
       int_of_string_opt,
       to_string,
       of_string_opt,
       append,
       stdin,
       stdout,
       stderr,
       print_char,
       print_string,
       print_bytes,
       print_int,
       print_float,
       print_endline,
       print_newline,
       prerr_char,
       prerr_string,
       prerr_bytes,
       prerr_int,
       prerr_float,
       prerr_endline,
       prerr_newline,
       read_line,
       read_int_opt,
       read_int,
       read_float_opt,
       read_float,
       open_text,
       open_bin,
       open_gen,
       flush,
       flush_all,
       output_char,
       output_string,
       output_bytes,
       output,
       output_substring,
       output_byte,
       output_binary_int,
       output_value,
       seek_out,
       pos_out,
       out_channel_length,
       close,
       close_noerr,
       set_binary_mode$0,
       open_text$0,
       open_bin$0,
       open_gen$0,
       input_char,
       input_line,
       input,
       really_input,
       really_input_string,
       input_byte,
       input_binary_int,
       input_value,
       seek_in,
       pos_in,
       in_channel_length,
       close$0,
       close_noerr$0,
       set_binary_mode,
       _m_,
       string_of_format,
       symbol,
       exit,
       at_exit,
       valid_float_lexem,
       unsafe_really_input,
       do_at_exit];
    caml_register_global(775,Stdlib,"Stdlib");
    var
     Exit$0=[248,cst_Stdlib_Pervasives_Exit,caml_fresh_oo_id(0)],
     Stdlib_Pervasives=
      [0,
       invalid_arg,
       failwith,
       Exit$0,
       min,
       max,
       abs,
       max_int,
       min_int,
       lnot,
       infinity,
       neg_infinity,
       nan,
       max_float,
       min_float,
       epsilon,
       cat,
       char_of_int,
       string_of_bool,
       bool_of_string,
       bool_of_string_opt,
       string_of_int,
       int_of_string_opt,
       to_string,
       of_string_opt,
       append,
       stdin,
       stdout,
       stderr,
       print_char,
       print_string,
       print_bytes,
       print_int,
       print_float,
       print_endline,
       print_newline,
       prerr_char,
       prerr_string,
       prerr_bytes,
       prerr_int,
       prerr_float,
       prerr_endline,
       prerr_newline,
       read_line,
       read_int,
       read_int_opt,
       read_float,
       read_float_opt,
       open_text,
       open_bin,
       open_gen,
       flush,
       flush_all,
       output_char,
       output_string,
       output_bytes,
       output,
       output_substring,
       output_byte,
       output_binary_int,
       output_value,
       seek_out,
       pos_out,
       out_channel_length,
       close,
       close_noerr,
       set_binary_mode$0,
       open_text$0,
       open_bin$0,
       open_gen$0,
       input_char,
       input_line,
       input,
       really_input,
       really_input_string,
       input_byte,
       input_binary_int,
       input_value,
       seek_in,
       pos_in,
       in_channel_length,
       close$0,
       close_noerr$0,
       set_binary_mode,
       string_of_format,
       symbol,
       exit,
       at_exit,
       valid_float_lexem,
       do_at_exit];
    caml_register_global(776,Stdlib_Pervasives,"Stdlib__Pervasives");
    function left(v){return [0,v]}
    function right(v){return [1,v]}
    function is_left(param){return 0 === param[0]?1:0}
    function is_right(param){return 0 === param[0]?0:1}
    function find_left(param)
     {if(0 === param[0]){var v=param[1];return [0,v]}return 0}
    function find_right(param)
     {if(0 === param[0])return 0;var v=param[1];return [0,v]}
    function map_left(f,e)
     {if(0 === e[0]){var v=e[1];return [0,caml_call1(f,v)]}return e}
    function map_right(f,e)
     {if(0 === e[0])return e;var v=e[1];return [1,caml_call1(f,v)]}
    function map(left,right,param)
     {if(0 === param[0]){var v=param[1];return [0,caml_call1(left,v)]}
      var v$0=param[1];
      return [1,caml_call1(right,v$0)]}
    function fold(left,right,param)
     {if(0 === param[0]){var v=param[1];return caml_call1(left,v)}
      var v$0=param[1];
      return caml_call1(right,v$0)}
    function equal(left,right,e1,e2)
     {if(0 === e1[0])
       {var _Ep_=e1[1];
        if(0 === e2[0]){var v2=e2[1];return caml_call2(left,_Ep_,v2)}}
      else
       {var _Eq_=e1[1];
        if(0 !== e2[0]){var v2$0=e2[1];return caml_call2(right,_Eq_,v2$0)}}
      return 0}
    function compare(left,right,e1,e2)
     {if(0 === e1[0])
       {var _En_=e1[1];
        if(0 === e2[0]){var v2=e2[1];return caml_call2(left,_En_,v2)}
        return -1}
      var _Eo_=e1[1];
      if(0 === e2[0])return 1;
      var v2$0=e2[1];
      return caml_call2(right,_Eo_,v2$0)}
    var
     Stdlib_Either=
      [0,
       left,
       right,
       is_left,
       is_right,
       find_left,
       find_right,
       map_left,
       map_right,
       map,
       fold,
       fold,
       fold,
       equal,
       compare];
    caml_register_global(777,Stdlib_Either,"Stdlib__Either");
    var
     executable_name=runtime.caml_sys_executable_name(0),
     match=runtime.caml_sys_get_config(0),
     os_type=match[1],
     match$0=[0,caml_string_of_jsbytes("js_of_ocaml")],
     unix=runtime.caml_sys_const_ostype_unix(0),
     win32=runtime.caml_sys_const_ostype_win32(0),
     cygwin=runtime.caml_sys_const_ostype_cygwin(0),
     max_array_length=runtime.caml_sys_const_max_wosize(0),
     max_floatarray_length=max_array_length / 2 | 0,
     max_string_length=(4 * max_array_length | 0) - 1 | 0,
     big_endian=0,
     match$1=32,
     int_size=32;
    function getenv_opt(s)
     {try
       {var _El_=[0,caml_sys_getenv(s)];return _El_}
      catch(_Em_)
       {_Em_ = caml_wrap_exception(_Em_);
        if(_Em_ === Not_found)return 0;
        throw _Em_}}
    var interactive=[0,0];
    function set_signal(sig_num,sig_beh){return 0}
    var
     Break=[248,cst_Stdlib_Sys_Break,caml_fresh_oo_id(0)],
     sigabrt=-1,
     sigalrm=-2,
     sigfpe=-3,
     sighup=-4,
     sigill=-5,
     sigint=-6,
     sigkill=-7,
     sigpipe=-8,
     sigquit=-9,
     sigsegv=-10,
     sigterm=-11,
     sigusr1=-12,
     sigusr2=-13,
     sigchld=-14,
     sigcont=-15,
     sigstop=-16,
     sigtstp=-17,
     sigttin=-18,
     sigttou=-19,
     sigvtalrm=-20,
     sigprof=-21,
     sigbus=-22,
     sigpoll=-23,
     sigsys=-24,
     sigtrap=-25,
     sigurg=-26,
     sigxcpu=-27,
     sigxfsz=-28;
    function catch_break(on){return on?0:0}
    var development_version=0;
    function Make(_Ek_,_Ej_){return [0,1]}
    var
     Immediate64=[0,Make],
     Stdlib_Sys=
      [0,
       executable_name,
       getenv_opt,
       interactive,
       os_type,
       match$0,
       unix,
       win32,
       cygwin,
       match$1,
       int_size,
       big_endian,
       max_string_length,
       max_array_length,
       max_floatarray_length,
       set_signal,
       sigabrt,
       sigalrm,
       sigfpe,
       sighup,
       sigill,
       sigint,
       sigkill,
       sigpipe,
       sigquit,
       sigsegv,
       sigterm,
       sigusr1,
       sigusr2,
       sigchld,
       sigcont,
       sigstop,
       sigtstp,
       sigttin,
       sigttou,
       sigvtalrm,
       sigprof,
       sigbus,
       sigpoll,
       sigsys,
       sigtrap,
       sigurg,
       sigxcpu,
       sigxfsz,
       Break,
       catch_break,
       ocaml_version,
       development_version,
       ocaml_release,
       runtime.caml_ml_enable_runtime_warnings,
       runtime.caml_ml_runtime_warnings_enabled,
       Immediate64];
    caml_register_global(778,Stdlib_Sys,"Stdlib__Sys");
    function is_block(a){return 1 - (typeof a === "number"?1:0)}
    function double_field(x,i){return caml_array_get(x,i)}
    function set_double_field(x,i,v){return caml_array_set(x,i,v)}
    var
     first_non_constant_constructor=0,
     last_non_constant_constructor_=245,
     lazy_tag=246,
     closure_tag=247,
     object_tag=248,
     infix_tag=249,
     forward_tag=250,
     no_scan_tag=251,
     abstract_tag=251,
     string_tag=252,
     double_tag=253,
     double_array_tag=254,
     custom_tag=255,
     int_tag=1000,
     out_of_heap_tag=1001,
     unaligned_tag=1002;
    function info(obj)
     {if(caml_obj_tag(obj) === 247)
       {var
         info=runtime.caml_obj_raw_field(obj,1),
         arity=info >> 24,
         start_env=info << 8 >>> 9 | 0;
        return [0,arity,start_env]}
      throw [0,Assert_failure,_n_]}
    function of_val(x)
     {var switch$0=0;
      if(is_block(x) && caml_obj_tag(x) !== 248 && 1 <= x.length - 1)
       {var slot=x[1];switch$0 = 1}
      if(! switch$0)var slot=x;
      var switch$1=0;
      if(is_block(slot) && caml_obj_tag(slot) === 248)
       {var name=slot[1];switch$1 = 1}
      if(! switch$1)var name=invalid_arg(cst_Obj_extension_constructor$0);
      return caml_obj_tag(name) === 252
              ?slot
              :invalid_arg(cst_Obj_extension_constructor)}
    function name(slot){return slot[1]}
    function id(slot){return slot[2]}
    var
     Extension_constructor=[0,of_val,name,id],
     extension_constructor=Extension_constructor[1],
     extension_name=Extension_constructor[2],
     extension_id=Extension_constructor[3],
     max_ephe_length=max_array_length - 2 | 0;
    function create(l)
     {var _Eh_=0 <= l?1:0,_Ei_=_Eh_?l <= max_ephe_length?1:0:_Eh_;
      if(1 - _Ei_)invalid_arg(cst_Obj_Ephemeron_create);
      return runtime.caml_ephe_create(l)}
    function length(x){return x.length - 1 - 2 | 0}
    function raise_if_invalid_offset(e,o,msg)
     {var _Ee_=0 <= o?1:0,_Ef_=_Ee_?o < length(e)?1:0:_Ee_,_Eg_=1 - _Ef_;
      return _Eg_?invalid_arg(msg):_Eg_}
    function get_key(e,o)
     {raise_if_invalid_offset(e,o,cst_Obj_Ephemeron_get_key);
      return runtime.caml_ephe_get_key(e,o)}
    function get_key_copy(e,o)
     {raise_if_invalid_offset(e,o,cst_Obj_Ephemeron_get_key_copy);
      return runtime.caml_ephe_get_key_copy(e,o)}
    function set_key(e,o,x)
     {raise_if_invalid_offset(e,o,cst_Obj_Ephemeron_set_key);
      return caml_ephe_set_key(e,o,x)}
    function unset_key(e,o)
     {raise_if_invalid_offset(e,o,cst_Obj_Ephemeron_unset_key);
      return caml_ephe_unset_key(e,o)}
    function check_key(e,o)
     {raise_if_invalid_offset(e,o,cst_Obj_Ephemeron_check_key);
      return runtime.caml_ephe_check_key(e,o)}
    function blit_key(e1,o1,e2,o2,l)
     {if
       (0
        <=
        l
        &&
        0
        <=
        o1
        &&
        !
        ((length(e1) - l | 0) < o1)
        &&
        0
        <=
        o2
        &&
        !
        ((length(e2) - l | 0) < o2))
       {var
         _Ec_=0 !== l?1:0,
         _Ed_=_Ec_?runtime.caml_ephe_blit_key(e1,o1,e2,o2,l):_Ec_;
        return _Ed_}
      return invalid_arg(cst_Obj_Ephemeron_blit_key)}
    var
     _o_=runtime.caml_ephe_blit_data,
     _p_=runtime.caml_ephe_check_data,
     _q_=
      [0,
       create,
       length,
       get_key,
       get_key_copy,
       set_key,
       unset_key,
       check_key,
       blit_key,
       runtime.caml_ephe_get_data,
       runtime.caml_ephe_get_data_copy,
       runtime.caml_ephe_set_data,
       function(_Eb_){return runtime.caml_ephe_unset_data(_Eb_)},
       _p_,
       _o_,
       max_ephe_length],
     Stdlib_Obj=
      [0,
       is_block,
       double_field,
       set_double_field,
       first_non_constant_constructor,
       last_non_constant_constructor_,
       lazy_tag,
       closure_tag,
       object_tag,
       infix_tag,
       forward_tag,
       no_scan_tag,
       abstract_tag,
       string_tag,
       double_tag,
       double_array_tag,
       custom_tag,
       custom_tag,
       int_tag,
       out_of_heap_tag,
       unaligned_tag,
       [0,info],
       Extension_constructor,
       extension_constructor,
       extension_name,
       extension_id,
       _q_];
    caml_register_global(779,Stdlib_Obj,"Stdlib__Obj");
    var Undefined=[248,cst_CamlinternalLazy_Undefined,caml_fresh_oo_id(0)];
    function raise_undefined(param){throw Undefined}
    function force_lazy_block(blk)
     {var closure=blk[1];
      blk[1] = raise_undefined;
      try
       {var result=caml_call1(closure,0);
        caml_obj_make_forward(blk,result);
        return result}
      catch(e)
       {e = caml_wrap_exception(e);blk[1] = function(param){throw e};throw e}}
    function force_val_lazy_block(blk)
     {var closure=blk[1];
      blk[1] = raise_undefined;
      var result=caml_call1(closure,0);
      caml_obj_make_forward(blk,result);
      return result}
    function force(lzv)
     {var t=caml_obj_tag(lzv);
      return t === 250?lzv[1]:t !== 246?lzv:force_lazy_block(lzv)}
    function force_val(lzv)
     {var t=caml_obj_tag(lzv);
      return t === 250?lzv[1]:t !== 246?lzv:force_val_lazy_block(lzv)}
    var
     CamlinternalLazy=
      [0,Undefined,force_lazy_block,force_val_lazy_block,force,force_val];
    caml_register_global(780,CamlinternalLazy,"CamlinternalLazy");
    function to_lazy(f){var x=caml_obj_block(246,1);x[1] = f;return x}
    function from_val(v)
     {var t=caml_obj_tag(v);
      if(t !== 250 && t !== 246 && t !== 253)return v;
      return runtime.caml_lazy_make_forward(v)}
    function is_val(l){return caml_obj_tag(l) !== 246?1:0}
    function map$0(f,x)
     {return [246,
              function(_D__)
               {var
                 _D$_=caml_obj_tag(x),
                 _Ea_=250 === _D$_?x[1]:246 === _D$_?force_lazy_block(x):x;
                return caml_call1(f,_Ea_)}]}
    function map_val(f,x)
     {if(is_val(x))
       {var
         _D5_=caml_obj_tag(x),
         _D6_=250 === _D5_?x[1]:246 === _D5_?force_lazy_block(x):x;
        return from_val(caml_call1(f,_D6_))}
      return [246,
              function(_D7_)
               {var
                 _D8_=caml_obj_tag(x),
                 _D9_=250 === _D8_?x[1]:246 === _D8_?force_lazy_block(x):x;
                return caml_call1(f,_D9_)}]}
    var
     Stdlib_Lazy=
      [0,
       Undefined,
       map$0,
       is_val,
       from_val,
       map_val,
       to_lazy,
       force_val,
       to_lazy,
       from_val,
       is_val];
    caml_register_global(781,Stdlib_Lazy,"Stdlib__Lazy");
    function empty(param){return 0}
    function return$0(x,param){return [0,x,empty]}
    function cons(x,next,param){return [0,x,next]}
    function append$0(seq1,seq2,param)
     {var match=caml_call1(seq1,0);
      if(match)
       {var next=match[2],x=match[1];
        return [0,x,function(_D4_){return append$0(next,seq2,_D4_)}]}
      return caml_call1(seq2,0)}
    function map$1(f,seq,param)
     {var match=caml_call1(seq,0);
      if(match)
       {var
         next=match[2],
         x=match[1],
         _D2_=function(_D3_){return map$1(f,next,_D3_)};
        return [0,caml_call1(f,x),_D2_]}
      return 0}
    function filter_map(f,seq,param)
     {var seq$0=seq;
      for(;;)
       {var match=caml_call1(seq$0,0);
        if(match)
         {var next=match[2],x=match[1],match$0=caml_call1(f,x);
          if(match$0)
           {var y=match$0[1];
            return [0,y,function(_D1_){return filter_map(f,next,_D1_)}]}
          var seq$0=next;
          continue}
        return 0}}
    function filter(f,seq,param)
     {var seq$0=seq;
      for(;;)
       {var match=caml_call1(seq$0,0);
        if(match)
         {var next=match[2],x=match[1];
          if(caml_call1(f,x))
           return [0,x,function(_D0_){return filter(f,next,_D0_)}];
          var seq$0=next;
          continue}
        return 0}}
    function concat(seq,param)
     {var match=caml_call1(seq,0);
      if(match)
       {var next=match[2],x=match[1],_DY_=0;
        return append$0(x,function(_DZ_){return concat(next,_DZ_)},_DY_)}
      return 0}
    function flat_map(f,seq,param)
     {var match=caml_call1(seq,0);
      if(match)
       {var
         next=match[2],
         x=match[1],
         _DV_=0,
         _DW_=function(_DX_){return flat_map(f,next,_DX_)};
        return append$0(caml_call1(f,x),_DW_,_DV_)}
      return 0}
    function fold_left(f,acc,seq)
     {var acc$0=acc,seq$0=seq;
      for(;;)
       {var match=caml_call1(seq$0,0);
        if(match)
         {var
           next=match[2],
           x=match[1],
           acc$1=caml_call2(f,acc$0,x),
           acc$0=acc$1,
           seq$0=next;
          continue}
        return acc$0}}
    function iter(f,seq)
     {var seq$0=seq;
      for(;;)
       {var match=caml_call1(seq$0,0);
        if(match)
         {var next=match[2],x=match[1];
          caml_call1(f,x);
          var seq$0=next;
          continue}
        return 0}}
    function unfold(f,u,param)
     {var match=caml_call1(f,u);
      if(match)
       {var match$0=match[1],u$0=match$0[2],x=match$0[1];
        return [0,x,function(_DU_){return unfold(f,u$0,_DU_)}]}
      return 0}
    function is_empty(xs){var match=caml_call1(xs,0);return match?0:1}
    function uncons(xs)
     {var match=caml_call1(xs,0);
      if(match){var xs$0=match[2],x=match[1];return [0,[0,x,xs$0]]}
      return 0}
    function length$0(xs$1)
     {var accu=0,xs=xs$1;
      for(;;)
       {var match=caml_call1(xs,0);
        if(match)
         {var xs$0=match[2],accu$0=accu + 1 | 0,accu=accu$0,xs=xs$0;continue}
        return accu}}
    function iteri(f,xs$1)
     {var i=0,xs=xs$1;
      for(;;)
       {var match=caml_call1(xs,0);
        if(match)
         {var xs$0=match[2],x=match[1];
          caml_call2(f,i,x);
          var i$0=i + 1 | 0,i=i$0,xs=xs$0;
          continue}
        return 0}}
    function fold_lefti(f,accu$1,xs$1)
     {var accu=accu$1,i=0,xs=xs$1;
      for(;;)
       {var match=caml_call1(xs,0);
        if(match)
         {var
           xs$0=match[2],
           x=match[1],
           accu$0=caml_call3(f,accu,i,x),
           i$0=i + 1 | 0,
           accu=accu$0,
           i=i$0,
           xs=xs$0;
          continue}
        return accu}}
    function for_all(p,xs)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],_DT_=caml_call1(p,x);
          if(_DT_){var xs$0=xs$1;continue}
          return _DT_}
        return 1}}
    function exists(p,xs)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],_DS_=caml_call1(p,x);
          if(_DS_)return _DS_;
          var xs$0=xs$1;
          continue}
        return 0}}
    function find(p,xs)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1];
          if(caml_call1(p,x))return [0,x];
          var xs$0=xs$1;
          continue}
        return 0}}
    function find_map(f,xs)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],result=caml_call1(f,x);
          if(result)return result;
          var xs$0=xs$1;
          continue}
        return 0}}
    function iter2(f,xs,ys)
     {var xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(ys$0,0);
          if(match$0)
           {var ys$1=match$0[2],y=match$0[1];
            caml_call2(f,x,y);
            var xs$0=xs$1,ys$0=ys$1;
            continue}
          return 0}
        return 0}}
    function fold_left2(f,accu,xs,ys)
     {var accu$0=accu,xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(ys$0,0);
          if(match$0)
           {var
             ys$1=match$0[2],
             y=match$0[1],
             accu$1=caml_call3(f,accu$0,x,y),
             accu$0=accu$1,
             xs$0=xs$1,
             ys$0=ys$1;
            continue}
          return accu$0}
        return accu$0}}
    function for_all2(f,xs,ys)
     {var xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(ys$0,0);
          if(match$0)
           {var ys$1=match$0[2],y=match$0[1],_DR_=caml_call2(f,x,y);
            if(_DR_){var xs$0=xs$1,ys$0=ys$1;continue}
            return _DR_}
          return 1}
        return 1}}
    function exists2(f,xs,ys)
     {var xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(ys$0,0);
          if(match$0)
           {var ys$1=match$0[2],y=match$0[1],_DQ_=caml_call2(f,x,y);
            if(_DQ_)return _DQ_;
            var xs$0=xs$1,ys$0=ys$1;
            continue}
          return 0}
        return 0}}
    function equal$0(eq,xs,ys)
     {var xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0),match$0=caml_call1(ys$0,0);
        if(match)
         {if(match$0)
           {var
             ys$1=match$0[2],
             y=match$0[1],
             xs$1=match[2],
             x=match[1],
             _DP_=caml_call2(eq,x,y);
            if(_DP_){var xs$0=xs$1,ys$0=ys$1;continue}
            return _DP_}}
        else
         if(! match$0)return 1;
        return 0}}
    function compare$0(cmp,xs,ys)
     {var xs$0=xs,ys$0=ys;
      for(;;)
       {var match=caml_call1(xs$0,0),match$0=caml_call1(ys$0,0);
        if(match)
         {var _DN_=match[2],_DO_=match[1];
          if(match$0)
           {var ys$1=match$0[2],y=match$0[1],c=caml_call2(cmp,_DO_,y);
            if(0 === c){var xs$0=_DN_,ys$0=ys$1;continue}
            return c}
          return 1}
        return match$0?-1:0}}
    function init_aux(f,i,j,param)
     {if(i < j)
       {var
         _DK_=i + 1 | 0,
         _DL_=function(_DM_){return init_aux(f,_DK_,j,_DM_)};
        return [0,caml_call1(f,i),_DL_]}
      return 0}
    function init(n,f)
     {if(0 <= n)
       {var _DI_=0;return function(_DJ_){return init_aux(f,_DI_,n,_DJ_)}}
      return invalid_arg(cst_Seq_init)}
    function repeat(x,param)
     {return [0,x,function(_DH_){return repeat(x,_DH_)}]}
    function forever(f,param)
     {function _DF_(_DG_){return forever(f,_DG_)}
      return [0,caml_call1(f,0),_DF_]}
    function cycle_nonempty(xs,param)
     {var _DD_=0;
      return append$0(xs,function(_DE_){return cycle_nonempty(xs,_DE_)},_DD_)}
    function cycle(xs,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var
         xs$0=match[2],
         x=match[1],
         _DA_=function(_DC_){return cycle_nonempty(xs,_DC_)};
        return [0,x,function(_DB_){return append$0(xs$0,_DA_,_DB_)}]}
      return 0}
    function iterate1(f,x,param)
     {var y=caml_call1(f,x);
      return [0,y,function(_Dz_){return iterate1(f,y,_Dz_)}]}
    function iterate(f,x)
     {function _Dw_(_Dy_){return iterate1(f,x,_Dy_)}
      return function(_Dx_){return [0,x,_Dw_]}}
    function mapi_aux(f,i,xs,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var
         xs$0=match[2],
         x=match[1],
         _Dt_=i + 1 | 0,
         _Du_=function(_Dv_){return mapi_aux(f,_Dt_,xs$0,_Dv_)};
        return [0,caml_call2(f,i,x),_Du_]}
      return 0}
    function mapi(f,xs)
     {var _Dr_=0;return function(_Ds_){return mapi_aux(f,_Dr_,xs,_Ds_)}}
    function tail_scan(f,s,xs,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var xs$0=match[2],x=match[1],s$0=caml_call2(f,s,x);
        return [0,s$0,function(_Dq_){return tail_scan(f,s$0,xs$0,_Dq_)}]}
      return 0}
    function scan(f,s,xs)
     {function _Dn_(_Dp_){return tail_scan(f,s,xs,_Dp_)}
      return function(_Do_){return [0,s,_Dn_]}}
    function take_aux(n,xs)
     {return 0 === n
              ?empty
              :function(param)
                {var match=caml_call1(xs,0);
                 if(match)
                  {var xs$0=match[2],x=match[1];
                   return [0,x,take_aux(n - 1 | 0,xs$0)]}
                 return 0}}
    function take(n,xs)
     {if(n < 0)invalid_arg(cst_Seq_take);return take_aux(n,xs)}
    function drop(n,xs)
     {return 0 <= n
              ?0 === n
                ?xs
                :function(param)
                  {var n$0=n,xs$0=xs;
                   for(;;)
                    {var match=caml_call1(xs$0,0);
                     if(match)
                      {var xs$1=match[2],n$1=n$0 - 1 | 0;
                       if(0 === n$1)return caml_call1(xs$1,0);
                       var n$0=n$1,xs$0=xs$1;
                       continue}
                     return 0}}
              :invalid_arg(cst_Seq_drop)}
    function take_while(p,xs,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var xs$0=match[2],x=match[1];
        return caml_call1(p,x)
                ?[0,x,function(_Dm_){return take_while(p,xs$0,_Dm_)}]
                :0}
      return 0}
    function drop_while(p,xs,param)
     {var xs$0=xs;
      for(;;)
       {var node=caml_call1(xs$0,0);
        if(node)
         {var xs$1=node[2],x=node[1];
          if(caml_call1(p,x)){var xs$0=xs$1;continue}
          return node}
        return 0}}
    function group(eq,xs,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var
         xs$0=match[2],
         x=match[1],
         _Dd_=caml_call1(eq,x),
         _De_=function(_Dl_){return drop_while(_Dd_,xs$0,_Dl_)},
         _Df_=function(_Dk_){return group(eq,_De_,_Dk_)},
         _Dg_=caml_call1(eq,x),
         _Dh_=function(_Dj_){return take_while(_Dg_,xs$0,_Dj_)};
        return [0,function(_Di_){return [0,x,_Dh_]},_Df_]}
      return 0}
    var Forced_twice=[248,cst_Stdlib_Seq_Forced_twice,caml_fresh_oo_id(0)];
    function failure(param){throw Forced_twice}
    function memoize(xs)
     {function s$0(param)
       {var match=caml_call1(xs,0);
        if(match){var xs$0=match[2],x=match[1];return [0,x,memoize(xs$0)]}
        return 0}
      var s=to_lazy(s$0);
      return function(_Dc_)
       {var _Db_=caml_obj_tag(s);
        return 250 === _Db_?s[1]:246 === _Db_?force_lazy_block(s):s}}
    function once(xs)
     {function f(param)
       {var match=caml_call1(xs,0);
        if(match){var xs$0=match[2],x=match[1];return [0,x,once(xs$0)]}
        return 0}
      var action=[0,f];
      return function(param)
       {var f=exchange(action,failure);return caml_call1(f,0)}}
    function zip(xs,ys,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var xs$0=match[2],x=match[1],match$0=caml_call1(ys,0);
        if(match$0)
         {var ys$0=match$0[2],y=match$0[1];
          return [0,[0,x,y],function(_Da_){return zip(xs$0,ys$0,_Da_)}]}
        return 0}
      return 0}
    function map2(f,xs,ys,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var xs$0=match[2],x=match[1],match$0=caml_call1(ys,0);
        if(match$0)
         {var
           ys$0=match$0[2],
           y=match$0[1],
           _C__=function(_C$_){return map2(f,xs$0,ys$0,_C$_)};
          return [0,caml_call2(f,x,y),_C__]}
        return 0}
      return 0}
    function interleave(xs,ys,param)
     {var match=caml_call1(xs,0);
      if(match)
       {var xs$0=match[2],x=match[1];
        return [0,x,function(_C9_){return interleave(ys,xs$0,_C9_)}]}
      return caml_call1(ys,0)}
    function sorted_merge1(cmp,x,xs,y,ys)
     {return 0 < caml_call2(cmp,x,y)
              ?[0,
                y,
                function(_C7_)
                 {var match=caml_call1(ys,0);
                  if(match)
                   {var ys$0=match[2],y=match[1];
                    return sorted_merge1(cmp,x,xs,y,ys$0)}
                  return [0,x,xs]}]
              :[0,
                x,
                function(_C8_)
                 {var match=caml_call1(xs,0);
                  if(match)
                   {var xs$0=match[2],x=match[1];
                    return sorted_merge1(cmp,x,xs$0,y,ys)}
                  return [0,y,ys]}]}
    function sorted_merge(cmp,xs,ys,param)
     {var match=caml_call1(xs,0),match$0=caml_call1(ys,0);
      if(match)
       {if(match$0)
         {var ys$0=match$0[2],y=match$0[1],xs$0=match[2],x=match[1];
          return sorted_merge1(cmp,x,xs$0,y,ys$0)}
        var c=match}
      else
       {if(! match$0)return 0;var c=match$0}
      return c}
    function map_fst(xys,param)
     {var match=caml_call1(xys,0);
      if(match)
       {var xys$0=match[2],match$0=match[1],x=match$0[1];
        return [0,x,function(_C6_){return map_fst(xys$0,_C6_)}]}
      return 0}
    function map_snd(xys,param)
     {var match=caml_call1(xys,0);
      if(match)
       {var xys$0=match[2],match$0=match[1],y=match$0[2];
        return [0,y,function(_C5_){return map_snd(xys$0,_C5_)}]}
      return 0}
    function unzip(xys)
     {function _C2_(_C4_){return map_snd(xys,_C4_)}
      return [0,function(_C3_){return map_fst(xys,_C3_)},_C2_]}
    function filter_map_find_left_map(f,xs,param)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(f,x);
          if(0 === match$0[0])
           {var y=match$0[1];
            return [0,
                    y,
                    function(_C1_){return filter_map_find_left_map(f,xs$1,_C1_)}]}
          var xs$0=xs$1;
          continue}
        return 0}}
    function filter_map_find_right_map(f,xs,param)
     {var xs$0=xs;
      for(;;)
       {var match=caml_call1(xs$0,0);
        if(match)
         {var xs$1=match[2],x=match[1],match$0=caml_call1(f,x);
          if(0 === match$0[0]){var xs$0=xs$1;continue}
          var z=match$0[1];
          return [0,
                  z,
                  function(_C0_)
                   {return filter_map_find_right_map(f,xs$1,_C0_)}]}
        return 0}}
    function partition_map(f,xs)
     {function _CX_(_CZ_){return filter_map_find_right_map(f,xs,_CZ_)}
      return [0,
              function(_CY_){return filter_map_find_left_map(f,xs,_CY_)},
              _CX_]}
    function partition(p,xs)
     {function _CT_(x){return 1 - caml_call1(p,x)}
      function _CU_(_CW_){return filter(_CT_,xs,_CW_)}
      return [0,function(_CV_){return filter(p,xs,_CV_)},_CU_]}
    function peel(xss)
     {return unzip(function(_CS_){return filter_map(uncons,xss,_CS_)})}
    function transpose(xss,param)
     {var match=peel(xss),tails=match[2],heads=match[1];
      if(is_empty(heads))
       {if(is_empty(tails))return 0;throw [0,Assert_failure,_r_]}
      return [0,heads,function(_CR_){return transpose(tails,_CR_)}]}
    function _s_(remainders,xss,param)
     {var match=caml_call1(xss,0);
      if(match)
       {var xss$0=match[2],xs=match[1],match$0=caml_call1(xs,0);
        if(match$0)
         {var
           xs$0=match$0[2],
           x=match$0[1],
           match$1=peel(remainders),
           tails=match$1[2],
           heads=match$1[1],
           _CL_=function(_CQ_){return [0,xs$0,tails]},
           _CM_=function(_CP_){return _s_(_CL_,xss$0,_CP_)};
          return [0,function(_CO_){return [0,x,heads]},_CM_]}
        var match$2=peel(remainders),tails$0=match$2[2],heads$0=match$2[1];
        return [0,heads$0,function(_CN_){return _s_(tails$0,xss$0,_CN_)}]}
      return transpose(remainders,0)}
    function map_product(f,xs,ys)
     {function _CF_(x)
       {function _CJ_(y){return caml_call2(f,x,y)}
        return function(_CK_){return map$1(_CJ_,ys,_CK_)}}
      function xss(_CI_){return map$1(_CF_,xs,_CI_)}
      function _CE_(_CH_){return _s_(empty,xss,_CH_)}
      return function(_CG_){return concat(_CE_,_CG_)}}
    function product(xs,ys)
     {return map_product(function(x,y){return [0,x,y]},xs,ys)}
    function of_dispenser(it)
     {function c(param)
       {var match=caml_call1(it,0);
        if(match){var x=match[1];return [0,x,c]}
        return 0}
      return c}
    function to_dispenser(xs)
     {var s=[0,xs];
      return function(param)
       {var match=caml_call1(s[1],0);
        if(match){var xs=match[2],x=match[1];s[1] = xs;return [0,x]}
        return 0}}
    function ints(i,param)
     {var _CC_=i + 1 | 0;return [0,i,function(_CD_){return ints(_CC_,_CD_)}]}
    var
     Stdlib_Seq=
      [0,
       is_empty,
       uncons,
       length$0,
       iter,
       fold_left,
       iteri,
       fold_lefti,
       for_all,
       exists,
       find,
       find_map,
       iter2,
       fold_left2,
       for_all2,
       exists2,
       equal$0,
       compare$0,
       empty,
       return$0,
       cons,
       init,
       unfold,
       repeat,
       forever,
       cycle,
       iterate,
       map$1,
       mapi,
       filter,
       filter_map,
       scan,
       take,
       drop,
       take_while,
       drop_while,
       group,
       memoize,
       Forced_twice,
       once,
       transpose,
       append$0,
       concat,
       flat_map,
       flat_map,
       zip,
       map2,
       interleave,
       sorted_merge,
       product,
       map_product,
       unzip,
       unzip,
       partition_map,
       partition,
       of_dispenser,
       to_dispenser,
       ints];
    caml_register_global(782,Stdlib_Seq,"Stdlib__Seq");
    var none=0;
    function some(v){return [0,v]}
    function value(o,default$0){if(o){var v=o[1];return v}return default$0}
    function get$0(param)
     {if(param){var v=param[1];return v}
      return invalid_arg(cst_option_is_None)}
    function bind(o,f){if(o){var v=o[1];return caml_call1(f,v)}return 0}
    function join(param){if(param){var o=param[1];return o}return 0}
    function map$2(f,o){if(o){var v=o[1];return [0,caml_call1(f,v)]}return 0}
    function fold$0(none,some,param)
     {if(param){var v=param[1];return caml_call1(some,v)}return none}
    function iter$0(f,param)
     {if(param){var v=param[1];return caml_call1(f,v)}return 0}
    function is_none(param){return param?0:1}
    function is_some(param){return param?1:0}
    function equal$1(eq,o0,o1)
     {if(o0)
       {if(o1){var v1=o1[1],v0=o0[1];return caml_call2(eq,v0,v1)}}
      else
       if(! o1)return 1;
      return 0}
    function compare$1(cmp,o0,o1)
     {if(o0)
       {var _CB_=o0[1];
        if(o1){var v1=o1[1];return caml_call2(cmp,_CB_,v1)}
        return 1}
      return o1?-1:0}
    function to_result(none,param)
     {if(param){var v=param[1];return [0,v]}return [1,none]}
    function to_list(param){if(param){var v=param[1];return [0,v,0]}return 0}
    function to_seq(param)
     {if(param){var v=param[1];return function(_CA_){return return$0(v,_CA_)}}
      return empty}
    var
     Stdlib_Option=
      [0,
       none,
       some,
       value,
       get$0,
       bind,
       join,
       map$2,
       fold$0,
       iter$0,
       is_none,
       is_some,
       equal$1,
       compare$1,
       to_result,
       to_list,
       to_seq];
    caml_register_global(783,Stdlib_Option,"Stdlib__Option");
    function ok(v){return [0,v]}
    function error(e){return [1,e]}
    function value$0(r,default$0)
     {if(0 === r[0]){var v=r[1];return v}return default$0}
    function get_ok(param)
     {if(0 === param[0]){var v=param[1];return v}
      return invalid_arg(cst_result_is_Error)}
    function get_error(param)
     {if(0 === param[0])return invalid_arg(cst_result_is_Ok);
      var e=param[1];
      return e}
    function bind$0(r,f)
     {if(0 === r[0]){var v=r[1];return caml_call1(f,v)}return r}
    function join$0(e){if(0 === e[0]){var r=e[1];return r}return e}
    function map$3(f,e)
     {if(0 === e[0]){var v=e[1];return [0,caml_call1(f,v)]}return e}
    function map_error(f,v)
     {if(0 === v[0])return v;var e=v[1];return [1,caml_call1(f,e)]}
    function fold$1(ok,error,param)
     {if(0 === param[0]){var v=param[1];return caml_call1(ok,v)}
      var e=param[1];
      return caml_call1(error,e)}
    function iter$1(f,param)
     {if(0 === param[0]){var v=param[1];return caml_call1(f,v)}return 0}
    function iter_error(f,param)
     {if(0 === param[0])return 0;var e=param[1];return caml_call1(f,e)}
    function is_ok(param){return 0 === param[0]?1:0}
    function is_error(param){return 0 === param[0]?0:1}
    function equal$2(ok,error,r0,r1)
     {if(0 === r0[0])
       {var _Cy_=r0[1];
        if(0 === r1[0]){var v1=r1[1];return caml_call2(ok,_Cy_,v1)}}
      else
       {var _Cz_=r0[1];
        if(0 !== r1[0]){var e1=r1[1];return caml_call2(error,_Cz_,e1)}}
      return 0}
    function compare$2(ok,error,r0,r1)
     {if(0 === r0[0])
       {var _Cw_=r0[1];
        if(0 === r1[0]){var v1=r1[1];return caml_call2(ok,_Cw_,v1)}
        return -1}
      var _Cx_=r0[1];
      if(0 === r1[0])return 1;
      var e1=r1[1];
      return caml_call2(error,_Cx_,e1)}
    function to_option(param)
     {if(0 === param[0]){var v=param[1];return [0,v]}return 0}
    function to_list$0(param)
     {if(0 === param[0]){var v=param[1];return [0,v,0]}return 0}
    function to_seq$0(param)
     {if(0 === param[0])
       {var v=param[1];return function(_Cv_){return return$0(v,_Cv_)}}
      return empty}
    var
     Stdlib_Result=
      [0,
       ok,
       error,
       value$0,
       get_ok,
       get_error,
       bind$0,
       join$0,
       map$3,
       map_error,
       fold$1,
       iter$1,
       iter_error,
       is_ok,
       is_error,
       equal$2,
       compare$2,
       to_option,
       to_list$0,
       to_seq$0];
    caml_register_global(784,Stdlib_Result,"Stdlib__Result");
    function equal$3(_Cu_,_Ct_){return _Cu_ === _Ct_?1:0}
    var compare$3=caml_int_compare;
    function to_float(param){return param?1.:0.}
    function to_string$0(param){return param?cst_true$2:cst_false$2}
    function _t_(_Cs_){return _Cs_}
    var
     Stdlib_Bool=
      [0,
       function(_Cr_){return 1 - _Cr_},
       equal$3,
       compare$3,
       _t_,
       to_float,
       to_string$0];
    caml_register_global(785,Stdlib_Bool,"Stdlib__Bool");
    function chr(n)
     {if(0 <= n && ! (255 < n))return n;return invalid_arg(cst_Char_chr)}
    function escaped(c)
     {var switch$0=0;
      if(40 <= c)
       {if(92 === c)return cst$1;if(! (127 <= c))switch$0 = 1}
      else
       if(32 <= c)
        {if(39 <= c)return cst$2;switch$0 = 1}
       else
        if(! (14 <= c))
         switch(c)
          {case 8:return cst_b;
           case 9:return cst_t;
           case 10:return cst_n;
           case 13:return cst_r
           }
      if(switch$0)
       {var s$0=caml_create_bytes(1);
        caml_bytes_unsafe_set(s$0,0,c);
        return caml_string_of_bytes(s$0)}
      var s=caml_create_bytes(4);
      caml_bytes_unsafe_set(s,0,92);
      caml_bytes_unsafe_set(s,1,48 + (c / 100 | 0) | 0);
      caml_bytes_unsafe_set(s,2,48 + ((c / 10 | 0) % 10 | 0) | 0);
      caml_bytes_unsafe_set(s,3,48 + (c % 10 | 0) | 0);
      return caml_string_of_bytes(s)}
    function lowercase(c)
     {var _Cq_=c - 192 | 0,switch$0=0;
      if(30 < _Cq_ >>> 0)
       {if(! (25 < _Cq_ + 127 >>> 0))switch$0 = 1}
      else
       if(23 !== _Cq_)switch$0 = 1;
      return switch$0?c + 32 | 0:c}
    function uppercase(c)
     {var _Cp_=c - 224 | 0,switch$0=0;
      if(30 < _Cp_ >>> 0)
       {if(! (25 < _Cp_ + 127 >>> 0))switch$0 = 1}
      else
       if(23 !== _Cp_)switch$0 = 1;
      return switch$0?c - 32 | 0:c}
    function lowercase_ascii(c){return 25 < c - 65 >>> 0?c:c + 32 | 0}
    function uppercase_ascii(c){return 25 < c - 97 >>> 0?c:c - 32 | 0}
    function compare$4(c1,c2){return c1 - c2 | 0}
    function equal$4(c1,c2){return 0 === (c1 - c2 | 0)?1:0}
    var
     Stdlib_Char=
      [0,
       chr,
       escaped,
       lowercase,
       uppercase,
       lowercase_ascii,
       uppercase_ascii,
       compare$4,
       equal$4];
    caml_register_global(786,Stdlib_Char,"Stdlib__Char");
    var
     min$0=0,
     max$0=1114111,
     lo_bound=55295,
     hi_bound=57344,
     bom=65279,
     rep=65533;
    function succ(u)
     {return u === 55295
              ?hi_bound
              :u === 1114111?invalid_arg(err_no_succ):u + 1 | 0}
    function pred(u)
     {return u === 57344?lo_bound:u === 0?invalid_arg(err_no_pred):u - 1 | 0}
    function is_valid(i)
     {var _Cl_=0 <= i?1:0,_Cm_=_Cl_?i <= 55295?1:0:_Cl_;
      if(_Cm_)
       var _Cn_=_Cm_;
      else
       var _Co_=57344 <= i?1:0,_Cn_=_Co_?i <= 1114111?1:0:_Co_;
      return _Cn_}
    function of_int(i)
     {return is_valid(i)
              ?i
              :invalid_arg
                (cat(caml_format_int(cst_X,i),cst_is_not_an_Unicode_scalar_v))}
    function is_char(u){return u < 256?1:0}
    function of_char(c){return c}
    function to_char(u)
     {return 255 < u
              ?invalid_arg
                (cat
                  (cst_U,
                   cat
                    (caml_format_int(cst_04X,u),cst_is_not_a_latin1_character)))
              :u}
    function unsafe_to_char(_Ck_){return _Ck_}
    function equal$5(_Cj_,_Ci_){return _Cj_ === _Ci_?1:0}
    var compare$5=caml_int_compare;
    function hash(_Ch_){return _Ch_}
    function utf_decode_is_valid(d){return 1 === (d >>> 27 | 0)?1:0}
    function utf_decode_length(d){return (d >>> 24 | 0) & 7}
    function utf_decode_uchar(d){return d & 16777215}
    function utf_decode(n,u){return (8 | n) << 24 | u}
    function dec_invalid(n){return n << 24 | 65533}
    function utf_8_byte_length(u)
     {if(0 <= u)
       {if(127 < u)
         {if(2047 < u)
           {if(65535 < u)
             {if(1114111 < u)throw [0,Assert_failure,_u_];return 4}
            return 3}
          return 2}
        return 1}
      throw [0,Assert_failure,_v_]}
    function utf_16_byte_length(u)
     {if(0 <= u)
       {if(65535 < u){if(1114111 < u)throw [0,Assert_failure,_w_];return 4}
        return 2}
      throw [0,Assert_failure,_x_]}
    function _y_(_Cg_){return _Cg_}
    var
     Stdlib_Uchar=
      [0,
       min$0,
       max$0,
       bom,
       rep,
       succ,
       pred,
       is_valid,
       of_int,
       function(_Cf_){return _Cf_},
       _y_,
       is_char,
       of_char,
       to_char,
       unsafe_to_char,
       equal$5,
       compare$5,
       hash,
       utf_decode_is_valid,
       utf_decode_uchar,
       utf_decode_length,
       utf_decode,
       dec_invalid,
       utf_8_byte_length,
       utf_16_byte_length];
    caml_register_global(787,Stdlib_Uchar,"Stdlib__Uchar");
    function length$1(l)
     {var len=0,param=l;
      for(;;)
       {if(param)
         {var param$0=param[2],len$0=len + 1 | 0,len=len$0,param=param$0;
          continue}
        return len}}
    function cons$0(a,l){return [0,a,l]}
    function hd(param)
     {if(param){var a=param[1];return a}return failwith(cst_hd)}
    function tl(param)
     {if(param){var l=param[2];return l}return failwith(cst_tl)}
    function nth(l,n)
     {if(0 <= n)
       {var l$0=l,n$0=n;
        for(;;)
         {if(l$0)
           {var l$1=l$0[2],a=l$0[1];
            if(0 === n$0)return a;
            var n$1=n$0 - 1 | 0,l$0=l$1,n$0=n$1;
            continue}
          return failwith(cst_nth)}}
      return invalid_arg(cst_List_nth)}
    function nth_opt(l,n)
     {if(0 <= n)
       {var l$0=l,n$0=n;
        for(;;)
         {if(l$0)
           {var l$1=l$0[2],a=l$0[1];
            if(0 === n$0)return [0,a];
            var n$1=n$0 - 1 | 0,l$0=l$1,n$0=n$1;
            continue}
          return 0}}
      return invalid_arg(cst_List_nth$0)}
    function rev_append(l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {var l1$1=l1$0[2],a=l1$0[1],l2$1=[0,a,l2$0],l1$0=l1$1,l2$0=l2$1;
          continue}
        return l2$0}}
    function rev(l){return rev_append(l,0)}
    function init_aux$0(i,n,f)
     {if(n <= i)return 0;
      var r=caml_call1(f,i);
      return [0,r,init_aux$0(i + 1 | 0,n,f)]}
    function init$0(len,f)
     {if(0 <= len)
       {if(50 < len)
         {var acc=0,i=0;
          for(;;)
           {if(len <= i)return rev(acc);
            var i$0=i + 1 | 0,acc$0=[0,caml_call1(f,i),acc],acc=acc$0,i=i$0;
            continue}}
        return init_aux$0(0,len,f)}
      return invalid_arg(cst_List_init)}
    function flatten(param)
     {if(param){var r=param[2],l=param[1];return append(l,flatten(r))}
      return 0}
    function map$4(f,param)
     {if(param)
       {var l=param[2],a=param[1],r=caml_call1(f,a);return [0,r,map$4(f,l)]}
      return 0}
    function _z_(i,f,param)
     {if(param)
       {var l=param[2],a=param[1],r=caml_call2(f,i,a);
        return [0,r,_z_(i + 1 | 0,f,l)]}
      return 0}
    function mapi$0(f,l){return _z_(0,f,l)}
    function rev_map(f,param)
     {var accu=0,param$0=param;
      for(;;)
       {if(param$0)
         {var
           l=param$0[2],
           a=param$0[1],
           accu$0=[0,caml_call1(f,a),accu],
           accu=accu$0,
           param$0=l;
          continue}
        return accu}}
    function iter$2(f,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],a=param$0[1];
          caml_call1(f,a);
          var param$0=l;
          continue}
        return 0}}
    function iteri$0(f,l$0)
     {var i=0,param=l$0;
      for(;;)
       {if(param)
         {var l=param[2],a=param[1];
          caml_call2(f,i,a);
          var i$0=i + 1 | 0,i=i$0,param=l;
          continue}
        return 0}}
    function fold_left$0(f,accu,l)
     {var accu$0=accu,l$0=l;
      for(;;)
       {if(l$0)
         {var
           l$1=l$0[2],
           a=l$0[1],
           accu$1=caml_call2(f,accu$0,a),
           accu$0=accu$1,
           l$0=l$1;
          continue}
        return accu$0}}
    function fold_right(f,l,accu)
     {if(l){var l$0=l[2],a=l[1];return caml_call2(f,a,fold_right(f,l$0,accu))}
      return accu}
    function map2$0(f,l1,l2)
     {if(l1)
       {if(l2)
         {var l2$0=l2[2],a2=l2[1],l1$0=l1[2],a1=l1[1],r=caml_call2(f,a1,a2);
          return [0,r,map2$0(f,l1$0,l2$0)]}}
      else
       if(! l2)return 0;
      return invalid_arg(cst_List_map2)}
    function rev_map2(f,l1,l2)
     {var accu=0,l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             l2$1=l2$0[2],
             a2=l2$0[1],
             l1$1=l1$0[2],
             a1=l1$0[1],
             accu$0=[0,caml_call2(f,a1,a2),accu],
             accu=accu$0,
             l1$0=l1$1,
             l2$0=l2$1;
            continue}}
        else
         if(! l2$0)return accu;
        return invalid_arg(cst_List_rev_map2)}}
    function iter2$0(f,l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var l2$1=l2$0[2],a2=l2$0[1],l1$1=l1$0[2],a1=l1$0[1];
            caml_call2(f,a1,a2);
            var l1$0=l1$1,l2$0=l2$1;
            continue}}
        else
         if(! l2$0)return 0;
        return invalid_arg(cst_List_iter2)}}
    function fold_left2$0(f,accu,l1,l2)
     {var accu$0=accu,l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             l2$1=l2$0[2],
             a2=l2$0[1],
             l1$1=l1$0[2],
             a1=l1$0[1],
             accu$1=caml_call3(f,accu$0,a1,a2),
             accu$0=accu$1,
             l1$0=l1$1,
             l2$0=l2$1;
            continue}}
        else
         if(! l2$0)return accu$0;
        return invalid_arg(cst_List_fold_left2)}}
    function fold_right2(f,l1,l2,accu)
     {if(l1)
       {if(l2)
         {var l2$0=l2[2],a2=l2[1],l1$0=l1[2],a1=l1[1];
          return caml_call3(f,a1,a2,fold_right2(f,l1$0,l2$0,accu))}}
      else
       if(! l2)return accu;
      return invalid_arg(cst_List_fold_right2)}
    function for_all$0(p,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],a=param$0[1],_Ce_=caml_call1(p,a);
          if(_Ce_){var param$0=l;continue}
          return _Ce_}
        return 1}}
    function exists$0(p,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],a=param$0[1],_Cd_=caml_call1(p,a);
          if(_Cd_)return _Cd_;
          var param$0=l;
          continue}
        return 0}}
    function for_all2$0(p,l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             l2$1=l2$0[2],
             a2=l2$0[1],
             l1$1=l1$0[2],
             a1=l1$0[1],
             _Cc_=caml_call2(p,a1,a2);
            if(_Cc_){var l1$0=l1$1,l2$0=l2$1;continue}
            return _Cc_}}
        else
         if(! l2$0)return 1;
        return invalid_arg(cst_List_for_all2)}}
    function exists2$0(p,l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             l2$1=l2$0[2],
             a2=l2$0[1],
             l1$1=l1$0[2],
             a1=l1$0[1],
             _Cb_=caml_call2(p,a1,a2);
            if(_Cb_)return _Cb_;
            var l1$0=l1$1,l2$0=l2$1;
            continue}}
        else
         if(! l2$0)return 0;
        return invalid_arg(cst_List_exists2)}}
    function mem(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],a=param$0[1],_Ca_=0 === caml_compare(a,x)?1:0;
          if(_Ca_)return _Ca_;
          var param$0=l;
          continue}
        return 0}}
    function memq(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],a=param$0[1],_B$_=a === x?1:0;
          if(_B$_)return _B$_;
          var param$0=l;
          continue}
        return 0}}
    function assoc(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],match=param$0[1],b=match[2],a=match[1];
          if(0 === caml_compare(a,x))return b;
          var param$0=l;
          continue}
        throw Not_found}}
    function assoc_opt(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],match=param$0[1],b=match[2],a=match[1];
          if(0 === caml_compare(a,x))return [0,b];
          var param$0=l;
          continue}
        return 0}}
    function assq(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],match=param$0[1],b=match[2],a=match[1];
          if(a === x)return b;
          var param$0=l;
          continue}
        throw Not_found}}
    function assq_opt(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],match=param$0[1],b=match[2],a=match[1];
          if(a === x)return [0,b];
          var param$0=l;
          continue}
        return 0}}
    function mem_assoc(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var
           l=param$0[2],
           match=param$0[1],
           a=match[1],
           _B__=0 === caml_compare(a,x)?1:0;
          if(_B__)return _B__;
          var param$0=l;
          continue}
        return 0}}
    function mem_assq(x,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],match=param$0[1],a=match[1],_B9_=a === x?1:0;
          if(_B9_)return _B9_;
          var param$0=l;
          continue}
        return 0}}
    function remove_assoc(x,param)
     {if(param)
       {var l=param[2],pair=param[1],a=pair[1];
        return 0 === caml_compare(a,x)?l:[0,pair,remove_assoc(x,l)]}
      return 0}
    function remove_assq(x,param)
     {if(param)
       {var l=param[2],pair=param[1],a=pair[1];
        return a === x?l:[0,pair,remove_assq(x,l)]}
      return 0}
    function find$0(p,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],x=param$0[1];
          if(caml_call1(p,x))return x;
          var param$0=l;
          continue}
        throw Not_found}}
    function find_opt(p,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],x=param$0[1];
          if(caml_call1(p,x))return [0,x];
          var param$0=l;
          continue}
        return 0}}
    function find_map$0(f,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],x=param$0[1],result=caml_call1(f,x);
          if(result)return result;
          var param$0=l;
          continue}
        return 0}}
    function find_all(p)
     {var accu=0;
      return function(param$0)
       {var accu$0=accu,param=param$0;
        for(;;)
         {if(param)
           {var l=param[2],x=param[1];
            if(caml_call1(p,x))
             {var accu$1=[0,x,accu$0],accu$0=accu$1,param=l;continue}
            var param=l;
            continue}
          return rev(accu$0)}}}
    function filteri(p,param)
     {var i=0,acc=0,param$0=param;
      for(;;)
       {if(param$0)
         {var
           l=param$0[2],
           x=param$0[1],
           acc$0=caml_call2(p,i,x)?[0,x,acc]:acc,
           i$0=i + 1 | 0,
           i=i$0,
           acc=acc$0,
           param$0=l;
          continue}
        return rev(acc)}}
    function filter_map$0(f)
     {var accu=0;
      return function(param$0)
       {var accu$0=accu,param=param$0;
        for(;;)
         {if(param)
           {var l=param[2],x=param[1],match=caml_call1(f,x);
            if(match)
             {var v=match[1],accu$1=[0,v,accu$0],accu$0=accu$1,param=l;
              continue}
            var param=l;
            continue}
          return rev(accu$0)}}}
    function concat_map(f,param)
     {var acc=0,param$0=param;
      for(;;)
       {if(param$0)
         {var
           l=param$0[2],
           x=param$0[1],
           xs=caml_call1(f,x),
           acc$0=rev_append(xs,acc),
           acc=acc$0,
           param$0=l;
          continue}
        return rev(acc)}}
    function fold_left_map(f,accu,param)
     {var accu$0=accu,l_accu=0,param$0=param;
      for(;;)
       {if(param$0)
         {var
           l=param$0[2],
           x=param$0[1],
           match=caml_call2(f,accu$0,x),
           x$0=match[2],
           accu$1=match[1],
           l_accu$0=[0,x$0,l_accu],
           accu$0=accu$1,
           l_accu=l_accu$0,
           param$0=l;
          continue}
        return [0,accu$0,rev(l_accu)]}}
    function partition$0(p,param)
     {var yes=0,no=0,param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],x=param$0[1];
          if(caml_call1(p,x))
           {var yes$0=[0,x,yes],yes=yes$0,param$0=l;continue}
          var no$0=[0,x,no],no=no$0,param$0=l;
          continue}
        var _B8_=rev(no);
        return [0,rev(yes),_B8_]}}
    function partition_map$0(p,param)
     {var left=0,right=0,param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],x=param$0[1],match=caml_call1(p,x);
          if(0 === match[0])
           {var v=match[1],left$0=[0,v,left],left=left$0,param$0=l;continue}
          var v$0=match[1],right$0=[0,v$0,right],right=right$0,param$0=l;
          continue}
        var _B7_=rev(right);
        return [0,rev(left),_B7_]}}
    function split(param)
     {if(param)
       {var
         l=param[2],
         match=param[1],
         y=match[2],
         x=match[1],
         match$0=split(l),
         ry=match$0[2],
         rx=match$0[1];
        return [0,[0,x,rx],[0,y,ry]]}
      return _A_}
    function combine(l1,l2)
     {if(l1)
       {if(l2)
         {var l2$0=l2[2],a2=l2[1],l1$0=l1[2],a1=l1[1];
          return [0,[0,a1,a2],combine(l1$0,l2$0)]}}
      else
       if(! l2)return 0;
      return invalid_arg(cst_List_combine)}
    function merge(cmp,l1,l2)
     {if(l1)
       {if(l2)
         {var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
          return 0 < caml_call2(cmp,h1,h2)
                  ?[0,h2,merge(cmp,l1,t2)]
                  :[0,h1,merge(cmp,t1,l2)]}
        return l1}
      return l2}
    function fast_sort(cmp,l)
     {function rev_sort(n,l)
       {if(2 === n)
         {if(l)
           {var _B3_=l[2];
            if(_B3_)
             {var
               tl=_B3_[2],
               x2=_B3_[1],
               x1=l[1],
               s=0 < caml_call2(cmp,x1,x2)?[0,x1,[0,x2,0]]:[0,x2,[0,x1,0]];
              return [0,s,tl]}}}
        else
         if(3 === n && l)
          {var _B5_=l[2];
           if(_B5_)
            {var _B6_=_B5_[2];
             if(_B6_)
              {var
                tl$1=_B6_[2],
                x3=_B6_[1],
                x2$0=_B5_[1],
                x1$0=l[1],
                s$0=
                 0 < caml_call2(cmp,x1$0,x2$0)
                  ?0 < caml_call2(cmp,x2$0,x3)
                    ?[0,x1$0,[0,x2$0,[0,x3,0]]]
                    :0 < caml_call2(cmp,x1$0,x3)
                      ?[0,x1$0,[0,x3,[0,x2$0,0]]]
                      :[0,x3,[0,x1$0,[0,x2$0,0]]]
                  :0 < caml_call2(cmp,x1$0,x3)
                    ?[0,x2$0,[0,x1$0,[0,x3,0]]]
                    :0 < caml_call2(cmp,x2$0,x3)
                      ?[0,x2$0,[0,x3,[0,x1$0,0]]]
                      :[0,x3,[0,x2$0,[0,x1$0,0]]];
               return [0,s$0,tl$1]}}}
        var
         n1=n >> 1,
         n2=n - n1 | 0,
         match=sort(n1,l),
         l2$0=match[2],
         s1=match[1],
         match$0=sort(n2,l2$0),
         tl$0=match$0[2],
         s2=match$0[1],
         l1=s1,
         l2=s2,
         accu=0;
        for(;;)
         {if(l1)
           {if(l2)
             {var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
              if(0 < caml_call2(cmp,h1,h2))
               {var accu$0=[0,h2,accu],l2=t2,accu=accu$0;continue}
              var accu$1=[0,h1,accu],l1=t1,accu=accu$1;
              continue}
            var _B4_=rev_append(l1,accu)}
          else
           var _B4_=rev_append(l2,accu);
          return [0,_B4_,tl$0]}}
      function sort(n,l)
       {if(2 === n)
         {if(l)
           {var _BZ_=l[2];
            if(_BZ_)
             {var
               tl=_BZ_[2],
               x2=_BZ_[1],
               x1=l[1],
               s=0 < caml_call2(cmp,x1,x2)?[0,x2,[0,x1,0]]:[0,x1,[0,x2,0]];
              return [0,s,tl]}}}
        else
         if(3 === n && l)
          {var _B1_=l[2];
           if(_B1_)
            {var _B2_=_B1_[2];
             if(_B2_)
              {var
                tl$1=_B2_[2],
                x3=_B2_[1],
                x2$0=_B1_[1],
                x1$0=l[1],
                s$0=
                 0 < caml_call2(cmp,x1$0,x2$0)
                  ?0 < caml_call2(cmp,x1$0,x3)
                    ?0 < caml_call2(cmp,x2$0,x3)
                      ?[0,x3,[0,x2$0,[0,x1$0,0]]]
                      :[0,x2$0,[0,x3,[0,x1$0,0]]]
                    :[0,x2$0,[0,x1$0,[0,x3,0]]]
                  :0 < caml_call2(cmp,x2$0,x3)
                    ?0 < caml_call2(cmp,x1$0,x3)
                      ?[0,x3,[0,x1$0,[0,x2$0,0]]]
                      :[0,x1$0,[0,x3,[0,x2$0,0]]]
                    :[0,x1$0,[0,x2$0,[0,x3,0]]];
               return [0,s$0,tl$1]}}}
        var
         n1=n >> 1,
         n2=n - n1 | 0,
         match=rev_sort(n1,l),
         l2$0=match[2],
         s1=match[1],
         match$0=rev_sort(n2,l2$0),
         tl$0=match$0[2],
         s2=match$0[1],
         l1=s1,
         l2=s2,
         accu=0;
        for(;;)
         {if(l1)
           {if(l2)
             {var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
              if(0 < caml_call2(cmp,h1,h2))
               {var accu$0=[0,h1,accu],l1=t1,accu=accu$0;continue}
              var accu$1=[0,h2,accu],l2=t2,accu=accu$1;
              continue}
            var _B0_=rev_append(l1,accu)}
          else
           var _B0_=rev_append(l2,accu);
          return [0,_B0_,tl$0]}}
      var len=length$1(l);
      return 2 <= len?sort(len,l)[1]:l}
    function sort_uniq(cmp,l)
     {function rev_sort(n,l)
       {if(2 === n)
         {if(l)
           {var _BQ_=l[2];
            if(_BQ_)
             {var
               tl=_BQ_[2],
               x2=_BQ_[1],
               x1=l[1],
               c$0=caml_call2(cmp,x1,x2),
               s=0 === c$0?[0,x1,0]:0 < c$0?[0,x1,[0,x2,0]]:[0,x2,[0,x1,0]];
              return [0,s,tl]}}}
        else
         if(3 === n && l)
          {var _BS_=l[2];
           if(_BS_)
            {var _BT_=_BS_[2];
             if(_BT_)
              {var
                tl$1=_BT_[2],
                x3=_BT_[1],
                x2$0=_BS_[1],
                x1$0=l[1],
                c$1=caml_call2(cmp,x1$0,x2$0);
               if(0 === c$1)
                var
                 c$2=caml_call2(cmp,x2$0,x3),
                 _BU_=
                  0 === c$2
                   ?[0,x2$0,0]
                   :0 < c$2?[0,x2$0,[0,x3,0]]:[0,x3,[0,x2$0,0]],
                 s$0=_BU_;
               else
                if(0 < c$1)
                 {var c$3=caml_call2(cmp,x2$0,x3);
                  if(0 === c$3)
                   var _BV_=[0,x1$0,[0,x2$0,0]];
                  else
                   if(0 < c$3)
                    var _BV_=[0,x1$0,[0,x2$0,[0,x3,0]]];
                   else
                    var
                     c$4=caml_call2(cmp,x1$0,x3),
                     _BW_=
                      0 === c$4
                       ?[0,x1$0,[0,x2$0,0]]
                       :0 < c$4
                         ?[0,x1$0,[0,x3,[0,x2$0,0]]]
                         :[0,x3,[0,x1$0,[0,x2$0,0]]],
                     _BV_=_BW_;
                  var s$0=_BV_}
                else
                 {var c$5=caml_call2(cmp,x1$0,x3);
                  if(0 === c$5)
                   var _BX_=[0,x2$0,[0,x1$0,0]];
                  else
                   if(0 < c$5)
                    var _BX_=[0,x2$0,[0,x1$0,[0,x3,0]]];
                   else
                    var
                     c$6=caml_call2(cmp,x2$0,x3),
                     _BY_=
                      0 === c$6
                       ?[0,x2$0,[0,x1$0,0]]
                       :0 < c$6
                         ?[0,x2$0,[0,x3,[0,x1$0,0]]]
                         :[0,x3,[0,x2$0,[0,x1$0,0]]],
                     _BX_=_BY_;
                  var s$0=_BX_}
               return [0,s$0,tl$1]}}}
        var
         n1=n >> 1,
         n2=n - n1 | 0,
         match=sort(n1,l),
         l2$0=match[2],
         s1=match[1],
         match$0=sort(n2,l2$0),
         tl$0=match$0[2],
         s2=match$0[1],
         l1=s1,
         l2=s2,
         accu=0;
        for(;;)
         {if(l1)
           {if(l2)
             {var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1],c=caml_call2(cmp,h1,h2);
              if(0 === c)
               {var accu$0=[0,h1,accu],l1=t1,l2=t2,accu=accu$0;continue}
              if(0 <= c){var accu$1=[0,h2,accu],l2=t2,accu=accu$1;continue}
              var accu$2=[0,h1,accu],l1=t1,accu=accu$2;
              continue}
            var _BR_=rev_append(l1,accu)}
          else
           var _BR_=rev_append(l2,accu);
          return [0,_BR_,tl$0]}}
      function sort(n,l)
       {if(2 === n)
         {if(l)
           {var _BH_=l[2];
            if(_BH_)
             {var
               tl=_BH_[2],
               x2=_BH_[1],
               x1=l[1],
               c$0=caml_call2(cmp,x1,x2),
               s=0 === c$0?[0,x1,0]:0 <= c$0?[0,x2,[0,x1,0]]:[0,x1,[0,x2,0]];
              return [0,s,tl]}}}
        else
         if(3 === n && l)
          {var _BJ_=l[2];
           if(_BJ_)
            {var _BK_=_BJ_[2];
             if(_BK_)
              {var
                tl$1=_BK_[2],
                x3=_BK_[1],
                x2$0=_BJ_[1],
                x1$0=l[1],
                c$1=caml_call2(cmp,x1$0,x2$0);
               if(0 === c$1)
                var
                 c$2=caml_call2(cmp,x2$0,x3),
                 _BL_=
                  0 === c$2
                   ?[0,x2$0,0]
                   :0 <= c$2?[0,x3,[0,x2$0,0]]:[0,x2$0,[0,x3,0]],
                 s$0=_BL_;
               else
                if(0 <= c$1)
                 {var c$3=caml_call2(cmp,x1$0,x3);
                  if(0 === c$3)
                   var _BM_=[0,x2$0,[0,x1$0,0]];
                  else
                   if(0 <= c$3)
                    var
                     c$4=caml_call2(cmp,x2$0,x3),
                     _BN_=
                      0 === c$4
                       ?[0,x2$0,[0,x1$0,0]]
                       :0 <= c$4
                         ?[0,x3,[0,x2$0,[0,x1$0,0]]]
                         :[0,x2$0,[0,x3,[0,x1$0,0]]],
                     _BM_=_BN_;
                   else
                    var _BM_=[0,x2$0,[0,x1$0,[0,x3,0]]];
                  var s$0=_BM_}
                else
                 {var c$5=caml_call2(cmp,x2$0,x3);
                  if(0 === c$5)
                   var _BO_=[0,x1$0,[0,x2$0,0]];
                  else
                   if(0 <= c$5)
                    var
                     c$6=caml_call2(cmp,x1$0,x3),
                     _BP_=
                      0 === c$6
                       ?[0,x1$0,[0,x2$0,0]]
                       :0 <= c$6
                         ?[0,x3,[0,x1$0,[0,x2$0,0]]]
                         :[0,x1$0,[0,x3,[0,x2$0,0]]],
                     _BO_=_BP_;
                   else
                    var _BO_=[0,x1$0,[0,x2$0,[0,x3,0]]];
                  var s$0=_BO_}
               return [0,s$0,tl$1]}}}
        var
         n1=n >> 1,
         n2=n - n1 | 0,
         match=rev_sort(n1,l),
         l2$0=match[2],
         s1=match[1],
         match$0=rev_sort(n2,l2$0),
         tl$0=match$0[2],
         s2=match$0[1],
         l1=s1,
         l2=s2,
         accu=0;
        for(;;)
         {if(l1)
           {if(l2)
             {var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1],c=caml_call2(cmp,h1,h2);
              if(0 === c)
               {var accu$0=[0,h1,accu],l1=t1,l2=t2,accu=accu$0;continue}
              if(0 < c){var accu$1=[0,h1,accu],l1=t1,accu=accu$1;continue}
              var accu$2=[0,h2,accu],l2=t2,accu=accu$2;
              continue}
            var _BI_=rev_append(l1,accu)}
          else
           var _BI_=rev_append(l2,accu);
          return [0,_BI_,tl$0]}}
      var len=length$1(l);
      return 2 <= len?sort(len,l)[1]:l}
    function compare_lengths(l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0){var l2$1=l2$0[2],l1$1=l1$0[2],l1$0=l1$1,l2$0=l2$1;continue}
          return 1}
        return l2$0?-1:0}}
    function compare_length_with(l,n)
     {var l$0=l,n$0=n;
      for(;;)
       {if(l$0)
         {var l$1=l$0[2];
          if(0 < n$0){var n$1=n$0 - 1 | 0,l$0=l$1,n$0=n$1;continue}
          return 1}
        return 0 === n$0?0:0 < n$0?-1:1}}
    function equal$6(eq,l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             l2$1=l2$0[2],
             a2=l2$0[1],
             l1$1=l1$0[2],
             a1=l1$0[1],
             _BG_=caml_call2(eq,a1,a2);
            if(_BG_){var l1$0=l1$1,l2$0=l2$1;continue}
            return _BG_}}
        else
         if(! l2$0)return 1;
        return 0}}
    function compare$6(cmp,l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {var _BE_=l1$0[2],_BF_=l1$0[1];
          if(l2$0)
           {var l2$1=l2$0[2],a2=l2$0[1],c=caml_call2(cmp,_BF_,a2);
            if(0 === c){var l1$0=_BE_,l2$0=l2$1;continue}
            return c}
          return 1}
        return l2$0?-1:0}}
    function to_seq$1(l)
     {function aux(l,param)
       {if(l)
         {var tail=l[2],x=l[1];
          return [0,x,function(_BD_){return aux(tail,_BD_)}]}
        return 0}
      return function(_BC_){return aux(l,_BC_)}}
    function of_seq(seq)
     {function direct(depth,seq)
       {if(0 === depth)
         {var _BB_=0;
          return rev(fold_left(function(acc,x){return [0,x,acc]},_BB_,seq))}
        var match=caml_call1(seq,0);
        if(match)
         {var next=match[2],x=match[1];
          return [0,x,direct(depth - 1 | 0,next)]}
        return 0}
      return direct(500,seq)}
    var
     include$0=
      [0,
       length$1,
       compare_lengths,
       compare_length_with,
       cons$0,
       hd,
       tl,
       nth,
       nth_opt,
       rev,
       init$0,
       append,
       rev_append,
       flatten,
       flatten,
       equal$6,
       compare$6,
       iter$2,
       iteri$0,
       map$4,
       mapi$0,
       rev_map,
       filter_map$0,
       concat_map,
       fold_left_map,
       fold_left$0,
       fold_right,
       iter2$0,
       map2$0,
       rev_map2,
       fold_left2$0,
       fold_right2,
       for_all$0,
       exists$0,
       for_all2$0,
       exists2$0,
       mem,
       memq,
       find$0,
       find_opt,
       find_map$0,
       find_all,
       find_all,
       filteri,
       partition$0,
       partition_map$0,
       assoc,
       assoc_opt,
       assq,
       assq_opt,
       mem_assoc,
       mem_assq,
       remove_assoc,
       remove_assq,
       split,
       combine,
       fast_sort,
       fast_sort,
       fast_sort,
       sort_uniq,
       merge,
       to_seq$1,
       of_seq];
    caml_register_global(788,include$0,"Stdlib__List");
    var zero=0,one=1,minus_one=-1;
    function abs$0(x){return 0 <= x?x:- x | 0}
    var max_int$0=2147483647,min_int$0=-2147483648;
    function lognot(x){return x ^ -1}
    function equal$7(_BA_,_Bz_){return _BA_ === _Bz_?1:0}
    var compare$7=caml_int_compare;
    function min$1(x,y){return x <= y?x:y}
    function max$1(x,y){return y <= x?x:y}
    function to_string$1(x){return caml_string_of_jsbytes("" + x)}
    var
     Stdlib_Int=
      [0,
       zero,
       one,
       minus_one,
       abs$0,
       max_int$0,
       min_int$0,
       lognot,
       equal$7,
       compare$7,
       min$1,
       max$1,
       to_string$1];
    caml_register_global(789,Stdlib_Int,"Stdlib__Int");
    function make$0(n,c)
     {var s=caml_create_bytes(n);caml_fill_bytes(s,0,n,c);return s}
    function init$1(n,f)
     {var s=caml_create_bytes(n),_Bx_=n - 1 | 0,_Bw_=0;
      if(! (_Bx_ < 0))
       {var i=_Bw_;
        for(;;)
         {caml_bytes_unsafe_set(s,i,caml_call1(f,i));
          var _By_=i + 1 | 0;
          if(_Bx_ !== i){var i=_By_;continue}
          break}}
      return s}
    var empty$0=caml_create_bytes(0);
    function copy(s)
     {var len=caml_ml_bytes_length(s),r=caml_create_bytes(len);
      caml_blit_bytes(s,0,r,0,len);
      return r}
    function of_bytes(b){return caml_string_of_bytes(copy(b))}
    function to_bytes(s){return copy(caml_bytes_of_string(s))}
    function sub(s,ofs,len)
     {if
       (0 <= ofs && 0 <= len && ! ((caml_ml_bytes_length(s) - len | 0) < ofs))
       {var r=caml_create_bytes(len);caml_blit_bytes(s,ofs,r,0,len);return r}
      return invalid_arg(cst_String_sub_Bytes_sub)}
    function sub_string(b,ofs,len)
     {return caml_string_of_bytes(sub(b,ofs,len))}
    function symbol$0(a,b)
     {var c=a + b | 0,_Bv_=b < 0?1:0,match=c < 0?1:0,switch$0=0;
      if(a < 0)
       {if(_Bv_ && ! match)switch$0 = 1}
      else
       if(! _Bv_ && match)switch$0 = 1;
      return switch$0?invalid_arg(cst_Bytes_extend):c}
    function extend(s,left,right)
     {var
       len=symbol$0(symbol$0(caml_ml_bytes_length(s),left),right),
       r=caml_create_bytes(len);
      if(0 <= left)
       var dstoff=left,srcoff=0;
      else
       var dstoff=0,srcoff=- left | 0;
      var cpylen=min$1(caml_ml_bytes_length(s) - srcoff | 0,len - dstoff | 0);
      if(0 < cpylen)caml_blit_bytes(s,srcoff,r,dstoff,cpylen);
      return r}
    function fill(s,ofs,len,c)
     {if
       (0 <= ofs && 0 <= len && ! ((caml_ml_bytes_length(s) - len | 0) < ofs))
       return caml_fill_bytes(s,ofs,len,c);
      return invalid_arg(cst_String_fill_Bytes_fill)}
    function blit(s1,ofs1,s2,ofs2,len)
     {if
       (0
        <=
        len
        &&
        0
        <=
        ofs1
        &&
        !
        ((caml_ml_bytes_length(s1) - len | 0) < ofs1)
        &&
        0
        <=
        ofs2
        &&
        !
        ((caml_ml_bytes_length(s2) - len | 0) < ofs2))
       return caml_blit_bytes(s1,ofs1,s2,ofs2,len);
      return invalid_arg(cst_Bytes_blit)}
    function blit$0(s1,ofs1,s2,ofs2,len)
     {if
       (0
        <=
        len
        &&
        0
        <=
        ofs1
        &&
        !
        ((caml_ml_string_length(s1) - len | 0) < ofs1)
        &&
        0
        <=
        ofs2
        &&
        !
        ((caml_ml_bytes_length(s2) - len | 0) < ofs2))
       return caml_blit_string(s1,ofs1,s2,ofs2,len);
      return invalid_arg(cst_String_blit_Bytes_blit_str)}
    function iter$3(f,a)
     {var _Bt_=caml_ml_bytes_length(a) - 1 | 0,_Bs_=0;
      if(! (_Bt_ < 0))
       {var i=_Bs_;
        for(;;)
         {caml_call1(f,caml_bytes_unsafe_get(a,i));
          var _Bu_=i + 1 | 0;
          if(_Bt_ !== i){var i=_Bu_;continue}
          break}}
      return 0}
    function iteri$1(f,a)
     {var _Bq_=caml_ml_bytes_length(a) - 1 | 0,_Bp_=0;
      if(! (_Bq_ < 0))
       {var i=_Bp_;
        for(;;)
         {caml_call2(f,i,caml_bytes_unsafe_get(a,i));
          var _Br_=i + 1 | 0;
          if(_Bq_ !== i){var i=_Br_;continue}
          break}}
      return 0}
    function concat$0(sep,l)
     {if(l)
       {var seplen=caml_ml_bytes_length(sep),acc=0,param=l,pos$1=0;
        for(;;)
         {if(param)
           {var _Bm_=param[1];
            if(param[2])
             {var
               tl=param[2],
               x=(caml_ml_bytes_length(_Bm_) + seplen | 0) + acc | 0,
               acc$0=acc <= x?x:invalid_arg(cst_Bytes_concat),
               acc=acc$0,
               param=tl;
              continue}
            var _Bo_=caml_ml_bytes_length(_Bm_) + acc | 0}
          else
           var _Bo_=acc;
          var dst=caml_create_bytes(_Bo_),pos=pos$1,param$0=l;
          for(;;)
           {if(param$0)
             {var _Bn_=param$0[1];
              if(param$0[2])
               {var tl$0=param$0[2];
                caml_blit_bytes(_Bn_,0,dst,pos,caml_ml_bytes_length(_Bn_));
                caml_blit_bytes
                 (sep,0,dst,pos + caml_ml_bytes_length(_Bn_) | 0,seplen);
                var
                 pos$0=(pos + caml_ml_bytes_length(_Bn_) | 0) + seplen | 0,
                 pos=pos$0,
                 param$0=tl$0;
                continue}
              caml_blit_bytes(_Bn_,0,dst,pos,caml_ml_bytes_length(_Bn_));
              return dst}
            return dst}}}
      return empty$0}
    function cat$0(s1,s2)
     {var
       l1=caml_ml_bytes_length(s1),
       l2=caml_ml_bytes_length(s2),
       r=caml_create_bytes(l1 + l2 | 0);
      caml_blit_bytes(s1,0,r,0,l1);
      caml_blit_bytes(s2,0,r,l1,l2);
      return r}
    function is_space(param)
     {var _Bl_=param - 9 | 0,switch$0=0;
      if(4 < _Bl_ >>> 0)
       {if(23 === _Bl_)switch$0 = 1}
      else
       if(2 !== _Bl_)switch$0 = 1;
      return switch$0?1:0}
    function trim(s)
     {var len=caml_ml_bytes_length(s),i=[0,0];
      for(;;)
       {if(i[1] < len && is_space(caml_bytes_unsafe_get(s,i[1])))
         {i[1]++;continue}
        var j=[0,len - 1 | 0];
        for(;;)
         {if(i[1] <= j[1] && is_space(caml_bytes_unsafe_get(s,j[1])))
           {j[1] += -1;continue}
          return i[1] <= j[1]?sub(s,i[1],(j[1] - i[1] | 0) + 1 | 0):empty$0}}}
    function escaped$0(s)
     {var n=[0,0],_Be_=caml_ml_bytes_length(s) - 1 | 0,_Bd_=0;
      if(! (_Be_ < 0))
       {var i$0=_Bd_;
        for(;;)
         {var match=caml_bytes_unsafe_get(s,i$0),switch$0=0;
          if(32 <= match)
           {var _Bi_=match - 34 | 0,switch$1=0;
            if(58 < _Bi_ >>> 0)
             {if(93 <= _Bi_)switch$1 = 1}
            else
             if(56 < _Bi_ - 1 >>> 0){switch$0 = 1;switch$1 = 1}
            if(! switch$1){var _Bj_=1;switch$0 = 2}}
          else
           if(11 <= match)
            {if(13 === match)switch$0 = 1}
           else
            if(8 <= match)switch$0 = 1;
          switch(switch$0){case 0:var _Bj_=4;break;case 1:var _Bj_=2;break}
          n[1] = n[1] + _Bj_ | 0;
          var _Bk_=i$0 + 1 | 0;
          if(_Be_ !== i$0){var i$0=_Bk_;continue}
          break}}
      if(n[1] === caml_ml_bytes_length(s))return copy(s);
      var s$0=caml_create_bytes(n[1]);
      n[1] = 0;
      var _Bg_=caml_ml_bytes_length(s) - 1 | 0,_Bf_=0;
      if(! (_Bg_ < 0))
       {var i=_Bf_;
        for(;;)
         {var c=caml_bytes_unsafe_get(s,i),switch$2=0;
          if(35 <= c)
           if(92 === c)
            switch$2 = 2;
           else
            if(127 <= c)switch$2 = 1;else switch$2 = 3;
          else
           if(32 <= c)
            if(34 <= c)switch$2 = 2;else switch$2 = 3;
           else
            if(14 <= c)
             switch$2 = 1;
            else
             switch(c)
              {case 8:
                caml_bytes_unsafe_set(s$0,n[1],92);
                n[1]++;
                caml_bytes_unsafe_set(s$0,n[1],98);
                break;
               case 9:
                caml_bytes_unsafe_set(s$0,n[1],92);
                n[1]++;
                caml_bytes_unsafe_set(s$0,n[1],116);
                break;
               case 10:
                caml_bytes_unsafe_set(s$0,n[1],92);
                n[1]++;
                caml_bytes_unsafe_set(s$0,n[1],110);
                break;
               case 13:
                caml_bytes_unsafe_set(s$0,n[1],92);
                n[1]++;
                caml_bytes_unsafe_set(s$0,n[1],114);
                break;
               default:switch$2 = 1}
          switch(switch$2)
           {case 1:
             caml_bytes_unsafe_set(s$0,n[1],92);
             n[1]++;
             caml_bytes_unsafe_set(s$0,n[1],48 + (c / 100 | 0) | 0);
             n[1]++;
             caml_bytes_unsafe_set(s$0,n[1],48 + ((c / 10 | 0) % 10 | 0) | 0);
             n[1]++;
             caml_bytes_unsafe_set(s$0,n[1],48 + (c % 10 | 0) | 0);
             break;
            case 2:
             caml_bytes_unsafe_set(s$0,n[1],92);
             n[1]++;
             caml_bytes_unsafe_set(s$0,n[1],c);
             break;
            case 3:caml_bytes_unsafe_set(s$0,n[1],c);break
            }
          n[1]++;
          var _Bh_=i + 1 | 0;
          if(_Bg_ !== i){var i=_Bh_;continue}
          break}}
      return s$0}
    function map$5(f,s)
     {var l=caml_ml_bytes_length(s);
      if(0 === l)return s;
      var r=caml_create_bytes(l),_Bb_=l - 1 | 0,_Ba_=0;
      if(! (_Bb_ < 0))
       {var i=_Ba_;
        for(;;)
         {caml_bytes_unsafe_set(r,i,caml_call1(f,caml_bytes_unsafe_get(s,i)));
          var _Bc_=i + 1 | 0;
          if(_Bb_ !== i){var i=_Bc_;continue}
          break}}
      return r}
    function mapi$1(f,s)
     {var l=caml_ml_bytes_length(s);
      if(0 === l)return s;
      var r=caml_create_bytes(l),_A__=l - 1 | 0,_A9_=0;
      if(! (_A__ < 0))
       {var i=_A9_;
        for(;;)
         {caml_bytes_unsafe_set
           (r,i,caml_call2(f,i,caml_bytes_unsafe_get(s,i)));
          var _A$_=i + 1 | 0;
          if(_A__ !== i){var i=_A$_;continue}
          break}}
      return r}
    function fold_left$1(f,x,a)
     {var r=[0,x],_A7_=caml_ml_bytes_length(a) - 1 | 0,_A6_=0;
      if(! (_A7_ < 0))
       {var i=_A6_;
        for(;;)
         {r[1] = caml_call2(f,r[1],caml_bytes_unsafe_get(a,i));
          var _A8_=i + 1 | 0;
          if(_A7_ !== i){var i=_A8_;continue}
          break}}
      return r[1]}
    function fold_right$0(f,a,x)
     {var r=[0,x],_A4_=caml_ml_bytes_length(a) - 1 | 0;
      if(! (_A4_ < 0))
       {var i=_A4_;
        for(;;)
         {r[1] = caml_call2(f,caml_bytes_unsafe_get(a,i),r[1]);
          var _A5_=i - 1 | 0;
          if(0 !== i){var i=_A5_;continue}
          break}}
      return r[1]}
    function exists$1(p,s)
     {var n=caml_ml_bytes_length(s),i=0;
      for(;;)
       {if(i === n)return 0;
        if(caml_call1(p,caml_bytes_unsafe_get(s,i)))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function for_all$1(p,s)
     {var n=caml_ml_bytes_length(s),i=0;
      for(;;)
       {if(i === n)return 1;
        if(caml_call1(p,caml_bytes_unsafe_get(s,i)))
         {var i$0=i + 1 | 0,i=i$0;continue}
        return 0}}
    function uppercase_ascii$0(s){return map$5(uppercase_ascii,s)}
    function lowercase_ascii$0(s){return map$5(lowercase_ascii,s)}
    function apply1(f,s)
     {if(0 === caml_ml_bytes_length(s))return s;
      var r=copy(s);
      caml_bytes_unsafe_set(r,0,caml_call1(f,caml_bytes_unsafe_get(s,0)));
      return r}
    function capitalize_ascii(s){return apply1(uppercase_ascii,s)}
    function uncapitalize_ascii(s){return apply1(lowercase_ascii,s)}
    function starts_with(prefix,s)
     {var
       len_s=caml_ml_bytes_length(s),
       len_pre=caml_ml_bytes_length(prefix),
       _A3_=len_pre <= len_s?1:0;
      if(_A3_)
       {var i=0;
        for(;;)
         {if(i === len_pre)return 1;
          if(caml_bytes_unsafe_get(s,i) !== caml_bytes_unsafe_get(prefix,i))
           return 0;
          var i$0=i + 1 | 0,i=i$0;
          continue}}
      return _A3_}
    function ends_with(suffix,s)
     {var
       len_s=caml_ml_bytes_length(s),
       len_suf=caml_ml_bytes_length(suffix),
       diff=len_s - len_suf | 0,
       _A2_=0 <= diff?1:0;
      if(_A2_)
       {var i=0;
        for(;;)
         {if(i === len_suf)return 1;
          if
           (caml_bytes_unsafe_get(s,diff + i | 0)
            !==
            caml_bytes_unsafe_get(suffix,i))
           return 0;
          var i$0=i + 1 | 0,i=i$0;
          continue}}
      return _A2_}
    function index_rec(s,lim,i,c)
     {var i$0=i;
      for(;;)
       {if(lim <= i$0)throw Not_found;
        if(caml_bytes_unsafe_get(s,i$0) === c)return i$0;
        var i$1=i$0 + 1 | 0,i$0=i$1;
        continue}}
    function index(s,c){return index_rec(s,caml_ml_bytes_length(s),0,c)}
    function index_rec_opt(s,lim,i,c)
     {var i$0=i;
      for(;;)
       {if(lim <= i$0)return 0;
        if(caml_bytes_unsafe_get(s,i$0) === c)return [0,i$0];
        var i$1=i$0 + 1 | 0,i$0=i$1;
        continue}}
    function index_opt(s,c)
     {return index_rec_opt(s,caml_ml_bytes_length(s),0,c)}
    function index_from(s,i,c)
     {var l=caml_ml_bytes_length(s);
      if(0 <= i && ! (l < i))return index_rec(s,l,i,c);
      return invalid_arg(cst_String_index_from_Bytes_in)}
    function index_from_opt(s,i,c)
     {var l=caml_ml_bytes_length(s);
      if(0 <= i && ! (l < i))return index_rec_opt(s,l,i,c);
      return invalid_arg(cst_String_index_from_opt_Byte)}
    function rindex_rec(s,i,c)
     {var i$0=i;
      for(;;)
       {if(0 <= i$0)
         {if(caml_bytes_unsafe_get(s,i$0) === c)return i$0;
          var i$1=i$0 - 1 | 0,i$0=i$1;
          continue}
        throw Not_found}}
    function rindex(s,c)
     {return rindex_rec(s,caml_ml_bytes_length(s) - 1 | 0,c)}
    function rindex_from(s,i,c)
     {if(-1 <= i && ! (caml_ml_bytes_length(s) <= i))return rindex_rec(s,i,c);
      return invalid_arg(cst_String_rindex_from_Bytes_r)}
    function rindex_rec_opt(s,i,c)
     {var i$0=i;
      for(;;)
       {if(0 <= i$0)
         {if(caml_bytes_unsafe_get(s,i$0) === c)return [0,i$0];
          var i$1=i$0 - 1 | 0,i$0=i$1;
          continue}
        return 0}}
    function rindex_opt(s,c)
     {return rindex_rec_opt(s,caml_ml_bytes_length(s) - 1 | 0,c)}
    function rindex_from_opt(s,i,c)
     {if(-1 <= i && ! (caml_ml_bytes_length(s) <= i))
       return rindex_rec_opt(s,i,c);
      return invalid_arg(cst_String_rindex_from_opt_Byt)}
    function contains_from(s,i,c)
     {var l=caml_ml_bytes_length(s);
      if(0 <= i && ! (l < i))
       try
        {index_rec(s,l,i,c);var _A0_=1;return _A0_}
       catch(_A1_)
        {_A1_ = caml_wrap_exception(_A1_);
         if(_A1_ === Not_found)return 0;
         throw _A1_}
      return invalid_arg(cst_String_contains_from_Bytes)}
    function contains(s,c){return contains_from(s,0,c)}
    function rcontains_from(s,i,c)
     {if(0 <= i && ! (caml_ml_bytes_length(s) <= i))
       try
        {rindex_rec(s,i,c);var _AY_=1;return _AY_}
       catch(_AZ_)
        {_AZ_ = caml_wrap_exception(_AZ_);
         if(_AZ_ === Not_found)return 0;
         throw _AZ_}
      return invalid_arg(cst_String_rcontains_from_Byte)}
    function compare$8(x,y){return runtime.caml_bytes_compare(x,y)}
    function split_on_char(sep,s)
     {var
       r=[0,0],
       j=[0,caml_ml_bytes_length(s)],
       _AU_=caml_ml_bytes_length(s) - 1 | 0;
      if(! (_AU_ < 0))
       {var i=_AU_;
        for(;;)
         {if(caml_bytes_unsafe_get(s,i) === sep)
           {var _AW_=r[1];
            r[1] = [0,sub(s,i + 1 | 0,(j[1] - i | 0) - 1 | 0),_AW_];
            j[1] = i}
          var _AX_=i - 1 | 0;
          if(0 !== i){var i=_AX_;continue}
          break}}
      var _AV_=r[1];
      return [0,sub(s,0,j[1]),_AV_]}
    function uppercase$0(s){return map$5(uppercase,s)}
    function lowercase$0(s){return map$5(lowercase,s)}
    function capitalize(s){return apply1(uppercase,s)}
    function uncapitalize(s){return apply1(lowercase,s)}
    function to_seq$2(s)
     {function aux(i,param)
       {if(i === caml_ml_bytes_length(s))return 0;
        var x=caml_bytes_get(s,i),_AS_=i + 1 | 0;
        return [0,x,function(_AT_){return aux(_AS_,_AT_)}]}
      var _AQ_=0;
      return function(_AR_){return aux(_AQ_,_AR_)}}
    function to_seqi(s)
     {function aux(i,param)
       {if(i === caml_ml_bytes_length(s))return 0;
        var x=caml_bytes_get(s,i),_AO_=i + 1 | 0;
        return [0,[0,i,x],function(_AP_){return aux(_AO_,_AP_)}]}
      var _AM_=0;
      return function(_AN_){return aux(_AM_,_AN_)}}
    function of_seq$0(i)
     {var n=[0,0],buf=[0,make$0(256,0)];
      iter
       (function(c)
         {if(n[1] === caml_ml_bytes_length(buf[1]))
           {var
             new_len=
              min$1(2 * caml_ml_bytes_length(buf[1]) | 0,max_string_length);
            if(caml_ml_bytes_length(buf[1]) === new_len)
             failwith(cst_Bytes_of_seq_cannot_grow_b);
            var new_buf=make$0(new_len,0);
            blit(buf[1],0,new_buf,0,n[1]);
            buf[1] = new_buf}
          caml_bytes_set(buf[1],n[1],c);
          n[1]++;
          return 0},
        i);
      return sub(buf[1],0,n[1])}
    function get$1(b,i){return caml_bswap16(caml_bytes_get16(b,i))}
    function get_int8(b,i){return caml_bytes_get(b,i) << 24 >> 24}
    function get_uint16_le(b,i){return caml_bytes_get16(b,i)}
    function get_uint16_be(b,i){return caml_bswap16(caml_bytes_get16(b,i))}
    function get_int16_ne(b,i){return caml_bytes_get16(b,i) << 16 >> 16}
    function get_int16_le(b,i){return caml_bytes_get16(b,i) << 16 >> 16}
    function get_int16_be(b,i){return get_uint16_be(b,i) << 16 >> 16}
    function get_int32_le(b,i){return caml_bytes_get32(b,i)}
    function get_int32_be(b,i){return caml_int32_bswap(caml_bytes_get32(b,i))}
    function get_int64_le(b,i){return caml_bytes_get64(b,i)}
    function get_int64_be(b,i){return caml_int64_bswap(caml_bytes_get64(b,i))}
    function set$0(b,i,x){return caml_bytes_set16(b,i,caml_bswap16(x))}
    function set_int16_le(b,i,x){return caml_bytes_set16(b,i,x)}
    function set_int16_be(b,i,x){return caml_bytes_set16(b,i,caml_bswap16(x))}
    function set_int32_le(b,i,x){return caml_bytes_set32(b,i,x)}
    function set_int32_be(b,i,x)
     {return caml_bytes_set32(b,i,caml_int32_bswap(x))}
    function set_int64_le(b,i,x){return caml_bytes_set64(b,i,x)}
    function set_int64_be(b,i,x)
     {return caml_bytes_set64(b,i,caml_int64_bswap(x))}
    var set_uint8=caml_bytes_set,set_uint16_ne=caml_bytes_set16;
    function dec_ret(n,u){return utf_decode(n,u)}
    function not_in_x80_to_xBF(b){return 2 !== (b >>> 6 | 0)?1:0}
    function not_in_xA0_to_xBF(b){return 5 !== (b >>> 5 | 0)?1:0}
    function not_in_x80_to_x9F(b){return 4 !== (b >>> 5 | 0)?1:0}
    function not_in_x90_to_xBF(b)
     {var _AK_=b < 144?1:0,_AL_=_AK_ || (191 < b?1:0);return _AL_}
    function not_in_x80_to_x8F(b){return 8 !== (b >>> 4 | 0)?1:0}
    function utf_8_uchar_3(b0,b1,b2)
     {return (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63}
    function utf_8_uchar_4(b0,b1,b2,b3)
     {return (b0 & 7) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63}
    function get_utf_8_uchar(b,i)
     {var b0=caml_bytes_get(b,i),max=caml_ml_bytes_length(b) - 1 | 0;
      if(224 <= b0)
       {var switch$0=0;
        if(237 <= b0)
         {if(! (245 <= b0))
           switch(b0 - 237 | 0)
            {case 0:
              var i$0=i + 1 | 0;
              if(max < i$0)return dec_invalid(1);
              var b1=caml_bytes_unsafe_get(b,i$0);
              if(not_in_x80_to_x9F(b1))return dec_invalid(1);
              var i$1=i$0 + 1 | 0;
              if(max < i$1)return dec_invalid(2);
              var b2=caml_bytes_unsafe_get(b,i$1);
              return not_in_x80_to_xBF(b2)
                      ?dec_invalid(2)
                      :dec_ret(3,utf_8_uchar_3(b0,b1,b2));
             case 3:
              var i$4=i + 1 | 0;
              if(max < i$4)return dec_invalid(1);
              var b1$1=caml_bytes_unsafe_get(b,i$4);
              if(not_in_x90_to_xBF(b1$1))return dec_invalid(1);
              var i$5=i$4 + 1 | 0;
              if(max < i$5)return dec_invalid(2);
              var b2$1=caml_bytes_unsafe_get(b,i$5);
              if(not_in_x80_to_xBF(b2$1))return dec_invalid(2);
              var i$6=i$5 + 1 | 0;
              if(max < i$6)return dec_invalid(3);
              var b3=caml_bytes_unsafe_get(b,i$6);
              return not_in_x80_to_xBF(b3)
                      ?dec_invalid(3)
                      :dec_ret(4,utf_8_uchar_4(b0,b1$1,b2$1,b3));
             case 7:
              var i$10=i + 1 | 0;
              if(max < i$10)return dec_invalid(1);
              var b1$3=caml_bytes_unsafe_get(b,i$10);
              if(not_in_x80_to_x8F(b1$3))return dec_invalid(1);
              var i$11=i$10 + 1 | 0;
              if(max < i$11)return dec_invalid(2);
              var b2$3=caml_bytes_unsafe_get(b,i$11);
              if(not_in_x80_to_xBF(b2$3))return dec_invalid(2);
              var i$12=i$11 + 1 | 0;
              if(max < i$12)return dec_invalid(3);
              var b3$1=caml_bytes_unsafe_get(b,i$12);
              return not_in_x80_to_xBF(b3$1)
                      ?dec_invalid(3)
                      :dec_ret(4,utf_8_uchar_4(b0,b1$3,b2$3,b3$1));
             case 1:
             case 2:switch$0 = 1;break;
             default:
              var i$7=i + 1 | 0;
              if(max < i$7)return dec_invalid(1);
              var b1$2=caml_bytes_unsafe_get(b,i$7);
              if(not_in_x80_to_xBF(b1$2))return dec_invalid(1);
              var i$8=i$7 + 1 | 0;
              if(max < i$8)return dec_invalid(2);
              var b2$2=caml_bytes_unsafe_get(b,i$8);
              if(not_in_x80_to_xBF(b2$2))return dec_invalid(2);
              var i$9=i$8 + 1 | 0;
              if(max < i$9)return dec_invalid(3);
              var b3$0=caml_bytes_unsafe_get(b,i$9);
              return not_in_x80_to_xBF(b3$0)
                      ?dec_invalid(3)
                      :dec_ret(4,utf_8_uchar_4(b0,b1$2,b2$2,b3$0))}}
        else
         {if(! (225 <= b0))
           {var i$13=i + 1 | 0;
            if(max < i$13)return dec_invalid(1);
            var b1$4=caml_bytes_unsafe_get(b,i$13);
            if(not_in_xA0_to_xBF(b1$4))return dec_invalid(1);
            var i$14=i$13 + 1 | 0;
            if(max < i$14)return dec_invalid(2);
            var b2$4=caml_bytes_unsafe_get(b,i$14);
            return not_in_x80_to_xBF(b2$4)
                    ?dec_invalid(2)
                    :dec_ret(3,utf_8_uchar_3(b0,b1$4,b2$4))}
          switch$0 = 1}
        if(switch$0)
         {var i$2=i + 1 | 0;
          if(max < i$2)return dec_invalid(1);
          var b1$0=caml_bytes_unsafe_get(b,i$2);
          if(not_in_x80_to_xBF(b1$0))return dec_invalid(1);
          var i$3=i$2 + 1 | 0;
          if(max < i$3)return dec_invalid(2);
          var b2$0=caml_bytes_unsafe_get(b,i$3);
          return not_in_x80_to_xBF(b2$0)
                  ?dec_invalid(2)
                  :dec_ret(3,utf_8_uchar_3(b0,b1$0,b2$0))}}
      else
       {if(! (128 <= b0))return dec_ret(1,b0);
        if(194 <= b0)
         {var i$15=i + 1 | 0;
          if(max < i$15)return dec_invalid(1);
          var b1$5=caml_bytes_unsafe_get(b,i$15);
          return not_in_x80_to_xBF(b1$5)
                  ?dec_invalid(1)
                  :dec_ret(2,(b0 & 31) << 6 | b1$5 & 63)}}
      return dec_invalid(1)}
    function set_utf_8_uchar(b,i,u)
     {function set(_AJ_,_AI_,_AH_)
       {caml_bytes_unsafe_set(_AJ_,_AI_,_AH_);return 0}
      var max=caml_ml_bytes_length(b) - 1 | 0;
      if(0 <= u)
       {if(127 < u)
         {if(2047 < u)
           {if(65535 < u)
             {if(1114111 < u)throw [0,Assert_failure,_B_];
              var last=i + 3 | 0;
              return max < last
                      ?0
                      :(caml_bytes_set(b,i,240 | u >>> 18 | 0),
                        set(b,i + 1 | 0,128 | (u >>> 12 | 0) & 63),
                        set(b,i + 2 | 0,128 | (u >>> 6 | 0) & 63),
                        set(b,last,128 | u & 63),
                        4)}
            var last$0=i + 2 | 0;
            return max < last$0
                    ?0
                    :(caml_bytes_set(b,i,224 | u >>> 12 | 0),
                      set(b,i + 1 | 0,128 | (u >>> 6 | 0) & 63),
                      set(b,last$0,128 | u & 63),
                      3)}
          var last$1=i + 1 | 0;
          return max < last$1
                  ?0
                  :(caml_bytes_set(b,i,192 | u >>> 6 | 0),
                    set(b,last$1,128 | u & 63),
                    2)}
        caml_bytes_set(b,i,u);
        return 1}
      throw [0,Assert_failure,_C_]}
    function is_valid_utf_8(b)
     {var max=caml_ml_bytes_length(b) - 1 | 0,i=0;
      for(;;)
       {if(max < i)return 1;
        var match=caml_bytes_unsafe_get(b,i);
        if(224 <= match)
         {var switch$0=0;
          if(237 <= match)
           {if(! (245 <= match))
             switch(match - 237 | 0)
              {case 0:
                var last=i + 2 | 0;
                if
                 (!
                  (max < last)
                  &&
                  !
                  not_in_x80_to_x9F(caml_bytes_unsafe_get(b,i + 1 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last)))
                 {var i$0=last + 1 | 0,i=i$0;continue}
                return 0;
               case 3:
                var last$1=i + 3 | 0;
                if
                 (!
                  (max < last$1)
                  &&
                  !
                  not_in_x90_to_xBF(caml_bytes_unsafe_get(b,i + 1 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,i + 2 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$1)))
                 {var i$2=last$1 + 1 | 0,i=i$2;continue}
                return 0;
               case 7:
                var last$3=i + 3 | 0;
                if
                 (!
                  (max < last$3)
                  &&
                  !
                  not_in_x80_to_x8F(caml_bytes_unsafe_get(b,i + 1 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,i + 2 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$3)))
                 {var i$4=last$3 + 1 | 0,i=i$4;continue}
                return 0;
               case 1:
               case 2:switch$0 = 1;break;
               default:
                var last$2=i + 3 | 0;
                if
                 (!
                  (max < last$2)
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,i + 1 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,i + 2 | 0))
                  &&
                  !
                  not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$2)))
                 {var i$3=last$2 + 1 | 0,i=i$3;continue}
                return 0}}
          else
           {if(! (225 <= match))
             {var last$4=i + 2 | 0;
              if
               (!
                (max < last$4)
                &&
                !
                not_in_xA0_to_xBF(caml_bytes_unsafe_get(b,i + 1 | 0))
                &&
                !
                not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$4)))
               {var i$5=last$4 + 1 | 0,i=i$5;continue}
              return 0}
            switch$0 = 1}
          if(switch$0)
           {var last$0=i + 2 | 0;
            if
             (!
              (max < last$0)
              &&
              !
              not_in_x80_to_xBF(caml_bytes_unsafe_get(b,i + 1 | 0))
              &&
              !
              not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$0)))
             {var i$1=last$0 + 1 | 0,i=i$1;continue}
            return 0}}
        else
         {if(! (128 <= match)){var i$7=i + 1 | 0,i=i$7;continue}
          if(194 <= match)
           {var last$5=i + 1 | 0;
            if
             (!
              (max < last$5)
              &&
              !
              not_in_x80_to_xBF(caml_bytes_unsafe_get(b,last$5)))
             {var i$6=last$5 + 1 | 0,i=i$6;continue}
            return 0}}
        return 0}}
    function get_utf_16be_uchar(b,i)
     {var max=caml_ml_bytes_length(b) - 1 | 0;
      if(0 <= i && ! (max < i))
       {if(i === max)return dec_invalid(1);
        var hi=get$1(b,i);
        if(55296 <= hi && ! (57343 < hi))
         {if(56319 < hi)return dec_invalid(2);
          var last=i + 3 | 0;
          if(max < last)return dec_invalid((max - i | 0) + 1 | 0);
          var u=get$1(b,i + 2 | 0);
          if(56320 <= u && ! (57343 < u))
           {var u$0=((hi & 1023) << 10 | u & 1023) + 65536 | 0;
            return dec_ret(4,u$0)}
          return dec_invalid(2)}
        return dec_ret(2,hi)}
      return invalid_arg(cst_index_out_of_bounds)}
    function set_utf_16be_uchar(b,i,u)
     {var max=caml_ml_bytes_length(b) - 1 | 0;
      if(0 <= i && ! (max < i))
       {if(0 <= u)
         {if(65535 < u)
           {if(1114111 < u)throw [0,Assert_failure,_D_];
            var last=i + 3 | 0;
            if(max < last)return 0;
            var
             u$0=u - 65536 | 0,
             hi=55296 | u$0 >>> 10 | 0,
             lo=56320 | u$0 & 1023;
            set$0(b,i,hi);
            set$0(b,i + 2 | 0,lo);
            return 4}
          var last$0=i + 1 | 0;
          return max < last$0?0:(set$0(b,i,u),2)}
        throw [0,Assert_failure,_E_]}
      return invalid_arg(cst_index_out_of_bounds$0)}
    function is_valid_utf_16be(b)
     {var max=caml_ml_bytes_length(b) - 1 | 0,i=0;
      for(;;)
       {if(max < i)return 1;
        if(i === max)return 0;
        var u=get$1(b,i);
        if(55296 <= u && ! (57343 < u))
         {if(56319 < u)return 0;
          var last=i + 3 | 0;
          if(max < last)return 0;
          var u$0=get$1(b,i + 2 | 0);
          if(56320 <= u$0 && ! (57343 < u$0))
           {var i$1=i + 4 | 0,i=i$1;continue}
          return 0}
        var i$0=i + 2 | 0,i=i$0;
        continue}}
    function get_utf_16le_uchar(b,i)
     {var max=caml_ml_bytes_length(b) - 1 | 0;
      if(0 <= i && ! (max < i))
       {if(i === max)return dec_invalid(1);
        var hi=caml_bytes_get16(b,i);
        if(55296 <= hi && ! (57343 < hi))
         {if(56319 < hi)return dec_invalid(2);
          var last=i + 3 | 0;
          if(max < last)return dec_invalid((max - i | 0) + 1 | 0);
          var u=caml_bytes_get16(b,i + 2 | 0);
          if(56320 <= u && ! (57343 < u))
           {var u$0=((hi & 1023) << 10 | u & 1023) + 65536 | 0;
            return dec_ret(4,u$0)}
          return dec_invalid(2)}
        return dec_ret(2,hi)}
      return invalid_arg(cst_index_out_of_bounds$1)}
    function set_utf_16le_uchar(b,i,u)
     {var max=caml_ml_bytes_length(b) - 1 | 0;
      if(0 <= i && ! (max < i))
       {if(0 <= u)
         {if(65535 < u)
           {if(1114111 < u)throw [0,Assert_failure,_F_];
            var last=i + 3 | 0;
            if(max < last)return 0;
            var
             u$0=u - 65536 | 0,
             hi=55296 | u$0 >>> 10 | 0,
             lo=56320 | u$0 & 1023;
            caml_bytes_set16(b,i,hi);
            caml_bytes_set16(b,i + 2 | 0,lo);
            return 4}
          var last$0=i + 1 | 0;
          return max < last$0?0:(caml_bytes_set16(b,i,u),2)}
        throw [0,Assert_failure,_G_]}
      return invalid_arg(cst_index_out_of_bounds$2)}
    function is_valid_utf_16le(b)
     {var max=caml_ml_bytes_length(b) - 1 | 0,i=0;
      for(;;)
       {if(max < i)return 1;
        if(i === max)return 0;
        var u=caml_bytes_get16(b,i);
        if(55296 <= u && ! (57343 < u))
         {if(56319 < u)return 0;
          var last=i + 3 | 0;
          if(max < last)return 0;
          var u$0=caml_bytes_get16(b,i + 2 | 0);
          if(56320 <= u$0 && ! (57343 < u$0))
           {var i$1=i + 4 | 0,i=i$1;continue}
          return 0}
        var i$0=i + 2 | 0,i=i$0;
        continue}}
    var
     set_int64_ne=caml_bytes_set64,
     set_int32_ne=caml_bytes_set32,
     set_int16_ne=caml_bytes_set16,
     set_int8=caml_bytes_set,
     get_int64_ne=caml_bytes_get64,
     get_int32_ne=caml_bytes_get32,
     get_uint16_ne=caml_bytes_get16,
     get_uint8=caml_bytes_get,
     unsafe_of_string=caml_bytes_of_string,
     unsafe_to_string=caml_string_of_bytes,
     equal$8=runtime.caml_bytes_equal,
     include$1=
      [0,
       make$0,
       init$1,
       empty$0,
       copy,
       to_bytes,
       of_bytes,
       sub,
       sub_string,
       extend,
       fill,
       blit,
       blit$0,
       concat$0,
       cat$0,
       iter$3,
       iteri$1,
       map$5,
       mapi$1,
       fold_left$1,
       fold_right$0,
       for_all$1,
       exists$1,
       trim,
       escaped$0,
       index,
       index_opt,
       rindex,
       rindex_opt,
       index_from,
       index_from_opt,
       rindex_from,
       rindex_from_opt,
       contains,
       contains_from,
       rcontains_from,
       uppercase$0,
       lowercase$0,
       capitalize,
       uncapitalize,
       uppercase_ascii$0,
       lowercase_ascii$0,
       capitalize_ascii,
       uncapitalize_ascii,
       compare$8,
       equal$8,
       starts_with,
       ends_with,
       unsafe_to_string,
       unsafe_of_string,
       split_on_char,
       to_seq$2,
       to_seqi,
       of_seq$0,
       get_utf_8_uchar,
       set_utf_8_uchar,
       is_valid_utf_8,
       get_utf_16be_uchar,
       set_utf_16be_uchar,
       is_valid_utf_16be,
       get_utf_16le_uchar,
       set_utf_16le_uchar,
       is_valid_utf_16le,
       get_uint8,
       get_int8,
       get_uint16_ne,
       get_uint16_be,
       get_uint16_le,
       get_int16_ne,
       get_int16_be,
       get_int16_le,
       get_int32_ne,
       get_int32_be,
       get_int32_le,
       get_int64_ne,
       get_int64_be,
       get_int64_le,
       set_uint8,
       set_int8,
       set_uint16_ne,
       set_int16_be,
       set_int16_le,
       set_int16_ne,
       set_int16_be,
       set_int16_le,
       set_int32_ne,
       set_int32_be,
       set_int32_le,
       set_int64_ne,
       set_int64_be,
       set_int64_le];
    caml_register_global(790,include$1,"Stdlib__Bytes");
    function make$1(n,c){return caml_string_of_bytes(make$0(n,c))}
    function init$2(n,f){return caml_string_of_bytes(init$1(n,f))}
    function copy$0(s)
     {return caml_string_of_bytes(copy(caml_bytes_of_string(s)))}
    function sub$0(s,ofs,len)
     {return caml_string_of_bytes(sub(caml_bytes_of_string(s),ofs,len))}
    function concat$1(sep,l)
     {if(l)
       {var seplen=caml_ml_string_length(sep),acc=0,param=l,pos$1=0;
        for(;;)
         {if(param)
           {var _AE_=param[1];
            if(param[2])
             {var
               tl=param[2],
               x=(caml_ml_string_length(_AE_) + seplen | 0) + acc | 0,
               acc$0=acc <= x?x:invalid_arg(cst_String_concat),
               acc=acc$0,
               param=tl;
              continue}
            var _AG_=caml_ml_string_length(_AE_) + acc | 0}
          else
           var _AG_=acc;
          var dst=caml_create_bytes(_AG_),pos=pos$1,param$0=l;
          for(;;)
           {if(param$0)
             {var _AF_=param$0[1];
              if(param$0[2])
               {var tl$0=param$0[2];
                caml_blit_string(_AF_,0,dst,pos,caml_ml_string_length(_AF_));
                caml_blit_string
                 (sep,0,dst,pos + caml_ml_string_length(_AF_) | 0,seplen);
                var
                 pos$0=(pos + caml_ml_string_length(_AF_) | 0) + seplen | 0,
                 pos=pos$0,
                 param$0=tl$0;
                continue}
              caml_blit_string(_AF_,0,dst,pos,caml_ml_string_length(_AF_))}
            return caml_string_of_bytes(dst)}}}
      return cst$3}
    function iter$4(f,s)
     {var _AC_=caml_ml_string_length(s) - 1 | 0,_AB_=0;
      if(! (_AC_ < 0))
       {var i=_AB_;
        for(;;)
         {caml_call1(f,caml_string_unsafe_get(s,i));
          var _AD_=i + 1 | 0;
          if(_AC_ !== i){var i=_AD_;continue}
          break}}
      return 0}
    function iteri$2(f,s)
     {var _Az_=caml_ml_string_length(s) - 1 | 0,_Ay_=0;
      if(! (_Az_ < 0))
       {var i=_Ay_;
        for(;;)
         {caml_call2(f,i,caml_string_unsafe_get(s,i));
          var _AA_=i + 1 | 0;
          if(_Az_ !== i){var i=_AA_;continue}
          break}}
      return 0}
    function map$6(f,s)
     {return caml_string_of_bytes(map$5(f,caml_bytes_of_string(s)))}
    function mapi$2(f,s)
     {return caml_string_of_bytes(mapi$1(f,caml_bytes_of_string(s)))}
    function fold_right$1(f,x,a)
     {return fold_right$0(f,caml_bytes_of_string(x),a)}
    function fold_left$2(f,a,x)
     {return fold_left$1(f,a,caml_bytes_of_string(x))}
    function exists$2(f,s){return exists$1(f,caml_bytes_of_string(s))}
    function for_all$2(f,s){return for_all$1(f,caml_bytes_of_string(s))}
    function is_space$0(param)
     {var _Ax_=param - 9 | 0,switch$0=0;
      if(4 < _Ax_ >>> 0)
       {if(23 === _Ax_)switch$0 = 1}
      else
       if(2 !== _Ax_)switch$0 = 1;
      return switch$0?1:0}
    function trim$0(s)
     {if(caml_string_equal(s,cst$4))return s;
      if
       (!
        is_space$0(caml_string_unsafe_get(s,0))
        &&
        !
        is_space$0(caml_string_unsafe_get(s,caml_ml_string_length(s) - 1 | 0)))
       return s;
      return caml_string_of_bytes(trim(caml_bytes_of_string(s)))}
    function escaped$1(s)
     {var n=caml_ml_string_length(s),i=0;
      for(;;)
       {if(n <= i)return s;
        var match=caml_string_unsafe_get(s,i),_Aw_=match - 32 | 0,switch$0=0;
        if(59 < _Aw_ >>> 0)
         {if(33 < _Aw_ - 61 >>> 0)switch$0 = 1}
        else
         if(2 === _Aw_)switch$0 = 1;
        if(switch$0)
         return caml_string_of_bytes(escaped$0(caml_bytes_of_string(s)));
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function index_rec$0(s,lim,i,c)
     {var i$0=i;
      for(;;)
       {if(lim <= i$0)throw Not_found;
        if(caml_string_unsafe_get(s,i$0) === c)return i$0;
        var i$1=i$0 + 1 | 0,i$0=i$1;
        continue}}
    function index$0(s,c){return index_rec$0(s,caml_ml_string_length(s),0,c)}
    function index_rec_opt$0(s,lim,i,c)
     {var i$0=i;
      for(;;)
       {if(lim <= i$0)return 0;
        if(caml_string_unsafe_get(s,i$0) === c)return [0,i$0];
        var i$1=i$0 + 1 | 0,i$0=i$1;
        continue}}
    function index_opt$0(s,c)
     {return index_rec_opt$0(s,caml_ml_string_length(s),0,c)}
    function index_from$0(s,i,c)
     {var l=caml_ml_string_length(s);
      if(0 <= i && ! (l < i))return index_rec$0(s,l,i,c);
      return invalid_arg(cst_String_index_from_Bytes_in$0)}
    function index_from_opt$0(s,i,c)
     {var l=caml_ml_string_length(s);
      if(0 <= i && ! (l < i))return index_rec_opt$0(s,l,i,c);
      return invalid_arg(cst_String_index_from_opt_Byte$0)}
    function rindex_rec$0(s,i,c)
     {var i$0=i;
      for(;;)
       {if(0 <= i$0)
         {if(caml_string_unsafe_get(s,i$0) === c)return i$0;
          var i$1=i$0 - 1 | 0,i$0=i$1;
          continue}
        throw Not_found}}
    function rindex$0(s,c)
     {return rindex_rec$0(s,caml_ml_string_length(s) - 1 | 0,c)}
    function rindex_from$0(s,i,c)
     {if(-1 <= i && ! (caml_ml_string_length(s) <= i))
       return rindex_rec$0(s,i,c);
      return invalid_arg(cst_String_rindex_from_Bytes_r$0)}
    function rindex_rec_opt$0(s,i,c)
     {var i$0=i;
      for(;;)
       {if(0 <= i$0)
         {if(caml_string_unsafe_get(s,i$0) === c)return [0,i$0];
          var i$1=i$0 - 1 | 0,i$0=i$1;
          continue}
        return 0}}
    function rindex_opt$0(s,c)
     {return rindex_rec_opt$0(s,caml_ml_string_length(s) - 1 | 0,c)}
    function rindex_from_opt$0(s,i,c)
     {if(-1 <= i && ! (caml_ml_string_length(s) <= i))
       return rindex_rec_opt$0(s,i,c);
      return invalid_arg(cst_String_rindex_from_opt_Byt$0)}
    function contains_from$0(s,i,c)
     {var l=caml_ml_string_length(s);
      if(0 <= i && ! (l < i))
       try
        {index_rec$0(s,l,i,c);var _Au_=1;return _Au_}
       catch(_Av_)
        {_Av_ = caml_wrap_exception(_Av_);
         if(_Av_ === Not_found)return 0;
         throw _Av_}
      return invalid_arg(cst_String_contains_from_Bytes$0)}
    function contains$0(s,c){return contains_from$0(s,0,c)}
    function rcontains_from$0(s,i,c)
     {if(0 <= i && ! (caml_ml_string_length(s) <= i))
       try
        {rindex_rec$0(s,i,c);var _As_=1;return _As_}
       catch(_At_)
        {_At_ = caml_wrap_exception(_At_);
         if(_At_ === Not_found)return 0;
         throw _At_}
      return invalid_arg(cst_String_rcontains_from_Byte$0)}
    function uppercase_ascii$1(s)
     {return caml_string_of_bytes(uppercase_ascii$0(caml_bytes_of_string(s)))}
    function lowercase_ascii$1(s)
     {return caml_string_of_bytes(lowercase_ascii$0(caml_bytes_of_string(s)))}
    function capitalize_ascii$0(s)
     {return caml_string_of_bytes(capitalize_ascii(caml_bytes_of_string(s)))}
    function uncapitalize_ascii$0(s)
     {return caml_string_of_bytes(uncapitalize_ascii(caml_bytes_of_string(s)))}
    function starts_with$0(prefix,s)
     {var
       len_s=caml_ml_string_length(s),
       len_pre=caml_ml_string_length(prefix),
       _Ar_=len_pre <= len_s?1:0;
      if(_Ar_)
       {var i=0;
        for(;;)
         {if(i === len_pre)return 1;
          if(caml_string_unsafe_get(s,i) !== caml_string_unsafe_get(prefix,i))
           return 0;
          var i$0=i + 1 | 0,i=i$0;
          continue}}
      return _Ar_}
    function ends_with$0(suffix,s)
     {var
       len_s=caml_ml_string_length(s),
       len_suf=caml_ml_string_length(suffix),
       diff=len_s - len_suf | 0,
       _Aq_=0 <= diff?1:0;
      if(_Aq_)
       {var i=0;
        for(;;)
         {if(i === len_suf)return 1;
          if
           (caml_string_unsafe_get(s,diff + i | 0)
            !==
            caml_string_unsafe_get(suffix,i))
           return 0;
          var i$0=i + 1 | 0,i=i$0;
          continue}}
      return _Aq_}
    function split_on_char$0(sep,s)
     {var
       r=[0,0],
       j=[0,caml_ml_string_length(s)],
       _Am_=caml_ml_string_length(s) - 1 | 0;
      if(! (_Am_ < 0))
       {var i=_Am_;
        for(;;)
         {if(caml_string_unsafe_get(s,i) === sep)
           {var _Ao_=r[1];
            r[1] = [0,sub$0(s,i + 1 | 0,(j[1] - i | 0) - 1 | 0),_Ao_];
            j[1] = i}
          var _Ap_=i - 1 | 0;
          if(0 !== i){var i=_Ap_;continue}
          break}}
      var _An_=r[1];
      return [0,sub$0(s,0,j[1]),_An_]}
    function uppercase$1(s)
     {return caml_string_of_bytes(uppercase$0(caml_bytes_of_string(s)))}
    function lowercase$1(s)
     {return caml_string_of_bytes(lowercase$0(caml_bytes_of_string(s)))}
    function capitalize$0(s)
     {return caml_string_of_bytes(capitalize(caml_bytes_of_string(s)))}
    function uncapitalize$0(s)
     {return caml_string_of_bytes(uncapitalize(caml_bytes_of_string(s)))}
    function compare$9(x,y){return caml_string_compare(x,y)}
    function to_seq$3(s){return to_seq$2(caml_bytes_of_string(s))}
    function to_seqi$0(s){return to_seqi(caml_bytes_of_string(s))}
    function of_seq$1(g){return caml_string_of_bytes(of_seq$0(g))}
    function get_utf_8_uchar$0(s,i)
     {return get_utf_8_uchar(caml_bytes_of_string(s),i)}
    function is_valid_utf_8$0(s)
     {return is_valid_utf_8(caml_bytes_of_string(s))}
    function get_utf_16be_uchar$0(s,i)
     {return get_utf_16be_uchar(caml_bytes_of_string(s),i)}
    function is_valid_utf_16be$0(s)
     {return is_valid_utf_16be(caml_bytes_of_string(s))}
    function get_utf_16le_uchar$0(s,i)
     {return get_utf_16le_uchar(caml_bytes_of_string(s),i)}
    function is_valid_utf_16le$0(s)
     {return is_valid_utf_16le(caml_bytes_of_string(s))}
    function get_int8$0(s,i){return get_int8(caml_bytes_of_string(s),i)}
    function get_uint16_le$0(s,i)
     {return caml_bytes_get16(caml_bytes_of_string(s),i)}
    function get_uint16_be$0(s,i)
     {return get_uint16_be(caml_bytes_of_string(s),i)}
    function get_int16_ne$0(s,i)
     {return get_int16_ne(caml_bytes_of_string(s),i)}
    function get_int16_le$0(s,i)
     {return get_int16_le(caml_bytes_of_string(s),i)}
    function get_int16_be$0(s,i)
     {return get_int16_be(caml_bytes_of_string(s),i)}
    function get_int32_le$0(s,i)
     {return caml_bytes_get32(caml_bytes_of_string(s),i)}
    function get_int32_be$0(s,i)
     {return get_int32_be(caml_bytes_of_string(s),i)}
    function get_int64_le$0(s,i)
     {return caml_bytes_get64(caml_bytes_of_string(s),i)}
    function get_int64_be$0(s,i)
     {return get_int64_be(caml_bytes_of_string(s),i)}
    var
     get_int64_ne$0=runtime.caml_string_get64,
     get_int32_ne$0=runtime.caml_string_get32,
     get_uint16_ne$0=runtime.caml_string_get16,
     get_uint8$0=caml_string_get,
     equal$9=caml_string_equal,
     include$2=
      [0,
       make$1,
       init$2,
       empty$1,
       of_bytes,
       to_bytes,
       concat$1,
       cat,
       equal$9,
       compare$9,
       starts_with$0,
       ends_with$0,
       contains_from$0,
       rcontains_from$0,
       contains$0,
       sub$0,
       split_on_char$0,
       map$6,
       mapi$2,
       fold_left$2,
       fold_right$1,
       for_all$2,
       exists$2,
       trim$0,
       escaped$1,
       uppercase_ascii$1,
       lowercase_ascii$1,
       capitalize_ascii$0,
       uncapitalize_ascii$0,
       iter$4,
       iteri$2,
       index_from$0,
       index_from_opt$0,
       rindex_from$0,
       rindex_from_opt$0,
       index$0,
       index_opt$0,
       rindex$0,
       rindex_opt$0,
       to_seq$3,
       to_seqi$0,
       of_seq$1,
       get_utf_8_uchar$0,
       is_valid_utf_8$0,
       get_utf_16be_uchar$0,
       is_valid_utf_16be$0,
       get_utf_16le_uchar$0,
       is_valid_utf_16le$0,
       blit$0,
       copy$0,
       fill,
       uppercase$1,
       lowercase$1,
       capitalize$0,
       uncapitalize$0,
       get_uint8$0,
       get_int8$0,
       get_uint16_ne$0,
       get_uint16_be$0,
       get_uint16_le$0,
       get_int16_ne$0,
       get_int16_be$0,
       get_int16_le$0,
       get_int32_ne$0,
       get_int32_be$0,
       get_int32_le$0,
       get_int64_ne$0,
       get_int64_be$0,
       get_int64_le$0];
    caml_register_global(791,include$2,"Stdlib__String");
    function equal$10(param,_Al_){return 1}
    function compare$10(param,_Ak_){return 0}
    function to_string$2(param){return cst$5}
    var Stdlib_Unit=[0,equal$10,compare$10,to_string$2];
    caml_register_global(792,Stdlib_Unit,"Stdlib__Unit");
    function to_buffer(buff,ofs,len,v,flags)
     {if
       (0
        <=
        ofs
        &&
        0
        <=
        len
        &&
        !
        ((caml_ml_bytes_length(buff) - len | 0) < ofs))
       return runtime.caml_output_value_to_buffer(buff,ofs,len,v,flags);
      return invalid_arg(cst_Marshal_to_buffer_substrin)}
    var header_size=20;
    function data_size(buff,ofs)
     {if(0 <= ofs && ! ((caml_ml_bytes_length(buff) - 20 | 0) < ofs))
       return caml_marshal_data_size(buff,ofs);
      return invalid_arg(cst_Marshal_data_size)}
    function total_size(buff,ofs){return 20 + data_size(buff,ofs) | 0}
    function from_bytes(buff,ofs)
     {if(0 <= ofs && ! ((caml_ml_bytes_length(buff) - 20 | 0) < ofs))
       {var len=caml_marshal_data_size(buff,ofs);
        return (caml_ml_bytes_length(buff) - (20 + len | 0) | 0) < ofs
                ?invalid_arg(cst_Marshal_from_bytes$0)
                :runtime.caml_input_value_from_bytes(buff,ofs)}
      return invalid_arg(cst_Marshal_from_bytes)}
    function from_string(buff,ofs)
     {return from_bytes(caml_bytes_of_string(buff),ofs)}
    var
     Stdlib_Marshal=
      [0,
       caml_output_value,
       to_buffer,
       caml_input_value,
       from_bytes,
       from_string,
       header_size,
       data_size,
       total_size];
    caml_register_global(793,Stdlib_Marshal,"Stdlib__Marshal");
    var make_float=runtime.caml_make_float_vect,Floatarray=[0];
    function init$3(l,f)
     {if(0 === l)return [0];
      if(0 <= l)
       {var res=caml_make_vect(l,caml_call1(f,0)),_Ai_=l - 1 | 0,_Ah_=1;
        if(! (_Ai_ < 1))
         {var i=_Ah_;
          for(;;)
           {res[1 + i] = caml_call1(f,i);
            var _Aj_=i + 1 | 0;
            if(_Ai_ !== i){var i=_Aj_;continue}
            break}}
        return res}
      return invalid_arg(cst_Array_init)}
    function create_matrix(sx,sy,init)
     {var res=caml_make_vect(sx,[0]),_Af_=sx - 1 | 0,_Ae_=0;
      if(! (_Af_ < 0))
       {var x=_Ae_;
        for(;;)
         {res[1 + x] = caml_make_vect(sy,init);
          var _Ag_=x + 1 | 0;
          if(_Af_ !== x){var x=_Ag_;continue}
          break}}
      return res}
    function copy$1(a)
     {var l=a.length - 1;return 0 === l?[0]:caml_array_sub(a,0,l)}
    function append$1(a1,a2)
     {var l1=a1.length - 1;
      return 0 === l1
              ?copy$1(a2)
              :0 === a2.length - 1
                ?caml_array_sub(a1,0,l1)
                :runtime.caml_array_append(a1,a2)}
    function sub$1(a,ofs,len)
     {if(0 <= ofs && 0 <= len && ! ((a.length - 1 - len | 0) < ofs))
       return caml_array_sub(a,ofs,len);
      return invalid_arg(cst_Array_sub)}
    function fill$0(a,ofs,len,v)
     {if(0 <= ofs && 0 <= len && ! ((a.length - 1 - len | 0) < ofs))
       return runtime.caml_array_fill(a,ofs,len,v);
      return invalid_arg(cst_Array_fill)}
    function blit$1(a1,ofs1,a2,ofs2,len)
     {if
       (0
        <=
        len
        &&
        0
        <=
        ofs1
        &&
        !
        ((a1.length - 1 - len | 0) < ofs1)
        &&
        0
        <=
        ofs2
        &&
        !
        ((a2.length - 1 - len | 0) < ofs2))
       return runtime.caml_array_blit(a1,ofs1,a2,ofs2,len);
      return invalid_arg(cst_Array_blit)}
    function iter$5(f,a)
     {var _Ac_=a.length - 1 - 1 | 0,_Ab_=0;
      if(! (_Ac_ < 0))
       {var i=_Ab_;
        for(;;)
         {caml_call1(f,a[1 + i]);
          var _Ad_=i + 1 | 0;
          if(_Ac_ !== i){var i=_Ad_;continue}
          break}}
      return 0}
    function iter2$1(f,a,b)
     {if(a.length - 1 !== b.length - 1)
       return invalid_arg(cst_Array_iter2_arrays_must_ha);
      var _z$_=a.length - 1 - 1 | 0,_z__=0;
      if(! (_z$_ < 0))
       {var i=_z__;
        for(;;)
         {caml_call2(f,a[1 + i],b[1 + i]);
          var _Aa_=i + 1 | 0;
          if(_z$_ !== i){var i=_Aa_;continue}
          break}}
      return 0}
    function map$7(f,a)
     {var l=a.length - 1;
      if(0 === l)return [0];
      var r=caml_make_vect(l,caml_call1(f,a[1])),_z8_=l - 1 | 0,_z7_=1;
      if(! (_z8_ < 1))
       {var i=_z7_;
        for(;;)
         {r[1 + i] = caml_call1(f,a[1 + i]);
          var _z9_=i + 1 | 0;
          if(_z8_ !== i){var i=_z9_;continue}
          break}}
      return r}
    function map2$1(f,a,b)
     {var la=a.length - 1,lb=b.length - 1;
      if(la !== lb)return invalid_arg(cst_Array_map2_arrays_must_hav);
      if(0 === la)return [0];
      var r=caml_make_vect(la,caml_call2(f,a[1],b[1])),_z5_=la - 1 | 0,_z4_=1;
      if(! (_z5_ < 1))
       {var i=_z4_;
        for(;;)
         {r[1 + i] = caml_call2(f,a[1 + i],b[1 + i]);
          var _z6_=i + 1 | 0;
          if(_z5_ !== i){var i=_z6_;continue}
          break}}
      return r}
    function iteri$3(f,a)
     {var _z2_=a.length - 1 - 1 | 0,_z1_=0;
      if(! (_z2_ < 0))
       {var i=_z1_;
        for(;;)
         {caml_call2(f,i,a[1 + i]);
          var _z3_=i + 1 | 0;
          if(_z2_ !== i){var i=_z3_;continue}
          break}}
      return 0}
    function mapi$3(f,a)
     {var l=a.length - 1;
      if(0 === l)return [0];
      var r=caml_make_vect(l,caml_call2(f,0,a[1])),_zZ_=l - 1 | 0,_zY_=1;
      if(! (_zZ_ < 1))
       {var i=_zY_;
        for(;;)
         {r[1 + i] = caml_call2(f,i,a[1 + i]);
          var _z0_=i + 1 | 0;
          if(_zZ_ !== i){var i=_z0_;continue}
          break}}
      return r}
    function to_list$1(a)
     {var i$1=a.length - 1 - 1 | 0,i=i$1,res=0;
      for(;;)
       {if(0 <= i)
         {var res$0=[0,a[1 + i],res],i$0=i - 1 | 0,i=i$0,res=res$0;continue}
        return res}}
    function list_length(accu,param)
     {var accu$0=accu,param$0=param;
      for(;;)
       {if(param$0)
         {var
           param$1=param$0[2],
           accu$1=accu$0 + 1 | 0,
           accu$0=accu$1,
           param$0=param$1;
          continue}
        return accu$0}}
    function of_list(l)
     {if(l)
       {var
         tl=l[2],
         hd=l[1],
         a=caml_make_vect(list_length(0,l),hd),
         i=1,
         param=tl;
        for(;;)
         {if(param)
           {var tl$0=param[2],hd$0=param[1];
            a[1 + i] = hd$0;
            var i$0=i + 1 | 0,i=i$0,param=tl$0;
            continue}
          return a}}
      return [0]}
    function fold_left$3(f,x,a)
     {var r=[0,x],_zW_=a.length - 1 - 1 | 0,_zV_=0;
      if(! (_zW_ < 0))
       {var i=_zV_;
        for(;;)
         {r[1] = caml_call2(f,r[1],a[1 + i]);
          var _zX_=i + 1 | 0;
          if(_zW_ !== i){var i=_zX_;continue}
          break}}
      return r[1]}
    function fold_left_map$0(f,acc,input_array)
     {var len=input_array.length - 1;
      if(0 === len)return [0,acc,[0]];
      var
       match=caml_call2(f,acc,input_array[1]),
       elt=match[2],
       acc$0=match[1],
       output_array=caml_make_vect(len,elt),
       acc$1=[0,acc$0],
       _zT_=len - 1 | 0,
       _zS_=1;
      if(! (_zT_ < 1))
       {var i=_zS_;
        for(;;)
         {var
           match$0=caml_call2(f,acc$1[1],input_array[1 + i]),
           elt$0=match$0[2],
           acc$2=match$0[1];
          acc$1[1] = acc$2;
          output_array[1 + i] = elt$0;
          var _zU_=i + 1 | 0;
          if(_zT_ !== i){var i=_zU_;continue}
          break}}
      return [0,acc$1[1],output_array]}
    function fold_right$2(f,a,x)
     {var r=[0,x],_zQ_=a.length - 1 - 1 | 0;
      if(! (_zQ_ < 0))
       {var i=_zQ_;
        for(;;)
         {r[1] = caml_call2(f,a[1 + i],r[1]);
          var _zR_=i - 1 | 0;
          if(0 !== i){var i=_zR_;continue}
          break}}
      return r[1]}
    function exists$3(p,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(caml_call1(p,a[1 + i]))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function for_all$3(p,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 1;
        if(caml_call1(p,a[1 + i])){var i$0=i + 1 | 0,i=i$0;continue}
        return 0}}
    function for_all2$1(p,l1,l2)
     {var n1=l1.length - 1,n2=l2.length - 1;
      if(n1 !== n2)return invalid_arg(cst_Array_for_all2);
      var i=0;
      for(;;)
       {if(i === n1)return 1;
        if(caml_call2(p,l1[1 + i],l2[1 + i]))
         {var i$0=i + 1 | 0,i=i$0;continue}
        return 0}}
    function exists2$1(p,l1,l2)
     {var n1=l1.length - 1,n2=l2.length - 1;
      if(n1 !== n2)return invalid_arg(cst_Array_exists2);
      var i=0;
      for(;;)
       {if(i === n1)return 0;
        if(caml_call2(p,l1[1 + i],l2[1 + i]))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function mem$0(x,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(0 === caml_compare(a[1 + i],x))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function memq$0(x,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(x === a[1 + i])return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function find_opt$0(p,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        var x=a[1 + i];
        if(caml_call1(p,x))return [0,x];
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function find_map$1(f,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        var r=caml_call1(f,a[1 + i]);
        if(r)return r;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function split$0(x)
     {if(caml_equal(x,[0]))return [0,[0],[0]];
      var
       match=x[1],
       b0=match[2],
       a0=match[1],
       n=x.length - 1,
       a=caml_make_vect(n,a0),
       b=caml_make_vect(n,b0),
       _zO_=n - 1 | 0,
       _zN_=1;
      if(! (_zO_ < 1))
       {var i=_zN_;
        for(;;)
         {var match$0=x[1 + i],bi=match$0[2],ai=match$0[1];
          a[1 + i] = ai;
          b[1 + i] = bi;
          var _zP_=i + 1 | 0;
          if(_zO_ !== i){var i=_zP_;continue}
          break}}
      return [0,a,b]}
    function combine$0(a,b)
     {var na=a.length - 1,nb=b.length - 1;
      if(na !== nb)invalid_arg(cst_Array_combine);
      if(0 === na)return [0];
      var x=caml_make_vect(na,[0,a[1],b[1]]),_zL_=na - 1 | 0,_zK_=1;
      if(! (_zL_ < 1))
       {var i=_zK_;
        for(;;)
         {x[1 + i] = [0,a[1 + i],b[1 + i]];
          var _zM_=i + 1 | 0;
          if(_zL_ !== i){var i=_zM_;continue}
          break}}
      return x}
    var Bottom=[248,cst_Stdlib_Array_Bottom,caml_fresh_oo_id(0)];
    function sort(cmp,a)
     {function maxson(l,i)
       {var i31=((i + i | 0) + i | 0) + 1 | 0,x=[0,i31];
        if((i31 + 2 | 0) < l)
         {var _zD_=i31 + 1 | 0,_zE_=caml_check_bound(a,_zD_)[1 + _zD_];
          if(caml_call2(cmp,caml_check_bound(a,i31)[1 + i31],_zE_) < 0)
           x[1] = i31 + 1 | 0;
          var
           _zF_=i31 + 2 | 0,
           _zG_=caml_check_bound(a,_zF_)[1 + _zF_],
           _zH_=x[1];
          if(caml_call2(cmp,caml_check_bound(a,_zH_)[1 + _zH_],_zG_) < 0)
           x[1] = i31 + 2 | 0;
          return x[1]}
        if((i31 + 1 | 0) < l)
         {var _zI_=i31 + 1 | 0,_zJ_=caml_check_bound(a,_zI_)[1 + _zI_];
          if(! (0 <= caml_call2(cmp,caml_check_bound(a,i31)[1 + i31],_zJ_)))
           return i31 + 1 | 0}
        if(i31 < l)return i31;
        throw [0,Bottom,i]}
      function trickledown(l,i,e)
       {var i$0=i;
        for(;;)
         {var j=maxson(l,i$0);
          if(0 < caml_call2(cmp,caml_check_bound(a,j)[1 + j],e))
           {var _zC_=caml_check_bound(a,j)[1 + j];
            caml_check_bound(a,i$0)[1 + i$0] = _zC_;
            var i$0=j;
            continue}
          caml_check_bound(a,i$0)[1 + i$0] = e;
          return 0}}
      function trickle(l,i,e)
       {try
         {var _zB_=trickledown(l,i,e);return _zB_}
        catch(exn)
         {exn = caml_wrap_exception(exn);
          if(exn[1] === Bottom)
           {var i$0=exn[2];caml_check_bound(a,i$0)[1 + i$0] = e;return 0}
          throw exn}}
      function bubbledown(l,i)
       {var i$0=i;
        for(;;)
         {var i$1=maxson(l,i$0),_zA_=caml_check_bound(a,i$1)[1 + i$1];
          caml_check_bound(a,i$0)[1 + i$0] = _zA_;
          var i$0=i$1;
          continue}}
      function bubble(l,i)
       {try
         {var _zz_=bubbledown(l,i);return _zz_}
        catch(exn)
         {exn = caml_wrap_exception(exn);
          if(exn[1] === Bottom){var i$0=exn[2];return i$0}
          throw exn}}
      var l=a.length - 1,_zr_=((l + 1 | 0) / 3 | 0) - 1 | 0;
      if(! (_zr_ < 0))
       {var i$2=_zr_;
        for(;;)
         {trickle(l,i$2,caml_check_bound(a,i$2)[1 + i$2]);
          var _zy_=i$2 - 1 | 0;
          if(0 !== i$2){var i$2=_zy_;continue}
          break}}
      var _zs_=l - 1 | 0;
      if(! (_zs_ < 2))
       {var i$0=_zs_;
        a:
        for(;;)
         {var
           e$0=caml_check_bound(a,i$0)[1 + i$0],
           _zw_=caml_check_bound(a,0)[1];
          caml_check_bound(a,i$0)[1 + i$0] = _zw_;
          var i$1=bubble(i$0,0),i=i$1;
          for(;;)
           {var father=(i - 1 | 0) / 3 | 0;
            if(i === father)throw [0,Assert_failure,_H_];
            if
             (0 <= caml_call2(cmp,caml_check_bound(a,father)[1 + father],e$0))
             caml_check_bound(a,i)[1 + i] = e$0;
            else
             {var _zq_=caml_check_bound(a,father)[1 + father];
              caml_check_bound(a,i)[1 + i] = _zq_;
              if(0 < father){var i=father;continue}
              caml_check_bound(a,0)[1] = e$0}
            var _zx_=i$0 - 1 | 0;
            if(2 !== i$0){var i$0=_zx_;continue a}
            break}
          break}}
      var _zt_=1 < l?1:0;
      if(_zt_)
       {var e=caml_check_bound(a,1)[2],_zu_=caml_check_bound(a,0)[1];
        caml_check_bound(a,1)[2] = _zu_;
        caml_check_bound(a,0)[1] = e;
        var _zv_=0}
      else
       var _zv_=_zt_;
      return _zv_}
    function fast_sort$0(cmp,a)
     {function merge(src1ofs,src1len,src2,src2ofs,src2len,dst,dstofs)
       {var
         src1r=src1ofs + src1len | 0,
         src2r=src2ofs + src2len | 0,
         s2$1=caml_check_bound(src2,src2ofs)[1 + src2ofs],
         s1$1=caml_check_bound(a,src1ofs)[1 + src1ofs],
         i1=src1ofs,
         s1=s1$1,
         i2=src2ofs,
         s2=s2$1,
         d=dstofs;
        for(;;)
         {if(0 < caml_call2(cmp,s1,s2))
           {caml_check_bound(dst,d)[1 + d] = s2;
            var i2$0=i2 + 1 | 0;
            if(i2$0 < src2r)
             {var
               d$0=d + 1 | 0,
               s2$0=caml_check_bound(src2,i2$0)[1 + i2$0],
               i2=i2$0,
               s2=s2$0,
               d=d$0;
              continue}
            return blit$1(a,i1,dst,d + 1 | 0,src1r - i1 | 0)}
          caml_check_bound(dst,d)[1 + d] = s1;
          var i1$0=i1 + 1 | 0;
          if(i1$0 < src1r)
           {var
             d$1=d + 1 | 0,
             s1$0=caml_check_bound(a,i1$0)[1 + i1$0],
             i1=i1$0,
             s1=s1$0,
             d=d$1;
            continue}
          return blit$1(src2,i2,dst,d + 1 | 0,src2r - i2 | 0)}}
      function isortto(srcofs,dst,dstofs,len)
       {var _zi_=len - 1 | 0,_zh_=0;
        if(! (_zi_ < 0))
         {var i=_zh_;
          a:
          for(;;)
           {var
             _zj_=srcofs + i | 0,
             e=caml_check_bound(a,_zj_)[1 + _zj_],
             j=[0,(dstofs + i | 0) - 1 | 0];
            for(;;)
             {if(dstofs <= j[1])
               {var _zk_=j[1];
                if(0 < caml_call2(cmp,caml_check_bound(dst,_zk_)[1 + _zk_],e))
                 {var
                   _zl_=j[1],
                   _zm_=caml_check_bound(dst,_zl_)[1 + _zl_],
                   _zn_=j[1] + 1 | 0;
                  caml_check_bound(dst,_zn_)[1 + _zn_] = _zm_;
                  j[1] += -1;
                  continue}}
              var _zo_=j[1] + 1 | 0;
              caml_check_bound(dst,_zo_)[1 + _zo_] = e;
              var _zp_=i + 1 | 0;
              if(_zi_ !== i){var i=_zp_;continue a}
              break}
            break}}
        return 0}
      function sortto(srcofs,dst,dstofs,len)
       {if(len <= 5)return isortto(srcofs,dst,dstofs,len);
        var l1=len / 2 | 0,l2=len - l1 | 0;
        sortto(srcofs + l1 | 0,dst,dstofs + l1 | 0,l2);
        sortto(srcofs,a,srcofs + l2 | 0,l1);
        return merge(srcofs + l2 | 0,l1,dst,dstofs + l1 | 0,l2,dst,dstofs)}
      var l=a.length - 1;
      if(l <= 5)return isortto(0,a,0,l);
      var
       l1=l / 2 | 0,
       l2=l - l1 | 0,
       t=caml_make_vect(l2,caml_check_bound(a,0)[1]);
      sortto(l1,t,0,l2);
      sortto(0,a,l2,l1);
      return merge(l2,l1,t,0,l2,a,0)}
    function to_seq$4(a)
     {function aux(i,param)
       {if(i < a.length - 1)
         {var x=a[1 + i],_zf_=i + 1 | 0;
          return [0,x,function(_zg_){return aux(_zf_,_zg_)}]}
        return 0}
      var _zd_=0;
      return function(_ze_){return aux(_zd_,_ze_)}}
    function to_seqi$1(a)
     {function aux(i,param)
       {if(i < a.length - 1)
         {var x=a[1 + i],_zb_=i + 1 | 0;
          return [0,[0,i,x],function(_zc_){return aux(_zb_,_zc_)}]}
        return 0}
      var _y$_=0;
      return function(_za_){return aux(_y$_,_za_)}}
    function of_seq$2(i$2)
     {var _y__=0,l=fold_left(function(acc,x){return [0,x,acc]},_y__,i$2);
      if(l)
       {var
         tl=l[2],
         hd=l[1],
         len=list_length(0,l),
         a=caml_make_vect(len,hd),
         i$1=len - 2 | 0,
         i=i$1,
         param=tl;
        for(;;)
         {if(param)
           {var tl$0=param[2],hd$0=param[1];
            a[1 + i] = hd$0;
            var i$0=i - 1 | 0,i=i$0,param=tl$0;
            continue}
          return a}}
      return [0]}
    var
     concat$2=caml_array_concat,
     include$3=
      [0,
       make_float,
       init$3,
       create_matrix,
       create_matrix,
       append$1,
       concat$2,
       sub$1,
       copy$1,
       fill$0,
       blit$1,
       to_list$1,
       of_list,
       iter$5,
       iteri$3,
       map$7,
       mapi$3,
       fold_left$3,
       fold_left_map$0,
       fold_right$2,
       iter2$1,
       map2$1,
       for_all$3,
       exists$3,
       for_all2$1,
       exists2$1,
       mem$0,
       memq$0,
       find_opt$0,
       find_map$1,
       split$0,
       combine$0,
       sort,
       fast_sort$0,
       fast_sort$0,
       to_seq$4,
       to_seqi$1,
       of_seq$2,
       Floatarray];
    caml_register_global(794,include$3,"Stdlib__Array");
    var zero$0=0.,one$0=1.,minus_one$0=-1.;
    function is_finite(x){return x - x == 0.?1:0}
    function is_infinite(x){return 1. / x == 0.?1:0}
    function is_nan(x){return x != x?1:0}
    var pi=3.1415926535897931;
    function is_integer(x)
     {var _y9_=x == runtime.caml_trunc_float(x)?1:0;
      return _y9_?is_finite(x):_y9_}
    function succ$0(x){return caml_nextafter_float(x,infinity)}
    function pred$0(x){return caml_nextafter_float(x,neg_infinity)}
    function equal$11(x,y){return 0 === caml_float_compare(x,y)?1:0}
    function min$2(x,y)
     {if(! (x < y))
       {var switch$0=0;
        if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
        if(switch$0)return x != x?x:y}
      return y != y?y:x}
    function max$2(x,y)
     {if(! (x < y))
       {var switch$0=0;
        if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
        if(switch$0)return y != y?y:x}
      return x != x?x:y}
    function min_max(x,y)
     {if(x == x && y == y)
       {if(! (x < y))
         {var switch$0=0;
          if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
          if(switch$0)return [0,y,x]}
        return [0,x,y]}
      return [0,nan,nan]}
    function min_num(x,y)
     {if(! (x < y))
       {var switch$0=0;
        if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
        if(switch$0)return y != y?x:y}
      return x != x?y:x}
    function max_num(x,y)
     {if(! (x < y))
       {var switch$0=0;
        if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
        if(switch$0)return x != x?y:x}
      return y != y?x:y}
    function min_max_num(x,y)
     {if(x != x)return [0,y,y];
      if(y != y)return [0,x,x];
      if(! (x < y))
       {var switch$0=0;
        if(caml_signbit_float(y) || ! caml_signbit_float(x))switch$0 = 1;
        if(switch$0)return [0,y,x]}
      return [0,x,y]}
    function hash$0(x){return caml_hash(10,100,0,x)}
    function unsafe_fill(a,ofs,len,v)
     {var _y7_=(ofs + len | 0) - 1 | 0;
      if(! (_y7_ < ofs))
       {var i=ofs;
        for(;;)
         {a[1 + i] = v;
          var _y8_=i + 1 | 0;
          if(_y7_ !== i){var i=_y8_;continue}
          break}}
      return 0}
    function check(a,ofs,len,msg)
     {var _y3_=ofs < 0?1:0;
      if(_y3_)
       var _y4_=_y3_;
      else
       {var _y5_=len < 0?1:0;
        if(_y5_)
         var _y4_=_y5_;
        else
         var
          _y6_=(ofs + len | 0) < 0?1:0,
          _y4_=_y6_ || (a.length - 1 < (ofs + len | 0)?1:0)}
      return _y4_?invalid_arg(msg):_y4_}
    function make$2(n,v)
     {var result=caml_floatarray_create(n);
      unsafe_fill(result,0,n,v);
      return result}
    function init$4(l,f)
     {if(0 <= l)
       {var res=caml_floatarray_create(l),_y1_=l - 1 | 0,_y0_=0;
        if(! (_y1_ < 0))
         {var i=_y0_;
          for(;;)
           {res[1 + i] = caml_call1(f,i);
            var _y2_=i + 1 | 0;
            if(_y1_ !== i){var i=_y2_;continue}
            break}}
        return res}
      return invalid_arg(cst_Float_Array_init)}
    function append$2(a1,a2)
     {var
       l1=a1.length - 1,
       l2=a2.length - 1,
       result=caml_floatarray_create(l1 + l2 | 0);
      caml_floatarray_blit(a1,0,result,0,l1);
      caml_floatarray_blit(a2,0,result,l1,l2);
      return result}
    function concat$3(l)
     {var acc=0,param=l;
      for(;;)
       {if(param)
         {var
           tl=param[2],
           hd=param[1],
           x=hd.length - 1 + acc | 0,
           acc$0=acc <= x?x:invalid_arg(cst_Float_Array_concat),
           acc=acc$0,
           param=tl;
          continue}
        var result=caml_floatarray_create(acc),l$0=l,i=0;
        for(;;)
         {if(l$0)
           {var tl$0=l$0[2],hd$0=l$0[1],hlen=hd$0.length - 1;
            caml_floatarray_blit(hd$0,0,result,i,hlen);
            var i$0=i + hlen | 0,l$0=tl$0,i=i$0;
            continue}
          if(i === acc)return result;
          throw [0,Assert_failure,_I_]}}}
    function sub$2(a,ofs,len)
     {check(a,ofs,len,cst_Float_Array_sub);
      var result=caml_floatarray_create(len);
      caml_floatarray_blit(a,ofs,result,0,len);
      return result}
    function copy$2(a)
     {var l=a.length - 1,result=caml_floatarray_create(l);
      caml_floatarray_blit(a,0,result,0,l);
      return result}
    function fill$1(a,ofs,len,v)
     {check(a,ofs,len,cst_Float_Array_fill);return unsafe_fill(a,ofs,len,v)}
    function blit$2(src,sofs,dst,dofs,len)
     {check(src,sofs,len,cst_Float_array_blit);
      check(dst,dofs,len,cst_Float_array_blit$0);
      return caml_floatarray_blit(src,sofs,dst,dofs,len)}
    function to_list$2(a)
     {return init$0(a.length - 1,function(_yZ_){return a[1 + _yZ_]})}
    function of_list$0(l)
     {var result=caml_floatarray_create(length$1(l)),i=0,l$0=l;
      for(;;)
       {if(l$0)
         {var t=l$0[2],h=l$0[1];
          result[1 + i] = h;
          var i$0=i + 1 | 0,i=i$0,l$0=t;
          continue}
        return result}}
    function iter$6(f,a)
     {var _yX_=a.length - 1 - 1 | 0,_yW_=0;
      if(! (_yX_ < 0))
       {var i=_yW_;
        for(;;)
         {caml_call1(f,a[1 + i]);
          var _yY_=i + 1 | 0;
          if(_yX_ !== i){var i=_yY_;continue}
          break}}
      return 0}
    function iter2$2(f,a,b)
     {if(a.length - 1 !== b.length - 1)
       return invalid_arg(cst_Float_Array_iter2_arrays_m);
      var _yU_=a.length - 1 - 1 | 0,_yT_=0;
      if(! (_yU_ < 0))
       {var i=_yT_;
        for(;;)
         {caml_call2(f,a[1 + i],b[1 + i]);
          var _yV_=i + 1 | 0;
          if(_yU_ !== i){var i=_yV_;continue}
          break}}
      return 0}
    function map$8(f,a)
     {var l=a.length - 1,r=caml_floatarray_create(l),_yR_=l - 1 | 0,_yQ_=0;
      if(! (_yR_ < 0))
       {var i=_yQ_;
        for(;;)
         {r[1 + i] = caml_call1(f,a[1 + i]);
          var _yS_=i + 1 | 0;
          if(_yR_ !== i){var i=_yS_;continue}
          break}}
      return r}
    function map2$2(f,a,b)
     {var la=a.length - 1,lb=b.length - 1;
      if(la !== lb)return invalid_arg(cst_Float_Array_map2_arrays_mu);
      var r=caml_floatarray_create(la),_yO_=la - 1 | 0,_yN_=0;
      if(! (_yO_ < 0))
       {var i=_yN_;
        for(;;)
         {r[1 + i] = caml_call2(f,a[1 + i],b[1 + i]);
          var _yP_=i + 1 | 0;
          if(_yO_ !== i){var i=_yP_;continue}
          break}}
      return r}
    function iteri$4(f,a)
     {var _yL_=a.length - 1 - 1 | 0,_yK_=0;
      if(! (_yL_ < 0))
       {var i=_yK_;
        for(;;)
         {caml_call2(f,i,a[1 + i]);
          var _yM_=i + 1 | 0;
          if(_yL_ !== i){var i=_yM_;continue}
          break}}
      return 0}
    function mapi$4(f,a)
     {var l=a.length - 1,r=caml_floatarray_create(l),_yI_=l - 1 | 0,_yH_=0;
      if(! (_yI_ < 0))
       {var i=_yH_;
        for(;;)
         {r[1 + i] = caml_call2(f,i,a[1 + i]);
          var _yJ_=i + 1 | 0;
          if(_yI_ !== i){var i=_yJ_;continue}
          break}}
      return r}
    function fold_left$4(f,x,a)
     {var r=[0,x],_yF_=a.length - 1 - 1 | 0,_yE_=0;
      if(! (_yF_ < 0))
       {var i=_yE_;
        for(;;)
         {r[1] = caml_call2(f,r[1],a[1 + i]);
          var _yG_=i + 1 | 0;
          if(_yF_ !== i){var i=_yG_;continue}
          break}}
      return r[1]}
    function fold_right$3(f,a,x)
     {var r=[0,x],_yC_=a.length - 1 - 1 | 0;
      if(! (_yC_ < 0))
       {var i=_yC_;
        for(;;)
         {r[1] = caml_call2(f,a[1 + i],r[1]);
          var _yD_=i - 1 | 0;
          if(0 !== i){var i=_yD_;continue}
          break}}
      return r[1]}
    function exists$4(p,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(caml_call1(p,a[1 + i]))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function for_all$4(p,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 1;
        if(caml_call1(p,a[1 + i])){var i$0=i + 1 | 0,i=i$0;continue}
        return 0}}
    function mem$1(x,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(0 === caml_float_compare(a[1 + i],x))return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    function mem_ieee(x,a)
     {var n=a.length - 1,i=0;
      for(;;)
       {if(i === n)return 0;
        if(x == a[1 + i])return 1;
        var i$0=i + 1 | 0,i=i$0;
        continue}}
    var Bottom$0=[248,cst_Stdlib_Float_Array_Bottom,caml_fresh_oo_id(0)];
    function sort$0(cmp,a)
     {function maxson(l,i)
       {var i31=((i + i | 0) + i | 0) + 1 | 0,x=[0,i31];
        if((i31 + 2 | 0) < l)
         {if
           (caml_call2
             (cmp,caml_array_get(a,i31),caml_array_get(a,i31 + 1 | 0))
            <
            0)
           x[1] = i31 + 1 | 0;
          if
           (caml_call2
             (cmp,caml_array_get(a,x[1]),caml_array_get(a,i31 + 2 | 0))
            <
            0)
           x[1] = i31 + 2 | 0;
          return x[1]}
        if
         ((i31 + 1 | 0)
          <
          l
          &&
          !
          (0
           <=
           caml_call2(cmp,caml_array_get(a,i31),caml_array_get(a,i31 + 1 | 0))))
         return i31 + 1 | 0;
        if(i31 < l)return i31;
        throw [0,Bottom$0,i]}
      function trickledown(l,i,e)
       {var i$0=i;
        for(;;)
         {var j=maxson(l,i$0);
          if(0 < caml_call2(cmp,caml_array_get(a,j),e))
           {caml_array_set(a,i$0,caml_array_get(a,j));var i$0=j;continue}
          return caml_array_set(a,i$0,e)}}
      function trickle(l,i,e)
       {try
         {var _yB_=trickledown(l,i,e);return _yB_}
        catch(exn)
         {exn = caml_wrap_exception(exn);
          if(exn[1] === Bottom$0)
           {var i$0=exn[2];return caml_array_set(a,i$0,e)}
          throw exn}}
      function bubbledown(l,i)
       {var i$0=i;
        for(;;)
         {var i$1=maxson(l,i$0);
          caml_array_set(a,i$0,caml_array_get(a,i$1));
          var i$0=i$1;
          continue}}
      function bubble(l,i)
       {try
         {var _yA_=bubbledown(l,i);return _yA_}
        catch(exn)
         {exn = caml_wrap_exception(exn);
          if(exn[1] === Bottom$0){var i$0=exn[2];return i$0}
          throw exn}}
      var l=a.length - 1,_yu_=((l + 1 | 0) / 3 | 0) - 1 | 0;
      if(! (_yu_ < 0))
       {var i$2=_yu_;
        for(;;)
         {trickle(l,i$2,caml_array_get(a,i$2));
          var _yz_=i$2 - 1 | 0;
          if(0 !== i$2){var i$2=_yz_;continue}
          break}}
      var _yv_=l - 1 | 0;
      if(! (_yv_ < 2))
       {var i$0=_yv_;
        a:
        for(;;)
         {var e$0=caml_array_get(a,i$0);
          caml_array_set(a,i$0,caml_array_get(a,0));
          var i$1=bubble(i$0,0),i=i$1;
          for(;;)
           {var father=(i - 1 | 0) / 3 | 0;
            if(i === father)throw [0,Assert_failure,_J_];
            if(0 <= caml_call2(cmp,caml_array_get(a,father),e$0))
             caml_array_set(a,i,e$0);
            else
             {caml_array_set(a,i,caml_array_get(a,father));
              if(0 < father){var i=father;continue}
              caml_array_set(a,0,e$0)}
            var _yy_=i$0 - 1 | 0;
            if(2 !== i$0){var i$0=_yy_;continue a}
            break}
          break}}
      var _yw_=1 < l?1:0;
      if(_yw_)
       {var e=caml_array_get(a,1);
        caml_array_set(a,1,caml_array_get(a,0));
        var _yx_=caml_array_set(a,0,e)}
      else
       var _yx_=_yw_;
      return _yx_}
    function stable_sort(cmp,a)
     {function merge(src1ofs,src1len,src2,src2ofs,src2len,dst,dstofs)
       {var
         src1r=src1ofs + src1len | 0,
         src2r=src2ofs + src2len | 0,
         s2$1=caml_array_get(src2,src2ofs),
         s1$1=caml_array_get(a,src1ofs),
         i1=src1ofs,
         s1=s1$1,
         i2=src2ofs,
         s2=s2$1,
         d=dstofs;
        for(;;)
         {if(0 < caml_call2(cmp,s1,s2))
           {caml_array_set(dst,d,s2);
            var i2$0=i2 + 1 | 0;
            if(i2$0 < src2r)
             {var
               d$0=d + 1 | 0,
               s2$0=caml_array_get(src2,i2$0),
               i2=i2$0,
               s2=s2$0,
               d=d$0;
              continue}
            return blit$2(a,i1,dst,d + 1 | 0,src1r - i1 | 0)}
          caml_array_set(dst,d,s1);
          var i1$0=i1 + 1 | 0;
          if(i1$0 < src1r)
           {var
             d$1=d + 1 | 0,
             s1$0=caml_array_get(a,i1$0),
             i1=i1$0,
             s1=s1$0,
             d=d$1;
            continue}
          return blit$2(src2,i2,dst,d + 1 | 0,src2r - i2 | 0)}}
      function isortto(srcofs,dst,dstofs,len)
       {var _ys_=len - 1 | 0,_yr_=0;
        if(! (_ys_ < 0))
         {var i=_yr_;
          a:
          for(;;)
           {var
             e=caml_array_get(a,srcofs + i | 0),
             j=[0,(dstofs + i | 0) - 1 | 0];
            for(;;)
             {if
               (dstofs
                <=
                j[1]
                &&
                0
                <
                caml_call2(cmp,caml_array_get(dst,j[1]),e))
               {caml_array_set(dst,j[1] + 1 | 0,caml_array_get(dst,j[1]));
                j[1] += -1;
                continue}
              caml_array_set(dst,j[1] + 1 | 0,e);
              var _yt_=i + 1 | 0;
              if(_ys_ !== i){var i=_yt_;continue a}
              break}
            break}}
        return 0}
      function sortto(srcofs,dst,dstofs,len)
       {if(len <= 5)return isortto(srcofs,dst,dstofs,len);
        var l1=len / 2 | 0,l2=len - l1 | 0;
        sortto(srcofs + l1 | 0,dst,dstofs + l1 | 0,l2);
        sortto(srcofs,a,srcofs + l2 | 0,l1);
        return merge(srcofs + l2 | 0,l1,dst,dstofs + l1 | 0,l2,dst,dstofs)}
      var l=a.length - 1;
      if(l <= 5)return isortto(0,a,0,l);
      var l1=l / 2 | 0,l2=l - l1 | 0,t=caml_floatarray_create(l2);
      sortto(l1,t,0,l2);
      sortto(0,a,l2,l1);
      return merge(l2,l1,t,0,l2,a,0)}
    function to_seq$5(a)
     {function aux(i,param)
       {if(i < a.length - 1)
         {var x=a[1 + i],_yp_=i + 1 | 0;
          return [0,x,function(_yq_){return aux(_yp_,_yq_)}]}
        return 0}
      var _yn_=0;
      return function(_yo_){return aux(_yn_,_yo_)}}
    function to_seqi$2(a)
     {function aux(i,param)
       {if(i < a.length - 1)
         {var x=a[1 + i],_yl_=i + 1 | 0;
          return [0,[0,i,x],function(_ym_){return aux(_yl_,_ym_)}]}
        return 0}
      var _yj_=0;
      return function(_yk_){return aux(_yj_,_yk_)}}
    function of_seq$3(i$2)
     {var
       _yi_=0,
       param$0=fold_left(function(acc,x){return [0,x,acc]},_yi_,i$2),
       len=length$1(param$0),
       a=caml_floatarray_create(len),
       i$1=len - 1 | 0,
       i=i$1,
       param=param$0;
      for(;;)
       {if(param)
         {var tl=param[2],hd=param[1];
          a[1 + i] = hd;
          var i$0=i - 1 | 0,i=i$0,param=tl;
          continue}
        return a}}
    function map_to_array(f,a)
     {var l=a.length - 1;
      if(0 === l)return [0];
      var r=caml_make_vect(l,caml_call1(f,a[1])),_yg_=l - 1 | 0,_yf_=1;
      if(! (_yg_ < 1))
       {var i=_yf_;
        for(;;)
         {r[1 + i] = caml_call1(f,a[1 + i]);
          var _yh_=i + 1 | 0;
          if(_yg_ !== i){var i=_yh_;continue}
          break}}
      return r}
    function map_from_array(f,a)
     {var l=a.length - 1,r=caml_floatarray_create(l),_yd_=l - 1 | 0,_yc_=0;
      if(! (_yd_ < 0))
       {var i=_yc_;
        for(;;)
         {r[1 + i] = caml_call1(f,a[1 + i]);
          var _ye_=i + 1 | 0;
          if(_yd_ !== i){var i=_ye_;continue}
          break}}
      return r}
    var
     _K_=caml_floatarray_create,
     _L_=caml_array_set,
     _M_=caml_array_get,
     _N_=
      [0,
       function(_yb_){return _yb_.length - 1},
       _M_,
       _L_,
       make$2,
       _K_,
       init$4,
       append$2,
       concat$3,
       sub$2,
       copy$2,
       fill$1,
       blit$2,
       to_list$2,
       of_list$0,
       iter$6,
       iteri$4,
       map$8,
       mapi$4,
       fold_left$4,
       fold_right$3,
       iter2$2,
       map2$2,
       for_all$4,
       exists$4,
       mem$1,
       mem_ieee,
       sort$0,
       stable_sort,
       stable_sort,
       to_seq$5,
       to_seqi$2,
       of_seq$3,
       map_to_array,
       map_from_array],
     _O_=caml_floatarray_create,
     _P_=caml_array_set,
     _Q_=caml_array_get,
     Stdlib_Float=
      [0,
       zero$0,
       one$0,
       minus_one$0,
       succ$0,
       pred$0,
       infinity,
       neg_infinity,
       nan,
       pi,
       max_float,
       min_float,
       epsilon,
       is_finite,
       is_infinite,
       is_nan,
       is_integer,
       of_string_opt,
       to_string,
       caml_float_compare,
       equal$11,
       min$2,
       max$2,
       min_max,
       min_num,
       max_num,
       min_max_num,
       hash$0,
       [0,
        function(_ya_){return _ya_.length - 1},
        _Q_,
        _P_,
        make$2,
        _O_,
        init$4,
        append$2,
        concat$3,
        sub$2,
        copy$2,
        fill$1,
        blit$2,
        to_list$2,
        of_list$0,
        iter$6,
        iteri$4,
        map$8,
        mapi$4,
        fold_left$4,
        fold_right$3,
        iter2$2,
        map2$2,
        for_all$4,
        exists$4,
        mem$1,
        mem_ieee,
        sort$0,
        stable_sort,
        stable_sort,
        to_seq$5,
        to_seqi$2,
        of_seq$3,
        map_to_array,
        map_from_array],
       _N_];
    caml_register_global(795,Stdlib_Float,"Stdlib__Float");
    var zero$1=0,one$1=1,minus_one$1=-1;
    function succ$1(n){return n + 1 | 0}
    function pred$1(n){return n - 1 | 0}
    function abs$1(n){return caml_greaterequal(n,0)?n:- n | 0}
    var min_int$1=-2147483648,max_int$1=2147483647;
    function lognot$0(n){return n ^ -1}
    function unsigned_to_int(n)
     {if
       (!
        (0 < caml_int_compare(0,n))
        &&
        !
        (0 < caml_int_compare(n,2147483647)))
       return [0,n];
      return 0}
    function to_string$3(n){return caml_format_int(cst_d,n)}
    function of_string_opt$0(s)
     {try
       {var _x__=[0,caml_int_of_string(s)];return _x__}
      catch(_x$_)
       {_x$_ = caml_wrap_exception(_x$_);
        if(_x$_[1] === Failure)return 0;
        throw _x$_}}
    function compare$11(x,y){return caml_int_compare(x,y)}
    function equal$12(x,y){return 0 === caml_int_compare(x,y)?1:0}
    function unsigned_compare(n,m)
     {return caml_int_compare(n + 2147483648 | 0,m + 2147483648 | 0)}
    function min$3(x,y){return caml_lessequal(x,y)?x:y}
    function max$3(x,y){return caml_greaterequal(x,y)?x:y}
    function unsigned_div(n,d)
     {if(caml_lessthan(d,0))return 0 <= unsigned_compare(n,d)?one$1:zero$1;
      var q=caml_div(n >>> 1 | 0,d) << 1,r=n - caml_mul(q,d) | 0;
      return 0 <= unsigned_compare(r,d)?q + 1 | 0:q}
    function unsigned_rem(n,d){return n - caml_mul(unsigned_div(n,d),d) | 0}
    var
     Stdlib_Int32=
      [0,
       zero$1,
       one$1,
       minus_one$1,
       unsigned_div,
       unsigned_rem,
       succ$1,
       pred$1,
       abs$1,
       max_int$1,
       min_int$1,
       lognot$0,
       unsigned_to_int,
       of_string_opt$0,
       to_string$3,
       compare$11,
       unsigned_compare,
       equal$12,
       min$3,
       max$3];
    caml_register_global(796,Stdlib_Int32,"Stdlib__Int32");
    function succ$2(n){return caml_int64_add(n,_R_)}
    function pred$2(n){return caml_int64_sub(n,_S_)}
    function abs$2(n)
     {return caml_greaterequal(n,_T_)?n:runtime.caml_int64_neg(n)}
    function lognot$1(n){return runtime.caml_int64_xor(n,_U_)}
    var max_int$3=caml_int64_of_int32(2147483647);
    function unsigned_to_int$0(n)
     {if
       (!
        (0 < caml_int64_compare(zero$2,n))
        &&
        !
        (0 < caml_int64_compare(n,max_int$3)))
       return [0,runtime.caml_int64_to_int32(n)];
      return 0}
    function to_string$4(n){return caml_int64_format(cst_d$0,n)}
    function of_string_opt$1(s)
     {try
       {var _x8_=[0,caml_int64_of_string(s)];return _x8_}
      catch(_x9_)
       {_x9_ = caml_wrap_exception(_x9_);
        if(_x9_[1] === Failure)return 0;
        throw _x9_}}
    function compare$12(x,y){return caml_int64_compare(x,y)}
    function equal$13(x,y){return 0 === caml_int64_compare(x,y)?1:0}
    function unsigned_compare$0(n,m)
     {return caml_int64_compare
              (caml_int64_sub(n,min_int$2),caml_int64_sub(m,min_int$2))}
    function min$4(x,y){return caml_lessequal(x,y)?x:y}
    function max$4(x,y){return caml_greaterequal(x,y)?x:y}
    function unsigned_div$0(n,d)
     {if(caml_lessthan(d,zero$2))
       return 0 <= unsigned_compare$0(n,d)?one$2:zero$2;
      var
       q=
        caml_int64_shift_left
         (runtime.caml_int64_div(caml_int64_shift_right_unsigne(n,1),d),1),
       r=caml_int64_sub(n,caml_int64_mul(q,d));
      return 0 <= unsigned_compare$0(r,d)?succ$2(q):q}
    function unsigned_rem$0(n,d)
     {return caml_int64_sub(n,caml_int64_mul(unsigned_div$0(n,d),d))}
    var
     Stdlib_Int64=
      [0,
       zero$2,
       one$2,
       minus_one$2,
       unsigned_div$0,
       unsigned_rem$0,
       succ$2,
       pred$2,
       abs$2,
       max_int$2,
       min_int$2,
       lognot$1,
       unsigned_to_int$0,
       of_string_opt$1,
       to_string$4,
       compare$12,
       unsigned_compare$0,
       equal$13,
       min$4,
       max$4];
    caml_register_global(797,Stdlib_Int64,"Stdlib__Int64");
    var zero$3=0,one$3=1,minus_one$3=-1;
    function succ$3(n){return n + 1 | 0}
    function pred$3(n){return n - 1 | 0}
    function abs$3(n){return caml_greaterequal(n,0)?n:- n | 0}
    var min_int$3=-2147483648,max_int$4=2147483647;
    function lognot$2(n){return n ^ -1}
    function unsigned_to_int$1(n)
     {if
       (!
        (0 < caml_int_compare(0,n))
        &&
        !
        (0 < caml_int_compare(n,2147483647)))
       return [0,n];
      return 0}
    function to_string$5(n){return caml_format_int(cst_d$1,n)}
    function of_string_opt$2(s)
     {try
       {var _x6_=[0,caml_int_of_string(s)];return _x6_}
      catch(_x7_)
       {_x7_ = caml_wrap_exception(_x7_);
        if(_x7_[1] === Failure)return 0;
        throw _x7_}}
    function compare$13(x,y){return caml_int_compare(x,y)}
    function equal$14(x,y){return 0 === caml_int_compare(x,y)?1:0}
    function unsigned_compare$1(n,m)
     {return caml_int_compare(n + 2147483648 | 0,m + 2147483648 | 0)}
    function min$5(x,y){return caml_lessequal(x,y)?x:y}
    function max$5(x,y){return caml_greaterequal(x,y)?x:y}
    function unsigned_div$1(n,d)
     {if(caml_lessthan(d,0))return 0 <= unsigned_compare$1(n,d)?one$3:zero$3;
      var q=caml_div(n >>> 1 | 0,d) << 1,r=n - caml_mul(q,d) | 0;
      return 0 <= unsigned_compare$1(r,d)?q + 1 | 0:q}
    function unsigned_rem$1(n,d)
     {return n - caml_mul(unsigned_div$1(n,d),d) | 0}
    var
     Stdlib_Nativeint=
      [0,
       zero$3,
       one$3,
       minus_one$3,
       unsigned_div$1,
       unsigned_rem$1,
       succ$3,
       pred$3,
       abs$3,
       match$1,
       max_int$4,
       min_int$3,
       lognot$2,
       unsigned_to_int$1,
       of_string_opt$2,
       to_string$5,
       compare$13,
       unsigned_compare$1,
       equal$14,
       min$5,
       max$5];
    caml_register_global(798,Stdlib_Nativeint,"Stdlib__Nativeint");
    function engine(tbl,state,buf)
     {var
       result=runtime.caml_lex_engine(tbl,state,buf),
       _x3_=0 <= result?1:0,
       _x4_=_x3_?buf[12] !== dummy_pos?1:0:_x3_;
      if(_x4_)
       {buf[11] = buf[12];
        var _x5_=buf[12];
        buf[12] = [0,_x5_[1],_x5_[2],_x5_[3],buf[4] + buf[6] | 0]}
      return result}
    function new_engine(tbl,state,buf)
     {var
       result=runtime.caml_new_lex_engine(tbl,state,buf),
       _x0_=0 <= result?1:0,
       _x1_=_x0_?buf[12] !== dummy_pos?1:0:_x0_;
      if(_x1_)
       {buf[11] = buf[12];
        var _x2_=buf[12];
        buf[12] = [0,_x2_[1],_x2_[2],_x2_[3],buf[4] + buf[6] | 0]}
      return result}
    function from_function(opt,f)
     {if(opt)var sth=opt[1],with_positions=sth;else var with_positions=1;
      var
       _xM_=with_positions?zero_pos:dummy_pos,
       _xN_=with_positions?zero_pos:dummy_pos,
       aux_buffer=caml_create_bytes(512),
       _xO_=[0],
       _xP_=0,
       _xQ_=0,
       _xR_=0,
       _xS_=0,
       _xT_=0,
       _xU_=0,
       _xV_=0,
       _xW_=caml_create_bytes(1024);
      return [0,
              function(lexbuf)
               {var
                 read=
                  caml_call2(f,aux_buffer,caml_ml_bytes_length(aux_buffer)),
                 n=0 < read?read:(lexbuf[9] = 1,0);
                if(caml_ml_bytes_length(lexbuf[2]) < (lexbuf[3] + n | 0))
                 {if
                   (((lexbuf[3] - lexbuf[5] | 0) + n | 0)
                    <=
                    caml_ml_bytes_length(lexbuf[2]))
                   blit
                    (lexbuf[2],lexbuf[5],lexbuf[2],0,lexbuf[3] - lexbuf[5] | 0);
                  else
                   {var
                     newlen=
                      min$1
                       (2 * caml_ml_bytes_length(lexbuf[2]) | 0,max_string_length);
                    if(newlen < ((lexbuf[3] - lexbuf[5] | 0) + n | 0))
                     failwith(cst_Lexing_lex_refill_cannot_g);
                    var newbuf=caml_create_bytes(newlen);
                    blit(lexbuf[2],lexbuf[5],newbuf,0,lexbuf[3] - lexbuf[5] | 0);
                    lexbuf[2] = newbuf}
                  var s=lexbuf[5];
                  lexbuf[4] = lexbuf[4] + s | 0;
                  lexbuf[6] = lexbuf[6] - s | 0;
                  lexbuf[5] = 0;
                  lexbuf[7] = lexbuf[7] - s | 0;
                  lexbuf[3] = lexbuf[3] - s | 0;
                  var t=lexbuf[10],_xY_=t.length - 1 - 1 | 0,_xX_=0;
                  if(! (_xY_ < 0))
                   {var i=_xX_;
                    for(;;)
                     {var v=caml_check_bound(t,i)[1 + i];
                      if(0 <= v)caml_check_bound(t,i)[1 + i] = v - s | 0;
                      var _xZ_=i + 1 | 0;
                      if(_xY_ !== i){var i=_xZ_;continue}
                      break}}}
                blit(aux_buffer,0,lexbuf[2],lexbuf[3],n);
                lexbuf[3] = lexbuf[3] + n | 0;
                return 0},
              _xW_,
              _xV_,
              _xU_,
              _xT_,
              _xS_,
              _xR_,
              _xQ_,
              _xP_,
              _xO_,
              _xN_,
              _xM_]}
    function from_channel(with_positions,ic)
     {return from_function
              (with_positions,function(buf,n){return input(ic,buf,0,n)})}
    function from_string$0(opt,s)
     {if(opt)var sth=opt[1],with_positions=sth;else var with_positions=1;
      var
       _xB_=with_positions?zero_pos:dummy_pos,
       _xC_=with_positions?zero_pos:dummy_pos,
       _xD_=[0],
       _xE_=1,
       _xF_=0,
       _xG_=0,
       _xH_=0,
       _xI_=0,
       _xJ_=0,
       _xK_=caml_ml_string_length(s),
       _xL_=to_bytes(s);
      return [0,
              function(lexbuf){lexbuf[9] = 1;return 0},
              _xL_,
              _xK_,
              _xJ_,
              _xI_,
              _xH_,
              _xG_,
              _xF_,
              _xE_,
              _xD_,
              _xC_,
              _xB_]}
    function set_position(lexbuf,position)
     {lexbuf[12] = [0,lexbuf[12][1],position[2],position[3],position[4]];
      lexbuf[4] = position[4];
      return 0}
    function set_filename(lexbuf,fname)
     {var _xA_=lexbuf[12];
      lexbuf[12] = [0,fname,_xA_[2],_xA_[3],_xA_[4]];
      return 0}
    function with_positions(lexbuf){return lexbuf[12] !== dummy_pos?1:0}
    function lexeme(lexbuf)
     {var len=lexbuf[6] - lexbuf[5] | 0;
      return sub_string(lexbuf[2],lexbuf[5],len)}
    function sub_lexeme(lexbuf,i1,i2)
     {var len=i2 - i1 | 0;return sub_string(lexbuf[2],i1,len)}
    function sub_lexeme_opt(lexbuf,i1,i2)
     {if(0 <= i1){var len=i2 - i1 | 0;return [0,sub_string(lexbuf[2],i1,len)]}
      return 0}
    function sub_lexeme_char(lexbuf,i){return caml_bytes_get(lexbuf[2],i)}
    function sub_lexeme_char_opt(lexbuf,i)
     {return 0 <= i?[0,caml_bytes_get(lexbuf[2],i)]:0}
    function lexeme_char(lexbuf,i)
     {return caml_bytes_get(lexbuf[2],lexbuf[5] + i | 0)}
    function lexeme_start(lexbuf){return lexbuf[11][4]}
    function lexeme_end(lexbuf){return lexbuf[12][4]}
    function lexeme_start_p(lexbuf){return lexbuf[11]}
    function lexeme_end_p(lexbuf){return lexbuf[12]}
    function new_line(lexbuf)
     {var
       lcp=lexbuf[12],
       _xy_=lcp !== dummy_pos?1:0,
       _xz_=_xy_?(lexbuf[12] = [0,lcp[1],lcp[2] + 1 | 0,lcp[4],lcp[4]],0):_xy_;
      return _xz_}
    function flush_input(lb)
     {lb[6] = 0;
      lb[4] = 0;
      var lcp=lb[12];
      if(lcp !== dummy_pos)
       lb[12] = [0,lcp[1],zero_pos[2],zero_pos[3],zero_pos[4]];
      lb[3] = 0;
      return 0}
    var
     Stdlib_Lexing=
      [0,
       dummy_pos,
       from_channel,
       from_string$0,
       from_function,
       set_position,
       set_filename,
       with_positions,
       lexeme,
       lexeme_char,
       lexeme_start,
       lexeme_end,
       lexeme_start_p,
       lexeme_end_p,
       new_line,
       flush_input,
       sub_lexeme,
       sub_lexeme_opt,
       sub_lexeme_char,
       sub_lexeme_char_opt,
       engine,
       new_engine];
    caml_register_global(799,Stdlib_Lexing,"Stdlib__Lexing");
    var
     YYexit=[248,cst_Stdlib_Parsing_YYexit,caml_fresh_oo_id(0)],
     Parse_error=[248,cst_Stdlib_Parsing_Parse_error,caml_fresh_oo_id(0)],
     env=
      [0,
       caml_make_vect(100,0),
       caml_make_vect(100,0),
       caml_make_vect(100,dummy_pos),
       caml_make_vect(100,dummy_pos),
       100,
       0,
       0,
       0,
       dummy_pos,
       dummy_pos,
       0,
       0,
       0,
       0,
       0,
       0];
    function grow_stacks(param)
     {var
       oldsize=env[5],
       newsize=oldsize * 2 | 0,
       new_s=caml_make_vect(newsize,0),
       new_v=caml_make_vect(newsize,0),
       new_start=caml_make_vect(newsize,dummy_pos),
       new_end=caml_make_vect(newsize,dummy_pos);
      blit$1(env[1],0,new_s,0,oldsize);
      env[1] = new_s;
      blit$1(env[2],0,new_v,0,oldsize);
      env[2] = new_v;
      blit$1(env[3],0,new_start,0,oldsize);
      env[3] = new_start;
      blit$1(env[4],0,new_end,0,oldsize);
      env[4] = new_end;
      env[5] = newsize;
      return 0}
    function clear_parser(param)
     {fill$0(env[2],0,env[5],0);env[8] = 0;return 0}
    var current_lookahead_fun=[0,function(param){return 0}];
    function yyparse(tables,start,lexer,lexbuf)
     {var
       init_asp=env[11],
       init_sp=env[14],
       init_stackbase=env[6],
       init_state=env[15],
       init_curr_char=env[7],
       init_lval=env[8],
       init_errflag=env[16];
      env[6] = env[14] + 1 | 0;
      env[7] = start;
      env[10] = lexbuf[12];
      try
       {var cmd=0,arg=0;
        for(;;)
         {var match=runtime.caml_parse_engine(tables,env,cmd,arg);
          switch(match)
           {case 0:
             var arg$0=caml_call1(lexer,lexbuf);
             env[9] = lexbuf[11];
             env[10] = lexbuf[12];
             var cmd=1,arg=arg$0;
             continue;
            case 1:throw Parse_error;
            case 2:grow_stacks(0);var cmd=2,arg=0;continue;
            case 3:grow_stacks(0);var cmd=3,arg=0;continue;
            case 4:
             try
              {var
                _xs_=env[13],
                _xt_=
                 caml_call1(caml_check_bound(tables[1],_xs_)[1 + _xs_],env),
                _xu_=4,
                arg$1=_xt_,
                cmd$0=_xu_}
             catch(_xx_)
              {_xx_ = caml_wrap_exception(_xx_);
               if(_xx_ !== Parse_error)throw _xx_;
               var arg$1=0,cmd$0=5,_xv_=_xx_}
             var cmd=cmd$0,arg=arg$1;
             continue;
            default:
             caml_call1(tables[14],cst_syntax_error);var cmd=5,arg=0;continue}}}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        var curr_char=env[7];
        env[11] = init_asp;
        env[14] = init_sp;
        env[6] = init_stackbase;
        env[15] = init_state;
        env[7] = init_curr_char;
        env[8] = init_lval;
        env[16] = init_errflag;
        if(exn[1] === YYexit){var v=exn[2];return v}
        current_lookahead_fun[1]
        =
        function(tok)
         {if(is_block(tok))
           {var _xw_=caml_obj_tag(tok);
            return caml_check_bound(tables[3],_xw_)[1 + _xw_] === curr_char
                    ?1
                    :0}
          return caml_check_bound(tables[2],tok)[1 + tok] === curr_char?1:0};
        throw exn}}
    function peek_val(env,n)
     {var _xr_=env[11] - n | 0;return caml_check_bound(env[2],_xr_)[1 + _xr_]}
    function symbol_start_pos(param)
     {var i=env[12];
      for(;;)
       {if(0 < i)
         {var
           _xo_=(env[11] - i | 0) + 1 | 0,
           st=caml_check_bound(env[3],_xo_)[1 + _xo_],
           _xp_=(env[11] - i | 0) + 1 | 0,
           en=caml_check_bound(env[4],_xp_)[1 + _xp_];
          if(caml_notequal(st,en))return st;
          var i$0=i - 1 | 0,i=i$0;
          continue}
        var _xq_=env[11];
        return caml_check_bound(env[4],_xq_)[1 + _xq_]}}
    function symbol_end_pos(param)
     {var _xn_=env[11];return caml_check_bound(env[4],_xn_)[1 + _xn_]}
    function rhs_start_pos(n)
     {var _xm_=env[11] - (env[12] - n | 0) | 0;
      return caml_check_bound(env[3],_xm_)[1 + _xm_]}
    function rhs_end_pos(n)
     {var _xl_=env[11] - (env[12] - n | 0) | 0;
      return caml_check_bound(env[4],_xl_)[1 + _xl_]}
    function symbol_start(param){return symbol_start_pos(0)[4]}
    function symbol_end(param){return symbol_end_pos(0)[4]}
    function rhs_start(n){return rhs_start_pos(n)[4]}
    function rhs_end(n){return rhs_end_pos(n)[4]}
    function is_current_lookahead(tok)
     {return caml_call1(current_lookahead_fun[1],tok)}
    function parse_error(param){return 0}
    var
     Stdlib_Parsing=
      [0,
       symbol_start,
       symbol_end,
       rhs_start,
       rhs_end,
       symbol_start_pos,
       symbol_end_pos,
       rhs_start_pos,
       rhs_end_pos,
       clear_parser,
       Parse_error,
       function(_xk_){return runtime.caml_set_parser_trace(_xk_)},
       YYexit,
       yyparse,
       peek_val,
       is_current_lookahead,
       parse_error];
    caml_register_global(800,Stdlib_Parsing,"Stdlib__Parsing");
    var
     Stdlib_Set=
      [0,
       function(Ord)
        {function height(param){if(param){var h=param[4];return h}return 0}
         function create(l,v,r)
          {if(l)var h=l[4],hl=h;else var hl=0;
           if(r)var h$0=r[4],hr=h$0;else var hr=0;
           var _xj_=hr <= hl?hl + 1 | 0:hr + 1 | 0;
           return [0,l,v,r,_xj_]}
         function bal(l,v,r)
          {if(l)var h=l[4],hl=h;else var hl=0;
           if(r)var h$0=r[4],hr=h$0;else var hr=0;
           if((hr + 2 | 0) < hl)
            {if(l)
              {var lr=l[3],lv=l[2],ll=l[1],_xe_=height(lr);
               if(_xe_ <= height(ll))return create(ll,lv,create(lr,v,r));
               if(lr)
                {var lrr=lr[3],lrv=lr[2],lrl=lr[1],_xf_=create(lrr,v,r);
                 return create(create(ll,lv,lrl),lrv,_xf_)}
               return invalid_arg(cst_Set_bal)}
             return invalid_arg(cst_Set_bal$0)}
           if((hl + 2 | 0) < hr)
            {if(r)
              {var rr=r[3],rv=r[2],rl=r[1],_xg_=height(rl);
               if(_xg_ <= height(rr))return create(create(l,v,rl),rv,rr);
               if(rl)
                {var rlr=rl[3],rlv=rl[2],rll=rl[1],_xh_=create(rlr,rv,rr);
                 return create(create(l,v,rll),rlv,_xh_)}
               return invalid_arg(cst_Set_bal$1)}
             return invalid_arg(cst_Set_bal$2)}
           var _xi_=hr <= hl?hl + 1 | 0:hr + 1 | 0;
           return [0,l,v,r,_xi_]}
         function add(x,t)
          {if(t)
            {var r=t[3],v=t[2],l=t[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)return t;
             if(0 <= c){var rr=add(x,r);return r === rr?t:bal(l,v,rr)}
             var ll=add(x,l);
             return l === ll?t:bal(ll,v,r)}
           return [0,0,x,0,1]}
         function singleton(x){return [0,0,x,0,1]}
         function add_min_element(x,param)
          {if(param)
            {var r=param[3],v=param[2],l=param[1];
             return bal(add_min_element(x,l),v,r)}
           return singleton(x)}
         function add_max_element(x,param)
          {if(param)
            {var r=param[3],v=param[2],l=param[1];
             return bal(l,v,add_max_element(x,r))}
           return singleton(x)}
         function join(l,v,r)
          {if(l)
            {if(r)
              {var
                rh=r[4],
                rr=r[3],
                rv=r[2],
                rl=r[1],
                lh=l[4],
                lr=l[3],
                lv=l[2],
                ll=l[1];
               return (rh + 2 | 0) < lh
                       ?bal(ll,lv,join(lr,v,r))
                       :(lh + 2 | 0) < rh?bal(join(l,v,rl),rv,rr):create(l,v,r)}
             return add_max_element(v,l)}
           return add_min_element(v,r)}
         function min_elt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var _xd_=param$0[1];
               if(_xd_){var param$0=_xd_;continue}
               var v=param$0[2];
               return v}
             throw Not_found}}
         function min_elt_opt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var _xc_=param$0[1];
               if(_xc_){var param$0=_xc_;continue}
               var v=param$0[2];
               return [0,v]}
             return 0}}
         function max_elt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {if(param$0[3]){var param$1=param$0[3],param$0=param$1;continue}
               var v=param$0[2];
               return v}
             throw Not_found}}
         function max_elt_opt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {if(param$0[3]){var param$1=param$0[3],param$0=param$1;continue}
               var v=param$0[2];
               return [0,v]}
             return 0}}
         function remove_min_elt(param)
          {if(param)
            {var _xb_=param[1];
             if(_xb_)
              {var r=param[3],v=param[2];return bal(remove_min_elt(_xb_),v,r)}
             var r$0=param[3];
             return r$0}
           return invalid_arg(cst_Set_remove_min_elt)}
         function concat(t1,t2)
          {if(t1)
            {if(t2)
              {var _xa_=remove_min_elt(t2);return join(t1,min_elt(t2),_xa_)}
             return t1}
           return t2}
         function split(x,param)
          {if(param)
            {var r=param[3],v=param[2],l=param[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)return [0,l,1,r];
             if(0 <= c)
              {var match=split(x,r),rr=match[3],pres=match[2],lr=match[1];
               return [0,join(l,v,lr),pres,rr]}
             var
              match$0=split(x,l),
              rl=match$0[3],
              pres$0=match$0[2],
              ll=match$0[1];
             return [0,ll,pres$0,join(rl,v,r)]}
           return _V_}
         var empty=0;
         function is_empty(param){return param?0:1}
         function mem(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v),
                _w$_=0 === c?1:0;
               if(_w$_)return _w$_;
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             return 0}}
         function remove(x,t)
          {if(t)
            {var r=t[3],v=t[2],l=t[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)
              {if(l)
                {if(r)
                  {var _w__=remove_min_elt(r);return bal(l,min_elt(r),_w__)}
                 return l}
               return r}
             if(0 <= c){var rr=remove(x,r);return r === rr?t:bal(l,v,rr)}
             var ll=remove(x,l);
             return l === ll?t:bal(ll,v,r)}
           return 0}
         function union(s1,s2)
          {if(s1)
            {if(s2)
              {var
                h2=s2[4],
                r2=s2[3],
                v2=s2[2],
                l2=s2[1],
                h1=s1[4],
                r1=s1[3],
                v1=s1[2],
                l1=s1[1];
               if(h2 <= h1)
                {if(1 === h2)return add(v2,s1);
                 var
                  match=split(v1,s2),
                  r2$0=match[3],
                  l2$0=match[1],
                  _w8_=union(r1,r2$0);
                 return join(union(l1,l2$0),v1,_w8_)}
               if(1 === h1)return add(v1,s2);
               var
                match$0=split(v2,s1),
                r1$0=match$0[3],
                l1$0=match$0[1],
                _w9_=union(r1$0,r2);
               return join(union(l1$0,l2),v2,_w9_)}
             return s1}
           return s2}
         function inter(s1,s2)
          {if(s1)
            {if(s2)
              {var r1=s1[3],v1=s1[2],l1=s1[1],_w4_=split(v1,s2),_w5_=_w4_[1];
               if(_w4_[2])
                {var r2=_w4_[3],_w6_=inter(r1,r2);
                 return join(inter(l1,_w5_),v1,_w6_)}
               var r2$0=_w4_[3],_w7_=inter(r1,r2$0);
               return concat(inter(l1,_w5_),_w7_)}
             return 0}
           return 0}
         function split_bis(x,param)
          {if(param)
            {var r=param[3],v=param[2],l=param[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)return 0;
             if(0 <= c)
              {var match=split_bis(x,r);
               if(match)
                {var rr=match[2],lr=match[1];return [0,join(l,v,lr),rr]}
               return 0}
             var match$0=split_bis(x,l);
             if(match$0)
              {var rl=match$0[2],ll=match$0[1];
               return [0,
                       ll,
                       function(param){return join(caml_call1(rl,0),v,r)}]}
             return 0}
           return [0,0,function(param){return 0}]}
         function disjoint(s1,s2)
          {var s1$0=s1,s2$0=s2;
           for(;;)
            {if(s1$0 && s2$0)
              {var r1=s1$0[3],v1=s1$0[2],l1=s1$0[1];
               if(s1$0 === s2$0)return 0;
               var match=split_bis(v1,s2$0);
               if(match)
                {var r2=match[2],l2=match[1],_w3_=disjoint(l1,l2);
                 if(_w3_)
                  {var s2$1=caml_call1(r2,0),s1$0=r1,s2$0=s2$1;continue}
                 return _w3_}
               return 0}
             return 1}}
         function diff(s1,s2)
          {if(s1)
            {if(s2)
              {var r1=s1[3],v1=s1[2],l1=s1[1],_wZ_=split(v1,s2),_w0_=_wZ_[1];
               if(_wZ_[2])
                {var r2=_wZ_[3],_w1_=diff(r1,r2);
                 return concat(diff(l1,_w0_),_w1_)}
               var r2$0=_wZ_[3],_w2_=diff(r1,r2$0);
               return join(diff(l1,_w0_),v1,_w2_)}
             return s1}
           return 0}
         function cons_enum(s,e)
          {var s$0=s,e$0=e;
           for(;;)
            {if(s$0)
              {var
                r=s$0[3],
                v=s$0[2],
                s$1=s$0[1],
                e$1=[0,v,r,e$0],
                s$0=s$1,
                e$0=e$1;
               continue}
             return e$0}}
         function compare(s1,s2)
          {var e2$2=cons_enum(s2,0),e1$2=cons_enum(s1,0),e1=e1$2,e2=e2$2;
           for(;;)
            {if(e1)
              {if(e2)
                {var
                  e2$0=e2[3],
                  r2=e2[2],
                  v2=e2[1],
                  e1$0=e1[3],
                  r1=e1[2],
                  v1=e1[1],
                  c=caml_call2(Ord[1],v1,v2);
                 if(0 === c)
                  {var
                    e2$1=cons_enum(r2,e2$0),
                    e1$1=cons_enum(r1,e1$0),
                    e1=e1$1,
                    e2=e2$1;
                   continue}
                 return c}
               return 1}
             return e2?-1:0}}
         function equal(s1,s2){return 0 === compare(s1,s2)?1:0}
         function subset(s1,s2)
          {var s1$0=s1,s2$0=s2;
           for(;;)
            {if(s1$0)
              {if(s2$0)
                {var
                  r2=s2$0[3],
                  v2=s2$0[2],
                  l2=s2$0[1],
                  r1=s1$0[3],
                  v1=s1$0[2],
                  l1=s1$0[1],
                  c=caml_call2(Ord[1],v1,v2);
                 if(0 === c)
                  {var _wW_=subset(l1,l2);
                   if(_wW_){var s1$0=r1,s2$0=r2;continue}
                   return _wW_}
                 if(0 <= c)
                  {var _wX_=subset([0,0,v1,r1,0],r2);
                   if(_wX_){var s1$0=l1;continue}
                   return _wX_}
                 var _wY_=subset([0,l1,v1,0,0],l2);
                 if(_wY_){var s1$0=r1;continue}
                 return _wY_}
               return 0}
             return 1}}
         function iter(f,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var r=param$0[3],v=param$0[2],l=param$0[1];
               iter(f,l);
               caml_call1(f,v);
               var param$0=r;
               continue}
             return 0}}
         function fold(f,s,accu)
          {var s$0=s,accu$0=accu;
           for(;;)
            {if(s$0)
              {var
                r=s$0[3],
                v=s$0[2],
                l=s$0[1],
                accu$1=caml_call2(f,v,fold(f,l,accu$0)),
                s$0=r,
                accu$0=accu$1;
               continue}
             return accu$0}}
         function for_all(p,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                _wT_=caml_call1(p,v);
               if(_wT_)
                {var _wU_=for_all(p,l);
                 if(_wU_){var param$0=r;continue}
                 var _wV_=_wU_}
               else
                var _wV_=_wT_;
               return _wV_}
             return 1}}
         function exists(p,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                _wQ_=caml_call1(p,v);
               if(_wQ_)
                var _wR_=_wQ_;
               else
                {var _wS_=exists(p,l);
                 if(! _wS_){var param$0=r;continue}
                 var _wR_=_wS_}
               return _wR_}
             return 0}}
         function filter(p,t)
          {if(t)
            {var
              r=t[3],
              v=t[2],
              l=t[1],
              l$0=filter(p,l),
              pv=caml_call1(p,v),
              r$0=filter(p,r);
             if(pv){if(l === l$0 && r === r$0)return t;return join(l$0,v,r$0)}
             return concat(l$0,r$0)}
           return 0}
         function partition(p,param)
          {if(param)
            {var
              r=param[3],
              v=param[2],
              l=param[1],
              match=partition(p,l),
              lf=match[2],
              lt=match[1],
              pv=caml_call1(p,v),
              match$0=partition(p,r),
              rf=match$0[2],
              rt=match$0[1];
             if(pv){var _wO_=concat(lf,rf);return [0,join(lt,v,rt),_wO_]}
             var _wP_=join(lf,v,rf);
             return [0,concat(lt,rt),_wP_]}
           return _W_}
         function cardinal(param)
          {if(param)
            {var r=param[3],l=param[1],_wN_=cardinal(r);
             return (cardinal(l) + 1 | 0) + _wN_ | 0}
           return 0}
         function elements_aux(accu,param)
          {var accu$0=accu,param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                accu$1=[0,v,elements_aux(accu$0,r)],
                accu$0=accu$1,
                param$0=l;
               continue}
             return accu$0}}
         function elements(s){return elements_aux(0,s)}
         function find(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v);
               if(0 === c)return v;
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             throw Not_found}}
         function find_first(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var r$0=param$1[3],v$0=param$1[2],l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,param=l$0;
                 for(;;)
                  {if(param)
                    {var r=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,param=l;continue}
                     var param=r;
                     continue}
                   return v0}}
               var param$1=r$0;
               continue}
             throw Not_found}}
         function find_first_opt(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var r$0=param$1[3],v$0=param$1[2],l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,param=l$0;
                 for(;;)
                  {if(param)
                    {var r=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,param=l;continue}
                     var param=r;
                     continue}
                   return [0,v0]}}
               var param$1=r$0;
               continue}
             return 0}}
         function find_last(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var r$0=param$1[3],v$0=param$1[2],l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,param=r$0;
                 for(;;)
                  {if(param)
                    {var r=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,param=r;continue}
                     var param=l;
                     continue}
                   return v0}}
               var param$1=l$0;
               continue}
             throw Not_found}}
         function find_last_opt(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var r$0=param$1[3],v$0=param$1[2],l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,param=r$0;
                 for(;;)
                  {if(param)
                    {var r=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,param=r;continue}
                     var param=l;
                     continue}
                   return [0,v0]}}
               var param$1=l$0;
               continue}
             return 0}}
         function find_opt(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[3],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v);
               if(0 === c)return [0,v];
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             return 0}}
         function try_join(l,v,r)
          {var switch$0=0;
           if(0 !== l)
            {var _wM_=max_elt(l);
             if(0 <= caml_call2(Ord[1],_wM_,v))switch$0 = 1}
           if(! switch$0)
            {var switch$1=0;
             if(0 !== r)
              {var _wL_=min_elt(r);
               if(0 <= caml_call2(Ord[1],v,_wL_))switch$1 = 1}
             if(! switch$1)return join(l,v,r)}
           return union(l,add(v,r))}
         function map(f,t)
          {if(t)
            {var
              r=t[3],
              v=t[2],
              l=t[1],
              l$0=map(f,l),
              v$0=caml_call1(f,v),
              r$0=map(f,r);
             if(l === l$0 && v === v$0 && r === r$0)return t;
             return try_join(l$0,v$0,r$0)}
           return 0}
         function filter_map(f,t)
          {if(t)
            {var
              r=t[3],
              v=t[2],
              l=t[1],
              t1=filter_map(f,l),
              v$0=caml_call1(f,v),
              t2=filter_map(f,r);
             if(v$0)
              {var v$1=v$0[1];
               if(l === t1 && v === v$1 && r === t2)return t;
               return try_join(t1,v$1,t2)}
             if(t1)
              {if(t2)
                {var _wK_=remove_min_elt(t2);
                 return try_join(t1,min_elt(t2),_wK_)}
               return t1}
             return t2}
           return 0}
         function of_list(l)
          {if(l)
            {var _wz_=l[2],_wA_=l[1];
             if(_wz_)
              {var _wB_=_wz_[2],_wC_=_wz_[1];
               if(_wB_)
                {var _wD_=_wB_[2],_wE_=_wB_[1];
                 if(_wD_)
                  {var _wF_=_wD_[2],_wG_=_wD_[1];
                   if(_wF_)
                    {if(_wF_[2])
                      {var
                        l$0=sort_uniq(Ord[1],l),
                        sub=
                         function(n,l)
                          {if(! (3 < n >>> 0))
                            switch(n)
                             {case 0:return [0,0,l];
                              case 1:
                               if(l){var l$3=l[2],x0=l[1];return [0,[0,0,x0,0,1],l$3]}
                               break;
                              case 2:
                               if(l)
                                {var _wH_=l[2];
                                 if(_wH_)
                                  {var l$4=_wH_[2],x1=_wH_[1],x0$0=l[1];
                                   return [0,[0,[0,0,x0$0,0,1],x1,0,2],l$4]}}
                               break;
                              default:
                               if(l)
                                {var _wI_=l[2];
                                 if(_wI_)
                                  {var _wJ_=_wI_[2];
                                   if(_wJ_)
                                    {var l$5=_wJ_[2],x2=_wJ_[1],x1$0=_wI_[1],x0$1=l[1];
                                     return [0,[0,[0,0,x0$1,0,1],x1$0,[0,0,x2,0,1],2],l$5]}}}}
                           var nl=n / 2 | 0,match=sub(nl,l),l$0=match[2],left=match[1];
                           if(l$0)
                            {var
                              l$1=l$0[2],
                              mid=l$0[1],
                              match$0=sub((n - nl | 0) - 1 | 0,l$1),
                              l$2=match$0[2],
                              right=match$0[1];
                             return [0,create(left,mid,right),l$2]}
                           throw [0,Assert_failure,_X_]};
                       return sub(length$1(l$0),l$0)[1]}
                     var x4=_wF_[1];
                     return add(x4,add(_wG_,add(_wE_,add(_wC_,singleton(_wA_)))))}
                   return add(_wG_,add(_wE_,add(_wC_,singleton(_wA_))))}
                 return add(_wE_,add(_wC_,singleton(_wA_)))}
               return add(_wC_,singleton(_wA_))}
             return singleton(_wA_)}
           return empty}
         function add_seq(i,m)
          {return fold_left(function(s,x){return add(x,s)},m,i)}
         function of_seq(i){return add_seq(i,empty)}
         function seq_of_enum(c,param)
          {if(c)
            {var rest=c[3],t=c[2],x=c[1],_wx_=cons_enum(t,rest);
             return [0,x,function(_wy_){return seq_of_enum(_wx_,_wy_)}]}
           return 0}
         function to_seq(c)
          {var _wv_=cons_enum(c,0);
           return function(_ww_){return seq_of_enum(_wv_,_ww_)}}
         function snoc_enum(s,e)
          {var s$0=s,e$0=e;
           for(;;)
            {if(s$0)
              {var
                s$1=s$0[3],
                v=s$0[2],
                l=s$0[1],
                e$1=[0,v,l,e$0],
                s$0=s$1,
                e$0=e$1;
               continue}
             return e$0}}
         function rev_seq_of_enum(c,param)
          {if(c)
            {var rest=c[3],t=c[2],x=c[1],_wt_=snoc_enum(t,rest);
             return [0,x,function(_wu_){return rev_seq_of_enum(_wt_,_wu_)}]}
           return 0}
         function to_rev_seq(c)
          {var _wr_=snoc_enum(c,0);
           return function(_ws_){return rev_seq_of_enum(_wr_,_ws_)}}
         function to_seq_from(low,s)
          {var s$0=s,c=0;
           for(;;)
            {if(s$0)
              {var r=s$0[3],v=s$0[2],l=s$0[1],n=caml_call2(Ord[1],v,low);
               if(0 !== n)
                {if(0 <= n){var c$0=[0,v,r,c],s$0=l,c=c$0;continue}
                 var s$0=r;
                 continue}
               var _wp_=[0,v,r,c]}
             else
              var _wp_=c;
             return function(_wq_){return seq_of_enum(_wp_,_wq_)}}}
         return [0,
                 empty,
                 is_empty,
                 mem,
                 add,
                 singleton,
                 remove,
                 union,
                 inter,
                 disjoint,
                 diff,
                 compare,
                 equal,
                 subset,
                 iter,
                 map,
                 fold,
                 for_all,
                 exists,
                 filter,
                 filter_map,
                 partition,
                 cardinal,
                 elements,
                 min_elt,
                 min_elt_opt,
                 max_elt,
                 max_elt_opt,
                 min_elt,
                 min_elt_opt,
                 split,
                 find,
                 find_opt,
                 find_first,
                 find_first_opt,
                 find_last,
                 find_last_opt,
                 of_list,
                 to_seq_from,
                 to_seq,
                 to_rev_seq,
                 add_seq,
                 of_seq]}];
    caml_register_global(801,Stdlib_Set,"Stdlib__Set");
    var
     Stdlib_Map=
      [0,
       function(Ord)
        {function height(param){if(param){var h=param[5];return h}return 0}
         function create(l,x,d,r)
          {var hl=height(l),hr=height(r),_wo_=hr <= hl?hl + 1 | 0:hr + 1 | 0;
           return [0,l,x,d,r,_wo_]}
         function singleton(x,d){return [0,0,x,d,0,1]}
         function bal(l,x,d,r)
          {if(l)var h=l[5],hl=h;else var hl=0;
           if(r)var h$0=r[5],hr=h$0;else var hr=0;
           if((hr + 2 | 0) < hl)
            {if(l)
              {var lr=l[4],ld=l[3],lv=l[2],ll=l[1],_wj_=height(lr);
               if(_wj_ <= height(ll))return create(ll,lv,ld,create(lr,x,d,r));
               if(lr)
                {var
                  lrr=lr[4],
                  lrd=lr[3],
                  lrv=lr[2],
                  lrl=lr[1],
                  _wk_=create(lrr,x,d,r);
                 return create(create(ll,lv,ld,lrl),lrv,lrd,_wk_)}
               return invalid_arg(cst_Map_bal)}
             return invalid_arg(cst_Map_bal$0)}
           if((hl + 2 | 0) < hr)
            {if(r)
              {var rr=r[4],rd=r[3],rv=r[2],rl=r[1],_wl_=height(rl);
               if(_wl_ <= height(rr))return create(create(l,x,d,rl),rv,rd,rr);
               if(rl)
                {var
                  rlr=rl[4],
                  rld=rl[3],
                  rlv=rl[2],
                  rll=rl[1],
                  _wm_=create(rlr,rv,rd,rr);
                 return create(create(l,x,d,rll),rlv,rld,_wm_)}
               return invalid_arg(cst_Map_bal$1)}
             return invalid_arg(cst_Map_bal$2)}
           var _wn_=hr <= hl?hl + 1 | 0:hr + 1 | 0;
           return [0,l,x,d,r,_wn_]}
         var empty=0;
         function is_empty(param){return param?0:1}
         function add(x,data,m)
          {if(m)
            {var h=m[5],r=m[4],d=m[3],v=m[2],l=m[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)return d === data?m:[0,l,x,data,r,h];
             if(0 <= c){var rr=add(x,data,r);return r === rr?m:bal(l,v,d,rr)}
             var ll=add(x,data,l);
             return l === ll?m:bal(ll,v,d,r)}
           return [0,0,x,data,0,1]}
         function find(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                d=param$0[3],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v);
               if(0 === c)return d;
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             throw Not_found}}
         function find_first(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var
                r$0=param$1[4],
                d$0=param$1[3],
                v$0=param$1[2],
                l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,d0=d$0,param=l$0;
                 for(;;)
                  {if(param)
                    {var r=param[4],d=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,d0=d,param=l;continue}
                     var param=r;
                     continue}
                   return [0,v0,d0]}}
               var param$1=r$0;
               continue}
             throw Not_found}}
         function find_first_opt(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var
                r$0=param$1[4],
                d$0=param$1[3],
                v$0=param$1[2],
                l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,d0=d$0,param=l$0;
                 for(;;)
                  {if(param)
                    {var r=param[4],d=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,d0=d,param=l;continue}
                     var param=r;
                     continue}
                   return [0,[0,v0,d0]]}}
               var param$1=r$0;
               continue}
             return 0}}
         function find_last(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var
                r$0=param$1[4],
                d$0=param$1[3],
                v$0=param$1[2],
                l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,d0=d$0,param=r$0;
                 for(;;)
                  {if(param)
                    {var r=param[4],d=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,d0=d,param=r;continue}
                     var param=l;
                     continue}
                   return [0,v0,d0]}}
               var param$1=l$0;
               continue}
             throw Not_found}}
         function find_last_opt(f,param$0)
          {var param$1=param$0;
           for(;;)
            {if(param$1)
              {var
                r$0=param$1[4],
                d$0=param$1[3],
                v$0=param$1[2],
                l$0=param$1[1];
               if(caml_call1(f,v$0))
                {var v0=v$0,d0=d$0,param=r$0;
                 for(;;)
                  {if(param)
                    {var r=param[4],d=param[3],v=param[2],l=param[1];
                     if(caml_call1(f,v)){var v0=v,d0=d,param=r;continue}
                     var param=l;
                     continue}
                   return [0,[0,v0,d0]]}}
               var param$1=l$0;
               continue}
             return 0}}
         function find_opt(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                d=param$0[3],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v);
               if(0 === c)return [0,d];
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             return 0}}
         function mem(x,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                v=param$0[2],
                l=param$0[1],
                c=caml_call2(Ord[1],x,v),
                _wi_=0 === c?1:0;
               if(_wi_)return _wi_;
               var param$1=0 <= c?r:l,param$0=param$1;
               continue}
             return 0}}
         function min_binding(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var _wh_=param$0[1];
               if(_wh_){var param$0=_wh_;continue}
               var d=param$0[3],v=param$0[2];
               return [0,v,d]}
             throw Not_found}}
         function min_binding_opt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var _wg_=param$0[1];
               if(_wg_){var param$0=_wg_;continue}
               var d=param$0[3],v=param$0[2];
               return [0,[0,v,d]]}
             return 0}}
         function max_binding(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {if(param$0[4]){var param$1=param$0[4],param$0=param$1;continue}
               var d=param$0[3],v=param$0[2];
               return [0,v,d]}
             throw Not_found}}
         function max_binding_opt(param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {if(param$0[4]){var param$1=param$0[4],param$0=param$1;continue}
               var d=param$0[3],v=param$0[2];
               return [0,[0,v,d]]}
             return 0}}
         function remove_min_binding(param)
          {if(param)
            {var _wf_=param[1];
             if(_wf_)
              {var r=param[4],d=param[3],v=param[2];
               return bal(remove_min_binding(_wf_),v,d,r)}
             var r$0=param[4];
             return r$0}
           return invalid_arg(cst_Map_remove_min_elt)}
         function _vQ_(t1,t2)
          {if(t1)
            {if(t2)
              {var match=min_binding(t2),d=match[2],x=match[1];
               return bal(t1,x,d,remove_min_binding(t2))}
             return t1}
           return t2}
         function remove(x,m)
          {if(m)
            {var r=m[4],d=m[3],v=m[2],l=m[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)return _vQ_(l,r);
             if(0 <= c){var rr=remove(x,r);return r === rr?m:bal(l,v,d,rr)}
             var ll=remove(x,l);
             return l === ll?m:bal(ll,v,d,r)}
           return 0}
         function update(x,f,m)
          {if(m)
            {var h=m[5],r=m[4],d=m[3],v=m[2],l=m[1],c=caml_call2(Ord[1],x,v);
             if(0 === c)
              {var match=caml_call1(f,[0,d]);
               if(match)
                {var data=match[1];return d === data?m:[0,l,x,data,r,h]}
               return _vQ_(l,r)}
             if(0 <= c){var rr=update(x,f,r);return r === rr?m:bal(l,v,d,rr)}
             var ll=update(x,f,l);
             return l === ll?m:bal(ll,v,d,r)}
           var match$0=caml_call1(f,0);
           if(match$0){var data$0=match$0[1];return [0,0,x,data$0,0,1]}
           return 0}
         function iter(f,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var r=param$0[4],d=param$0[3],v=param$0[2],l=param$0[1];
               iter(f,l);
               caml_call2(f,v,d);
               var param$0=r;
               continue}
             return 0}}
         function map(f,param)
          {if(param)
            {var
              h=param[5],
              r=param[4],
              d=param[3],
              v=param[2],
              l=param[1],
              l$0=map(f,l),
              d$0=caml_call1(f,d),
              r$0=map(f,r);
             return [0,l$0,v,d$0,r$0,h]}
           return 0}
         function mapi(f,param)
          {if(param)
            {var
              h=param[5],
              r=param[4],
              d=param[3],
              v=param[2],
              l=param[1],
              l$0=mapi(f,l),
              d$0=caml_call2(f,v,d),
              r$0=mapi(f,r);
             return [0,l$0,v,d$0,r$0,h]}
           return 0}
         function fold(f,m,accu)
          {var m$0=m,accu$0=accu;
           for(;;)
            {if(m$0)
              {var
                r=m$0[4],
                d=m$0[3],
                v=m$0[2],
                l=m$0[1],
                accu$1=caml_call3(f,v,d,fold(f,l,accu$0)),
                m$0=r,
                accu$0=accu$1;
               continue}
             return accu$0}}
         function for_all(p,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                d=param$0[3],
                v=param$0[2],
                l=param$0[1],
                _wc_=caml_call2(p,v,d);
               if(_wc_)
                {var _wd_=for_all(p,l);
                 if(_wd_){var param$0=r;continue}
                 var _we_=_wd_}
               else
                var _we_=_wc_;
               return _we_}
             return 1}}
         function exists(p,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                d=param$0[3],
                v=param$0[2],
                l=param$0[1],
                _v$_=caml_call2(p,v,d);
               if(_v$_)
                var _wa_=_v$_;
               else
                {var _wb_=exists(p,l);
                 if(! _wb_){var param$0=r;continue}
                 var _wa_=_wb_}
               return _wa_}
             return 0}}
         function add_min_binding(k,x,param)
          {if(param)
            {var r=param[4],d=param[3],v=param[2],l=param[1];
             return bal(add_min_binding(k,x,l),v,d,r)}
           return singleton(k,x)}
         function add_max_binding(k,x,param)
          {if(param)
            {var r=param[4],d=param[3],v=param[2],l=param[1];
             return bal(l,v,d,add_max_binding(k,x,r))}
           return singleton(k,x)}
         function join(l,v,d,r)
          {if(l)
            {if(r)
              {var
                rh=r[5],
                rr=r[4],
                rd=r[3],
                rv=r[2],
                rl=r[1],
                lh=l[5],
                lr=l[4],
                ld=l[3],
                lv=l[2],
                ll=l[1];
               return (rh + 2 | 0) < lh
                       ?bal(ll,lv,ld,join(lr,v,d,r))
                       :(lh + 2 | 0) < rh
                         ?bal(join(l,v,d,rl),rv,rd,rr)
                         :create(l,v,d,r)}
             return add_max_binding(v,d,l)}
           return add_min_binding(v,d,r)}
         function concat(t1,t2)
          {if(t1)
            {if(t2)
              {var match=min_binding(t2),d=match[2],x=match[1];
               return join(t1,x,d,remove_min_binding(t2))}
             return t1}
           return t2}
         function concat_or_join(t1,v,d,t2)
          {if(d){var d$0=d[1];return join(t1,v,d$0,t2)}return concat(t1,t2)}
         function split(x,param)
          {if(param)
            {var
              r=param[4],
              d=param[3],
              v=param[2],
              l=param[1],
              c=caml_call2(Ord[1],x,v);
             if(0 === c)return [0,l,[0,d],r];
             if(0 <= c)
              {var match=split(x,r),rr=match[3],pres=match[2],lr=match[1];
               return [0,join(l,v,d,lr),pres,rr]}
             var
              match$0=split(x,l),
              rl=match$0[3],
              pres$0=match$0[2],
              ll=match$0[1];
             return [0,ll,pres$0,join(rl,v,d,r)]}
           return _Y_}
         function merge(f,s1,s2)
          {if(s1)
            {var h1=s1[5],r1=s1[4],d1=s1[3],v1=s1[2],l1=s1[1];
             if(height(s2) <= h1)
              {var
                match=split(v1,s2),
                r2=match[3],
                d2=match[2],
                l2=match[1],
                _v7_=merge(f,r1,r2),
                _v8_=caml_call3(f,v1,[0,d1],d2);
               return concat_or_join(merge(f,l1,l2),v1,_v8_,_v7_)}}
           else
            if(! s2)return 0;
           if(s2)
            {var
              r2$0=s2[4],
              d2$0=s2[3],
              v2=s2[2],
              l2$0=s2[1],
              match$0=split(v2,s1),
              r1$0=match$0[3],
              d1$0=match$0[2],
              l1$0=match$0[1],
              _v9_=merge(f,r1$0,r2$0),
              _v__=caml_call3(f,v2,d1$0,[0,d2$0]);
             return concat_or_join(merge(f,l1$0,l2$0),v2,_v__,_v9_)}
           throw [0,Assert_failure,_Z_]}
         function union(f,s1,s2)
          {if(s1)
            {if(s2)
              {var
                h2=s2[5],
                r2=s2[4],
                d2=s2[3],
                v2=s2[2],
                l2=s2[1],
                h1=s1[5],
                r1=s1[4],
                d1=s1[3],
                v1=s1[2],
                l1=s1[1];
               if(h2 <= h1)
                {var
                  match=split(v1,s2),
                  r2$0=match[3],
                  d2$0=match[2],
                  l2$0=match[1],
                  l=union(f,l1,l2$0),
                  r=union(f,r1,r2$0);
                 if(d2$0)
                  {var d2$1=d2$0[1];
                   return concat_or_join(l,v1,caml_call3(f,v1,d1,d2$1),r)}
                 return join(l,v1,d1,r)}
               var
                match$0=split(v2,s1),
                r1$0=match$0[3],
                d1$0=match$0[2],
                l1$0=match$0[1],
                l$0=union(f,l1$0,l2),
                r$0=union(f,r1$0,r2);
               if(d1$0)
                {var d1$1=d1$0[1];
                 return concat_or_join(l$0,v2,caml_call3(f,v2,d1$1,d2),r$0)}
               return join(l$0,v2,d2,r$0)}
             var s=s1}
           else
            var s=s2;
           return s}
         function filter(p,m)
          {if(m)
            {var
              r=m[4],
              d=m[3],
              v=m[2],
              l=m[1],
              l$0=filter(p,l),
              pvd=caml_call2(p,v,d),
              r$0=filter(p,r);
             if(pvd)
              {if(l === l$0 && r === r$0)return m;return join(l$0,v,d,r$0)}
             return concat(l$0,r$0)}
           return 0}
         function filter_map(f,param)
          {if(param)
            {var
              r=param[4],
              d=param[3],
              v=param[2],
              l=param[1],
              l$0=filter_map(f,l),
              fvd=caml_call2(f,v,d),
              r$0=filter_map(f,r);
             if(fvd){var d$0=fvd[1];return join(l$0,v,d$0,r$0)}
             return concat(l$0,r$0)}
           return 0}
         function partition(p,param)
          {if(param)
            {var
              r=param[4],
              d=param[3],
              v=param[2],
              l=param[1],
              match=partition(p,l),
              lf=match[2],
              lt=match[1],
              pvd=caml_call2(p,v,d),
              match$0=partition(p,r),
              rf=match$0[2],
              rt=match$0[1];
             if(pvd){var _v5_=concat(lf,rf);return [0,join(lt,v,d,rt),_v5_]}
             var _v6_=join(lf,v,d,rf);
             return [0,concat(lt,rt),_v6_]}
           return ___}
         function cons_enum(m,e)
          {var m$0=m,e$0=e;
           for(;;)
            {if(m$0)
              {var
                r=m$0[4],
                d=m$0[3],
                v=m$0[2],
                m$1=m$0[1],
                e$1=[0,v,d,r,e$0],
                m$0=m$1,
                e$0=e$1;
               continue}
             return e$0}}
         function compare(cmp,m1,m2)
          {var e2$2=cons_enum(m2,0),e1$2=cons_enum(m1,0),e1=e1$2,e2=e2$2;
           for(;;)
            {if(e1)
              {if(e2)
                {var
                  e2$0=e2[4],
                  r2=e2[3],
                  d2=e2[2],
                  v2=e2[1],
                  e1$0=e1[4],
                  r1=e1[3],
                  d1=e1[2],
                  v1=e1[1],
                  c=caml_call2(Ord[1],v1,v2);
                 if(0 === c)
                  {var c$0=caml_call2(cmp,d1,d2);
                   if(0 === c$0)
                    {var
                      e2$1=cons_enum(r2,e2$0),
                      e1$1=cons_enum(r1,e1$0),
                      e1=e1$1,
                      e2=e2$1;
                     continue}
                   return c$0}
                 return c}
               return 1}
             return e2?-1:0}}
         function equal(cmp,m1,m2)
          {var e2$2=cons_enum(m2,0),e1$2=cons_enum(m1,0),e1=e1$2,e2=e2$2;
           for(;;)
            {if(e1)
              {if(e2)
                {var
                  e2$0=e2[4],
                  r2=e2[3],
                  d2=e2[2],
                  v2=e2[1],
                  e1$0=e1[4],
                  r1=e1[3],
                  d1=e1[2],
                  v1=e1[1],
                  _v2_=0 === caml_call2(Ord[1],v1,v2)?1:0;
                 if(_v2_)
                  {var _v3_=caml_call2(cmp,d1,d2);
                   if(_v3_)
                    {var
                      e2$1=cons_enum(r2,e2$0),
                      e1$1=cons_enum(r1,e1$0),
                      e1=e1$1,
                      e2=e2$1;
                     continue}
                   var _v4_=_v3_}
                 else
                  var _v4_=_v2_;
                 return _v4_}
               return 0}
             return e2?0:1}}
         function cardinal(param)
          {if(param)
            {var r=param[4],l=param[1],_v1_=cardinal(r);
             return (cardinal(l) + 1 | 0) + _v1_ | 0}
           return 0}
         function bindings_aux(accu,param)
          {var accu$0=accu,param$0=param;
           for(;;)
            {if(param$0)
              {var
                r=param$0[4],
                d=param$0[3],
                v=param$0[2],
                l=param$0[1],
                accu$1=[0,[0,v,d],bindings_aux(accu$0,r)],
                accu$0=accu$1,
                param$0=l;
               continue}
             return accu$0}}
         function bindings(s){return bindings_aux(0,s)}
         function add_seq(i,m)
          {return fold_left
                   (function(m,param)
                     {var v=param[2],k=param[1];return add(k,v,m)},
                    m,
                    i)}
         function of_seq(i){return add_seq(i,empty)}
         function seq_of_enum(c,param)
          {if(c)
            {var rest=c[4],t=c[3],v=c[2],k=c[1],_vZ_=cons_enum(t,rest);
             return [0,[0,k,v],function(_v0_){return seq_of_enum(_vZ_,_v0_)}]}
           return 0}
         function to_seq(m)
          {var _vX_=cons_enum(m,0);
           return function(_vY_){return seq_of_enum(_vX_,_vY_)}}
         function snoc_enum(s,e)
          {var s$0=s,e$0=e;
           for(;;)
            {if(s$0)
              {var
                s$1=s$0[4],
                d=s$0[3],
                v=s$0[2],
                l=s$0[1],
                e$1=[0,v,d,l,e$0],
                s$0=s$1,
                e$0=e$1;
               continue}
             return e$0}}
         function rev_seq_of_enum(c,param)
          {if(c)
            {var rest=c[4],t=c[3],v=c[2],k=c[1],_vV_=snoc_enum(t,rest);
             return [0,
                     [0,k,v],
                     function(_vW_){return rev_seq_of_enum(_vV_,_vW_)}]}
           return 0}
         function to_rev_seq(c)
          {var _vT_=snoc_enum(c,0);
           return function(_vU_){return rev_seq_of_enum(_vT_,_vU_)}}
         function to_seq_from(low,m)
          {var m$0=m,c=0;
           for(;;)
            {if(m$0)
              {var
                r=m$0[4],
                d=m$0[3],
                v=m$0[2],
                l=m$0[1],
                n=caml_call2(Ord[1],v,low);
               if(0 !== n)
                {if(0 <= n){var c$0=[0,v,d,r,c],m$0=l,c=c$0;continue}
                 var m$0=r;
                 continue}
               var _vR_=[0,v,d,r,c]}
             else
              var _vR_=c;
             return function(_vS_){return seq_of_enum(_vR_,_vS_)}}}
         return [0,
                 empty,
                 is_empty,
                 mem,
                 add,
                 update,
                 singleton,
                 remove,
                 merge,
                 union,
                 compare,
                 equal,
                 iter,
                 fold,
                 for_all,
                 exists,
                 filter,
                 filter_map,
                 partition,
                 cardinal,
                 bindings,
                 min_binding,
                 min_binding_opt,
                 max_binding,
                 max_binding_opt,
                 min_binding,
                 min_binding_opt,
                 split,
                 find,
                 find_opt,
                 find_first,
                 find_first_opt,
                 find_last,
                 find_last_opt,
                 map,
                 mapi,
                 to_seq,
                 to_rev_seq,
                 to_seq_from,
                 add_seq,
                 of_seq]}];
    caml_register_global(802,Stdlib_Map,"Stdlib__Map");
    var Empty=[248,cst_Stdlib_Stack_Empty,caml_fresh_oo_id(0)];
    function create$0(param){return [0,0,0]}
    function clear(s){s[1] = 0;s[2] = 0;return 0}
    function copy$3(s){return [0,s[1],s[2]]}
    function push(x,s){s[1] = [0,x,s[1]];s[2] = s[2] + 1 | 0;return 0}
    function pop(s)
     {var _vP_=s[1];
      if(_vP_)
       {var tl=_vP_[2],hd=_vP_[1];s[1] = tl;s[2] = s[2] - 1 | 0;return hd}
      throw Empty}
    function pop_opt(s)
     {var _vO_=s[1];
      if(_vO_)
       {var tl=_vO_[2],hd=_vO_[1];s[1] = tl;s[2] = s[2] - 1 | 0;return [0,hd]}
      return 0}
    function top(s)
     {var _vN_=s[1];if(_vN_){var hd=_vN_[1];return hd}throw Empty}
    function top_opt(s)
     {var _vM_=s[1];if(_vM_){var hd=_vM_[1];return [0,hd]}return 0}
    function is_empty$0(s){return 0 === s[1]?1:0}
    function length$2(s){return s[2]}
    function iter$7(f,s){return iter$2(f,s[1])}
    function fold$2(f,acc,s){return fold_left$0(f,acc,s[1])}
    function to_seq$6(s){return to_seq$1(s[1])}
    function add_seq(q,i){return iter(function(x){return push(x,q)},i)}
    function of_seq$4(g){var s=create$0(0);add_seq(s,g);return s}
    var
     Stdlib_Stack=
      [0,
       Empty,
       create$0,
       push,
       pop,
       pop_opt,
       top,
       top_opt,
       clear,
       copy$3,
       is_empty$0,
       length$2,
       iter$7,
       fold$2,
       to_seq$6,
       add_seq,
       of_seq$4];
    caml_register_global(803,Stdlib_Stack,"Stdlib__Stack");
    var Empty$0=[248,cst_Stdlib_Queue_Empty,caml_fresh_oo_id(0)];
    function create$1(param){return [0,0,0,0]}
    function clear$0(q){q[1] = 0;q[2] = 0;q[3] = 0;return 0}
    function add(x,q)
     {var cell=[0,x,0],_vL_=q[3];
      return _vL_
              ?(q[1] = q[1] + 1 | 0,_vL_[2] = cell,q[3] = cell,0)
              :(q[1] = 1,q[2] = cell,q[3] = cell,0)}
    function peek(q)
     {var _vK_=q[2];if(_vK_){var content=_vK_[1];return content}throw Empty$0}
    function peek_opt(q)
     {var _vJ_=q[2];if(_vJ_){var content=_vJ_[1];return [0,content]}return 0}
    function take$0(q)
     {var _vH_=q[2];
      if(_vH_)
       {var _vI_=_vH_[1];
        if(_vH_[2])
         {var next=_vH_[2];q[1] = q[1] - 1 | 0;q[2] = next;return _vI_}
        clear$0(q);
        return _vI_}
      throw Empty$0}
    function take_opt(q)
     {var _vF_=q[2];
      if(_vF_)
       {var _vG_=_vF_[1];
        if(_vF_[2])
         {var next=_vF_[2];q[1] = q[1] - 1 | 0;q[2] = next;return [0,_vG_]}
        clear$0(q);
        return [0,_vG_]}
      return 0}
    function copy$4(q)
     {var q_res=[0,q[1],0,0],prev=0,cell=q[2];
      for(;;)
       {if(cell)
         {var content=cell[1],next=cell[2],res=[0,content,0];
          if(prev)prev[2] = res;else q_res[2] = res;
          var prev=res,cell=next;
          continue}
        q_res[3] = prev;
        return q_res}}
    function is_empty$1(q){return 0 === q[1]?1:0}
    function length$3(q){return q[1]}
    function iter$8(f,q)
     {var cell=q[2];
      for(;;)
       {if(cell)
         {var content=cell[1],next=cell[2];
          caml_call1(f,content);
          var cell=next;
          continue}
        return 0}}
    function fold$3(f,accu$1,q)
     {var accu=accu$1,cell=q[2];
      for(;;)
       {if(cell)
         {var
           content=cell[1],
           next=cell[2],
           accu$0=caml_call2(f,accu,content),
           accu=accu$0,
           cell=next;
          continue}
        return accu}}
    function transfer(q1,q2)
     {var _vD_=0 < q1[1]?1:0;
      if(_vD_)
       {var _vE_=q2[3];
        return _vE_
                ?(q2[1]
                  =
                  q2[1]
                  +
                  q1[1]
                  |
                  0,
                  _vE_[2]
                  =
                  q1[2],
                  q2[3]
                  =
                  q1[3],
                  clear$0(q1))
                :(q2[1] = q1[1],q2[2] = q1[2],q2[3] = q1[3],clear$0(q1))}
      return _vD_}
    function to_seq$7(q)
     {function aux(c,param)
       {if(c)
         {var x=c[1],next=c[2];
          return [0,x,function(_vC_){return aux(next,_vC_)}]}
        return 0}
      var _vA_=q[2];
      return function(_vB_){return aux(_vA_,_vB_)}}
    function add_seq$0(q,i){return iter(function(x){return add(x,q)},i)}
    function of_seq$5(g){var q=create$1(0);add_seq$0(q,g);return q}
    var
     Stdlib_Queue=
      [0,
       Empty$0,
       create$1,
       add,
       add,
       take$0,
       take_opt,
       take$0,
       peek,
       peek_opt,
       peek,
       clear$0,
       copy$4,
       is_empty$1,
       length$3,
       iter$8,
       fold$3,
       transfer,
       to_seq$7,
       add_seq$0,
       of_seq$5];
    caml_register_global(804,Stdlib_Queue,"Stdlib__Queue");
    var
     Failure$0=[248,cst_Stdlib_Stream_Failure,caml_fresh_oo_id(0)],
     Error=[248,cst_Stdlib_Stream_Error,caml_fresh_oo_id(0)];
    function count(param)
     {if(param){var match=param[1],count=match[1];return count}return 0}
    function data(param)
     {if(param){var match=param[1],data=match[2];return data}return 0}
    function fill_buff(b)
     {b[3] = input(b[1],b[2],0,caml_ml_bytes_length(b[2]));b[4] = 0;return 0}
    function get_data(count,d)
     {var d$0=d;
      for(;;)
       {if(typeof d$0 !== "number")
         switch(d$0[0])
          {case 1:
            var d2=d$0[2],d1=d$0[1],match=get_data(count,d1);
            if(typeof match === "number")
             {var d$0=d2;continue}
            else
             {if(0 === match[0])
               {var d11=match[2],a=match[1];return [0,a,[1,d11,d2]]}
              throw [0,Assert_failure,_$_]}
           case 2:
            var
             f=d$0[1],
             _vw_=caml_obj_tag(f),
             d$1=250 === _vw_?f[1]:246 === _vw_?force_lazy_block(f):f,
             d$0=d$1;
            continue;
           case 3:
            var _vx_=d$0[1],_vy_=_vx_[1];
            if(_vy_)
             {var _vz_=_vy_[1];
              if(_vz_){var a$0=_vz_[1];_vx_[1] = 0;return [0,a$0,d$0]}
              return 0}
            var match$0=caml_call1(_vx_[2],count);
            if(match$0){var a$1=match$0[1];return [0,a$1,d$0]}
            _vx_[1] = _aa_;
            return 0;
           case 4:
            var b=d$0[1];
            if(b[3] <= b[4])fill_buff(b);
            if(0 === b[3])return 0;
            var r=caml_bytes_unsafe_get(b[2],b[4]);
            b[4] = b[4] + 1 | 0;
            return [0,r,d$0]
           }
        return d$0}}
    function peek_data(s)
     {for(;;)
       {var _vr_=s[2];
        if(typeof _vr_ === "number")
         return 0;
        else
         switch(_vr_[0])
          {case 0:var a=_vr_[1];return [0,a];
           case 1:
            var d=get_data(s[1],s[2]);
            if(typeof d === "number")
             return 0;
            else
             {if(0 === d[0]){var a$0=d[1];s[2] = d;return [0,a$0]}
              throw [0,Assert_failure,_ab_]}
           case 2:
            var
             f=_vr_[1],
             _vs_=caml_obj_tag(f),
             _vt_=250 === _vs_?f[1]:246 === _vs_?force_lazy_block(f):f;
            s[2] = _vt_;
            continue;
           case 3:
            var _vu_=_vr_[1],_vv_=_vu_[1];
            if(_vv_){var a$1=_vv_[1];return a$1}
            var x=caml_call1(_vu_[2],s[1]);
            _vu_[1] = [0,x];
            return x;
           default:
            var b=_vr_[1];
            if(b[3] <= b[4])fill_buff(b);
            return 0 === b[3]
                    ?(s[2] = 0,0)
                    :[0,caml_bytes_unsafe_get(b[2],b[4])]}}}
    function peek$0(param)
     {if(param){var s=param[1];return peek_data(s)}return 0}
    function junk_data(s)
     {for(;;)
       {var _vp_=s[2];
        if(typeof _vp_ !== "number")
         switch(_vp_[0])
          {case 0:var d=_vp_[2];s[1] = s[1] + 1 | 0;s[2] = d;return 0;
           case 3:
            var _vq_=_vp_[1];
            if(_vq_[1]){s[1] = s[1] + 1 | 0;_vq_[1] = 0;return 0}
            break;
           case 4:
            var b=_vp_[1];
            if(b[3] <= b[4])fill_buff(b);
            return 0 === b[3]
                    ?(s[2] = 0,0)
                    :(s[1] = s[1] + 1 | 0,b[4] = b[4] + 1 | 0,0)
           }
        var match=peek_data(s);
        if(match)continue;
        return 0}}
    function junk(param)
     {if(param){var data=param[1];return junk_data(data)}return 0}
    function nget_data(n,s)
     {if(0 < n)
       {var match=peek_data(s);
        if(match)
         {var a=match[1];
          junk_data(s);
          var
           match$0=nget_data(n - 1 | 0,s),
           k=match$0[3],
           d=match$0[2],
           al=match$0[1];
          return [0,[0,a,al],[0,a,d],k + 1 | 0]}
        return [0,0,s[2],0]}
      return [0,0,s[2],0]}
    function npeek(n,param)
     {if(param)
       {var
         d$0=param[1],
         match=nget_data(n,d$0),
         len=match[3],
         d=match[2],
         al=match[1];
        d$0[1] = d$0[1] - len | 0;
        d$0[2] = d;
        return al}
      return 0}
    function next(s)
     {var match=peek$0(s);
      if(match){var a=match[1];junk(s);return a}
      throw Failure$0}
    function empty$2(s){var match=peek$0(s);if(match)throw Failure$0;return 0}
    function iter$9(f,strm)
     {for(;;)
       {var match=peek$0(strm);
        if(match){var a=match[1];junk(strm);caml_call1(f,a);continue}
        return 0}}
    function from(f){return [0,[0,0,[3,[0,0,f]]]]}
    function of_list$1(l)
     {var _vo_=0;
      return [0,[0,0,fold_right(function(x,l){return [0,x,l]},l,_vo_)]]}
    function of_string(s)
     {var count=[0,0];
      return from
              (function(param)
                {var c=count[1];
                 return c < caml_ml_string_length(s)
                         ?(count[1]++,[0,caml_string_get(s,c)])
                         :0})}
    function of_bytes$0(s)
     {var count=[0,0];
      return from
              (function(param)
                {var c=count[1];
                 return c < caml_ml_bytes_length(s)
                         ?(count[1]++,[0,caml_bytes_get(s,c)])
                         :0})}
    function of_channel(ic)
     {return [0,[0,0,[4,[0,ic,caml_create_bytes(4096),0,0]]]]}
    function iapp(i,s){var _vn_=data(s);return [0,[0,0,[1,data(i),_vn_]]]}
    function icons(i,s){return [0,[0,0,[0,i,data(s)]]]}
    function ising(i){return [0,[0,0,[0,i,0]]]}
    function lapp(f,s)
     {return [0,
              [0,
               0,
               [2,
                [246,
                 function(_vl_)
                  {var _vm_=data(s);return [1,data(caml_call1(f,0)),_vm_]}]]]]}
    function lcons(f,s)
     {return [0,
              [0,
               0,
               [2,
                [246,
                 function(_vj_)
                  {var _vk_=data(s);return [0,caml_call1(f,0),_vk_]}]]]]}
    function lsing(f)
     {return [0,[0,0,[2,[246,function(_vi_){return [0,caml_call1(f,0),0]}]]]]}
    var sempty=0;
    function slazy(f)
     {return [0,[0,0,[2,[246,function(_vh_){return data(caml_call1(f,0))}]]]]}
    function dump_data(f,param)
     {if(typeof param === "number")
       return print_string(cst_Sempty);
      else
       switch(param[0])
        {case 0:
          var d=param[2],a=param[1];
          print_string(cst_Scons);
          caml_call1(f,a);
          print_string(cst$7);
          dump_data(f,d);
          return print_string(cst$8);
         case 1:
          var d2=param[2],d1=param[1];
          print_string(cst_Sapp);
          dump_data(f,d1);
          print_string(cst$9);
          dump_data(f,d2);
          return print_string(cst$10);
         case 2:return print_string(cst_Slazy);
         case 3:return print_string(cst_Sgen);
         default:return print_string(cst_Sbuffio)}}
    function dump(f,s)
     {print_string(cst_count);
      print_int(count(s));
      print_string(cst_data);
      dump_data(f,data(s));
      print_string(cst$6);
      return print_newline(0)}
    var
     Stdlib_Stream=
      [0,
       Failure$0,
       Error,
       from,
       of_list$1,
       of_string,
       of_bytes$0,
       of_channel,
       iter$9,
       next,
       empty$2,
       peek$0,
       junk,
       count,
       npeek,
       iapp,
       icons,
       ising,
       lapp,
       lcons,
       lsing,
       sempty,
       slazy,
       dump];
    caml_register_global(805,Stdlib_Stream,"Stdlib__Stream");
    function create$2(n)
     {var
       n$0=1 <= n?n:1,
       n$1=max_string_length < n$0?max_string_length:n$0,
       s=caml_create_bytes(n$1);
      return [0,s,0,n$1,s]}
    function contents(b){return sub_string(b[1],0,b[2])}
    function to_bytes$0(b){return sub(b[1],0,b[2])}
    function sub$3(b,ofs,len)
     {if(0 <= ofs && 0 <= len && ! ((b[2] - len | 0) < ofs))
       return sub_string(b[1],ofs,len);
      return invalid_arg(cst_Buffer_sub)}
    function blit$3(src,srcoff,dst,dstoff,len)
     {if
       (0
        <=
        len
        &&
        0
        <=
        srcoff
        &&
        !
        ((src[2] - len | 0) < srcoff)
        &&
        0
        <=
        dstoff
        &&
        !
        ((caml_ml_bytes_length(dst) - len | 0) < dstoff))
       return caml_blit_bytes(src[1],srcoff,dst,dstoff,len);
      return invalid_arg(cst_Buffer_blit)}
    function nth$0(b,ofs)
     {if(0 <= ofs && ! (b[2] <= ofs))return caml_bytes_unsafe_get(b[1],ofs);
      return invalid_arg(cst_Buffer_nth)}
    function length$4(b){return b[2]}
    function clear$1(b){b[2] = 0;return 0}
    function reset(b)
     {b[2] = 0;b[1] = b[4];b[3] = caml_ml_bytes_length(b[1]);return 0}
    function resize(b,more)
     {var old_pos=b[2],old_len=b[3],new_len=[0,old_len];
      for(;;)
       {if(new_len[1] < (old_pos + more | 0))
         {new_len[1] = 2 * new_len[1] | 0;continue}
        if(max_string_length < new_len[1])
         if((old_pos + more | 0) <= max_string_length)
          new_len[1] = max_string_length;
         else
          failwith(cst_Buffer_add_cannot_grow_buf);
        var new_buffer=caml_create_bytes(new_len[1]);
        blit(b[1],0,new_buffer,0,b[2]);
        b[1] = new_buffer;
        b[3] = new_len[1];
        if((b[2] + more | 0) <= b[3])
         {if((old_pos + more | 0) <= b[3])return 0;
          throw [0,Assert_failure,_ac_]}
        throw [0,Assert_failure,_ad_]}}
    function add_char(b,c)
     {var pos=b[2];
      if(b[3] <= pos)resize(b,1);
      caml_bytes_unsafe_set(b[1],pos,c);
      b[2] = pos + 1 | 0;
      return 0}
    var uchar_utf_8_byte_length_max=4,uchar_utf_16_byte_length_max=4;
    function add_utf_8_uchar(b,u)
     {for(;;)
       {var pos=b[2];
        if(b[3] <= pos)resize(b,uchar_utf_8_byte_length_max);
        var n=set_utf_8_uchar(b[1],pos,u);
        if(0 === n){resize(b,uchar_utf_8_byte_length_max);continue}
        b[2] = pos + n | 0;
        return 0}}
    function add_utf_16be_uchar(b,u)
     {for(;;)
       {var pos=b[2];
        if(b[3] <= pos)resize(b,uchar_utf_16_byte_length_max);
        var n=set_utf_16be_uchar(b[1],pos,u);
        if(0 === n){resize(b,uchar_utf_16_byte_length_max);continue}
        b[2] = pos + n | 0;
        return 0}}
    function add_utf_16le_uchar(b,u)
     {for(;;)
       {var pos=b[2];
        if(b[3] <= pos)resize(b,uchar_utf_16_byte_length_max);
        var n=set_utf_16le_uchar(b[1],pos,u);
        if(0 === n){resize(b,uchar_utf_16_byte_length_max);continue}
        b[2] = pos + n | 0;
        return 0}}
    function add_substring(b,s,offset,len)
     {var _ve_=offset < 0?1:0;
      if(_ve_)
       var _vf_=_ve_;
      else
       var
        _vg_=len < 0?1:0,
        _vf_=_vg_ || ((caml_ml_string_length(s) - len | 0) < offset?1:0);
      if(_vf_)invalid_arg(cst_Buffer_add_substring_add_s);
      var new_position=b[2] + len | 0;
      if(b[3] < new_position)resize(b,len);
      caml_blit_string(s,offset,b[1],b[2],len);
      b[2] = new_position;
      return 0}
    function add_subbytes(b,s,offset,len)
     {return add_substring(b,caml_string_of_bytes(s),offset,len)}
    function add_string(b,s)
     {var len=caml_ml_string_length(s),new_position=b[2] + len | 0;
      if(b[3] < new_position)resize(b,len);
      caml_blit_string(s,0,b[1],b[2],len);
      b[2] = new_position;
      return 0}
    function add_bytes(b,s){return add_string(b,caml_string_of_bytes(s))}
    function add_buffer(b,bs){return add_subbytes(b,bs[1],0,bs[2])}
    function add_channel(b,ic,len)
     {var _vc_=len < 0?1:0,_vd_=_vc_ || (max_string_length < len?1:0);
      if(_vd_)invalid_arg(cst_Buffer_add_channel);
      if(b[3] < (b[2] + len | 0))resize(b,len);
      var already_read=0,ofs=b[2],to_read=len,_vb_=b[1];
      for(;;)
       {if(0 !== to_read)
         {var r=input(ic,_vb_,ofs,to_read);
          if(0 !== r)
           {var
             already_read$0=already_read + r | 0,
             ofs$0=ofs + r | 0,
             to_read$0=to_read - r | 0,
             already_read=already_read$0,
             ofs=ofs$0,
             to_read=to_read$0;
            continue}}
        if((b[2] + already_read | 0) <= b[3])
         {b[2] = b[2] + already_read | 0;
          if(already_read < len)throw End_of_file;
          return 0}
        throw [0,Assert_failure,_ae_]}}
    function output_buffer(oc,b){return output(oc,b[1],0,b[2])}
    function add_substitute(b,f,s)
     {var lim$1=caml_ml_string_length(s),previous=32,i$7=0;
      for(;;)
       {if(i$7 < lim$1)
         {var current=caml_string_get(s,i$7);
          if(36 === current)
           {if(92 === previous)
             {add_char(b,current);
              var i$8=i$7 + 1 | 0,previous=32,i$7=i$8;
              continue}
            var start=i$7 + 1 | 0;
            if(lim$1 <= start)throw Not_found;
            var opening=caml_string_get(s,start),switch$0=0;
            if(40 !== opening && 123 !== opening)
             {var i$6=start + 1 | 0,lim$0=caml_ml_string_length(s),i$3=i$6;
              for(;;)
               {if(lim$0 <= i$3)
                 var stop=lim$0;
                else
                 {var match=caml_string_get(s,i$3),switch$1=0;
                  if(91 <= match)
                   {if(97 <= match)
                     {if(! (123 <= match))switch$1 = 1}
                    else
                     if(95 === match)switch$1 = 1}
                  else
                   if(58 <= match)
                    {if(65 <= match)switch$1 = 1}
                   else
                    if(48 <= match)switch$1 = 1;
                  if(switch$1){var i$4=i$3 + 1 | 0,i$3=i$4;continue}
                  var stop=i$3}
                var match$0=[0,sub$0(s,start,stop - start | 0),stop];
                switch$0 = 1;
                break}}
            if(! switch$0)
             {var i$5=start + 1 | 0,k$2=0;
              if(40 === opening)
               var _u$_=41;
              else
               {if(123 !== opening)throw [0,Assert_failure,_af_];var _u$_=125}
              var lim=caml_ml_string_length(s),k=k$2,i=i$5;
              for(;;)
               {if(lim <= i)throw Not_found;
                if(caml_string_get(s,i) === opening)
                 {var i$0=i + 1 | 0,k$0=k + 1 | 0,k=k$0,i=i$0;continue}
                if(caml_string_get(s,i) !== _u$_)
                 {var i$2=i + 1 | 0,i=i$2;continue}
                if(0 !== k)
                 {var i$1=i + 1 | 0,k$1=k - 1 | 0,k=k$1,i=i$1;continue}
                var
                 match$0=
                  [0,sub$0(s,i$5,(i - start | 0) - 1 | 0),i + 1 | 0];
                break}}
            var next_i=match$0[2],ident=match$0[1];
            add_string(b,caml_call1(f,ident));
            var previous=32,i$7=next_i;
            continue}
          if(92 === previous)
           {add_char(b,92);
            add_char(b,current);
            var i$9=i$7 + 1 | 0,previous=32,i$7=i$9;
            continue}
          if(92 === current)
           {var i$10=i$7 + 1 | 0,previous=current,i$7=i$10;continue}
          add_char(b,current);
          var i$11=i$7 + 1 | 0,previous=current,i$7=i$11;
          continue}
        var _va_=92 === previous?1:0;
        return _va_?add_char(b,previous):_va_}}
    function truncate(b,len)
     {if(0 <= len && ! (b[2] < len)){b[2] = len;return 0}
      return invalid_arg(cst_Buffer_truncate)}
    function to_seq$8(b)
     {function aux(i,param)
       {if(b[2] <= i)return 0;
        var x=caml_bytes_unsafe_get(b[1],i),_u9_=i + 1 | 0;
        return [0,x,function(_u__){return aux(_u9_,_u__)}]}
      var _u7_=0;
      return function(_u8_){return aux(_u7_,_u8_)}}
    function to_seqi$3(b)
     {function aux(i,param)
       {if(b[2] <= i)return 0;
        var x=caml_bytes_unsafe_get(b[1],i),_u5_=i + 1 | 0;
        return [0,[0,i,x],function(_u6_){return aux(_u5_,_u6_)}]}
      var _u3_=0;
      return function(_u4_){return aux(_u3_,_u4_)}}
    function add_seq$1(b,seq)
     {return iter(function(_u2_){return add_char(b,_u2_)},seq)}
    function of_seq$6(i){var b=create$2(32);add_seq$1(b,i);return b}
    function add_int8(b,x)
     {var new_position=b[2] + 1 | 0;
      if(b[3] < new_position)resize(b,1);
      caml_bytes_unsafe_set(b[1],b[2],x);
      b[2] = new_position;
      return 0}
    function add_int16_ne(b,x)
     {var new_position=b[2] + 2 | 0;
      if(b[3] < new_position)resize(b,2);
      caml_bytes_set16(b[1],b[2],x);
      b[2] = new_position;
      return 0}
    function add_int32_ne(b,x)
     {var new_position=b[2] + 4 | 0;
      if(b[3] < new_position)resize(b,4);
      caml_bytes_set32(b[1],b[2],x);
      b[2] = new_position;
      return 0}
    function add_int64_ne(b,x)
     {var new_position=b[2] + 8 | 0;
      if(b[3] < new_position)resize(b,8);
      caml_bytes_set64(b[1],b[2],x);
      b[2] = new_position;
      return 0}
    function add_int16_le(b,x){return add_int16_ne(b,x)}
    function add_int16_be(b,x)
     {var x$0=caml_bswap16(x);return add_int16_ne(b,x$0)}
    function add_int32_le(b,x){return add_int32_ne(b,x)}
    function add_int32_be(b,x)
     {var x$0=caml_int32_bswap(x);return add_int32_ne(b,x$0)}
    function add_int64_le(b,x){return add_int64_ne(b,x)}
    function add_int64_be(b,x)
     {var x$0=caml_int64_bswap(x);return add_int64_ne(b,x$0)}
    var
     Stdlib_Buffer=
      [0,
       create$2,
       contents,
       to_bytes$0,
       sub$3,
       blit$3,
       nth$0,
       length$4,
       clear$1,
       reset,
       output_buffer,
       truncate,
       add_char,
       add_utf_8_uchar,
       add_utf_16le_uchar,
       add_utf_16be_uchar,
       add_string,
       add_bytes,
       add_substring,
       add_subbytes,
       add_substitute,
       add_buffer,
       add_channel,
       to_seq$8,
       to_seqi$3,
       add_seq$1,
       of_seq$6,
       add_int8,
       add_int8,
       add_int16_ne,
       add_int16_be,
       add_int16_le,
       add_int16_ne,
       add_int16_be,
       add_int16_le,
       add_int32_ne,
       add_int32_be,
       add_int32_le,
       add_int64_ne,
       add_int64_be,
       add_int64_le];
    caml_register_global(806,Stdlib_Buffer,"Stdlib__Buffer");
    function create_char_set(param){return make$0(32,0)}
    function add_in_char_set(char_set,c)
     {var str_ind=c >>> 3 | 0,mask=1 << (c & 7);
      return caml_bytes_set
              (char_set,
               str_ind,
               char_of_int(caml_bytes_get(char_set,str_ind) | mask))}
    function freeze_char_set(char_set){return of_bytes(char_set)}
    function rev_char_set(char_set)
     {var char_set$0=create_char_set(0),i=0;
      for(;;)
       {caml_bytes_set
         (char_set$0,i,char_of_int(caml_string_get(char_set,i) ^ 255));
        var _u1_=i + 1 | 0;
        if(31 !== i){var i=_u1_;continue}
        return caml_string_of_bytes(char_set$0)}}
    function is_in_char_set(char_set,c)
     {var str_ind=c >>> 3 | 0,mask=1 << (c & 7);
      return 0 !== (caml_string_get(char_set,str_ind) & mask)?1:0}
    function pad_of_pad_opt(pad_opt)
     {if(pad_opt){var width=pad_opt[1];return [0,1,width]}return 0}
    function param_format_of_ignored_format(ign,fmt)
     {if(typeof ign === "number")
       switch(ign)
        {case 0:return [0,[0,fmt]];
         case 1:return [0,[1,fmt]];
         case 2:return [0,[19,fmt]];
         default:return [0,[22,fmt]]}
      else
       switch(ign[0])
        {case 0:var pad_opt=ign[1];return [0,[2,pad_of_pad_opt(pad_opt),fmt]];
         case 1:
          var pad_opt$0=ign[1];return [0,[3,pad_of_pad_opt(pad_opt$0),fmt]];
         case 2:
          var pad_opt$1=ign[2],iconv=ign[1];
          return [0,[4,iconv,pad_of_pad_opt(pad_opt$1),0,fmt]];
         case 3:
          var pad_opt$2=ign[2],iconv$0=ign[1];
          return [0,[5,iconv$0,pad_of_pad_opt(pad_opt$2),0,fmt]];
         case 4:
          var pad_opt$3=ign[2],iconv$1=ign[1];
          return [0,[6,iconv$1,pad_of_pad_opt(pad_opt$3),0,fmt]];
         case 5:
          var pad_opt$4=ign[2],iconv$2=ign[1];
          return [0,[7,iconv$2,pad_of_pad_opt(pad_opt$4),0,fmt]];
         case 6:
          var prec_opt=ign[2],pad_opt$5=ign[1];
          if(prec_opt)var ndec=prec_opt[1],_u0_=[0,ndec];else var _u0_=0;
          return [0,[8,_ag_,pad_of_pad_opt(pad_opt$5),_u0_,fmt]];
         case 7:
          var pad_opt$6=ign[1];return [0,[9,pad_of_pad_opt(pad_opt$6),fmt]];
         case 8:
          var fmtty=ign[2],pad_opt$7=ign[1];
          return [0,[13,pad_opt$7,fmtty,fmt]];
         case 9:
          var fmtty$0=ign[2],pad_opt$8=ign[1];
          return [0,[14,pad_opt$8,fmtty$0,fmt]];
         case 10:
          var char_set=ign[2],width_opt=ign[1];
          return [0,[20,width_opt,char_set,fmt]];
         default:var counter=ign[1];return [0,[21,counter,fmt]]}}
    function default_float_precision(fconv){return 5 === fconv[2]?12:-6}
    function buffer_create(init_size)
     {return [0,0,caml_create_bytes(init_size)]}
    function buffer_check_size(buf,overhead)
     {var
       len=caml_ml_bytes_length(buf[2]),
       min_len=buf[1] + overhead | 0,
       _uY_=len < min_len?1:0;
      if(_uY_)
       {var
         new_len=max$1(len * 2 | 0,min_len),
         new_str=caml_create_bytes(new_len);
        blit(buf[2],0,new_str,0,len);
        buf[2] = new_str;
        var _uZ_=0}
      else
       var _uZ_=_uY_;
      return _uZ_}
    function buffer_add_char(buf,c)
     {buffer_check_size(buf,1);
      caml_bytes_set(buf[2],buf[1],c);
      buf[1] = buf[1] + 1 | 0;
      return 0}
    function buffer_add_string(buf,s)
     {var str_len=caml_ml_string_length(s);
      buffer_check_size(buf,str_len);
      blit$0(s,0,buf[2],buf[1],str_len);
      buf[1] = buf[1] + str_len | 0;
      return 0}
    function buffer_contents(buf){return sub_string(buf[2],0,buf[1])}
    function char_of_iconv(iconv)
     {switch(iconv)
       {case 6:
        case 7:return 120;
        case 8:
        case 9:return 88;
        case 10:
        case 11:return 111;
        case 12:
        case 15:return 117;
        case 0:
        case 1:
        case 2:
        case 13:return 100;
        default:return 105}}
    function char_of_fconv(opt,fconv)
     {if(opt)var sth=opt[1],cF=sth;else var cF=70;
      switch(fconv[2])
       {case 0:return 102;
        case 1:return 101;
        case 2:return 69;
        case 3:return 103;
        case 4:return 71;
        case 5:return cF;
        case 6:return 104;
        case 7:return 72;
        default:return 70}}
    function bprint_padty(buf,padty)
     {switch(padty)
       {case 0:return buffer_add_char(buf,45);
        case 1:return 0;
        default:return buffer_add_char(buf,48)}}
    function bprint_ignored_flag(buf,ign_flag)
     {return ign_flag?buffer_add_char(buf,95):ign_flag}
    function bprint_pad_opt(buf,pad_opt)
     {if(pad_opt)
       {var width=pad_opt[1];
        return buffer_add_string(buf,caml_string_of_jsbytes("" + width))}
      return 0}
    function bprint_padding(buf,pad)
     {if(typeof pad === "number")
       return 0;
      else
       {if(0 === pad[0])
         {var n=pad[2],padty=pad[1];
          bprint_padty(buf,padty);
          return buffer_add_string(buf,caml_string_of_jsbytes("" + n))}
        var padty$0=pad[1];
        bprint_padty(buf,padty$0);
        return buffer_add_char(buf,42)}}
    function bprint_precision(buf,prec)
     {if(typeof prec === "number")return prec?buffer_add_string(buf,cst$11):0;
      var n=prec[1];
      buffer_add_char(buf,46);
      return buffer_add_string(buf,caml_string_of_jsbytes("" + n))}
    function bprint_iconv_flag(buf,iconv)
     {switch(iconv)
       {case 1:
        case 4:return buffer_add_char(buf,43);
        case 2:
        case 5:return buffer_add_char(buf,32);
        case 7:
        case 9:
        case 11:
        case 13:
        case 14:
        case 15:return buffer_add_char(buf,35);
        default:return 0}}
    function bprint_altint_fmt(buf,ign_flag,iconv,pad,prec,c)
     {buffer_add_char(buf,37);
      bprint_ignored_flag(buf,ign_flag);
      bprint_iconv_flag(buf,iconv);
      bprint_padding(buf,pad);
      bprint_precision(buf,prec);
      buffer_add_char(buf,c);
      return buffer_add_char(buf,char_of_iconv(iconv))}
    function bprint_fconv_flag(buf,fconv)
     {switch(fconv[1])
       {case 0:break;
        case 1:buffer_add_char(buf,43);break;
        default:buffer_add_char(buf,32)}
      return 8 <= fconv[2]?buffer_add_char(buf,35):0}
    function string_of_formatting_lit(formatting_lit)
     {if(typeof formatting_lit === "number")
       switch(formatting_lit)
        {case 0:return cst$12;
         case 1:return cst$13;
         case 2:return cst$14;
         case 3:return cst$15;
         case 4:return cst$16;
         case 5:return cst$17;
         default:return cst$18}
      else
       switch(formatting_lit[0])
        {case 0:var str=formatting_lit[1];return str;
         case 1:var str$0=formatting_lit[1];return str$0;
         default:var c=formatting_lit[1];return cat(cst$19,make$1(1,c))}}
    function bprint_char_literal(buf,chr)
     {return 37 === chr?buffer_add_string(buf,cst$20):buffer_add_char(buf,chr)}
    function bprint_string_literal(buf,str)
     {var _uW_=caml_ml_string_length(str) - 1 | 0,_uV_=0;
      if(! (_uW_ < 0))
       {var i=_uV_;
        for(;;)
         {bprint_char_literal(buf,caml_string_get(str,i));
          var _uX_=i + 1 | 0;
          if(_uW_ !== i){var i=_uX_;continue}
          break}}
      return 0}
    function bprint_fmtty(buf,fmtty)
     {var fmtty$0=fmtty;
      for(;;)
       if(typeof fmtty$0 === "number")
        return 0;
       else
        switch(fmtty$0[0])
         {case 0:
           var rest=fmtty$0[1];
           buffer_add_string(buf,cst_c);
           var fmtty$0=rest;
           continue;
          case 1:
           var rest$0=fmtty$0[1];
           buffer_add_string(buf,cst_s);
           var fmtty$0=rest$0;
           continue;
          case 2:
           var rest$1=fmtty$0[1];
           buffer_add_string(buf,cst_i);
           var fmtty$0=rest$1;
           continue;
          case 3:
           var rest$2=fmtty$0[1];
           buffer_add_string(buf,cst_li);
           var fmtty$0=rest$2;
           continue;
          case 4:
           var rest$3=fmtty$0[1];
           buffer_add_string(buf,cst_ni);
           var fmtty$0=rest$3;
           continue;
          case 5:
           var rest$4=fmtty$0[1];
           buffer_add_string(buf,cst_Li);
           var fmtty$0=rest$4;
           continue;
          case 6:
           var rest$5=fmtty$0[1];
           buffer_add_string(buf,cst_f);
           var fmtty$0=rest$5;
           continue;
          case 7:
           var rest$6=fmtty$0[1];
           buffer_add_string(buf,cst_B);
           var fmtty$0=rest$6;
           continue;
          case 8:
           var rest$7=fmtty$0[2],sub_fmtty=fmtty$0[1];
           buffer_add_string(buf,cst$21);
           bprint_fmtty(buf,sub_fmtty);
           buffer_add_string(buf,cst$22);
           var fmtty$0=rest$7;
           continue;
          case 9:
           var rest$8=fmtty$0[3],sub_fmtty$0=fmtty$0[1];
           buffer_add_string(buf,cst$23);
           bprint_fmtty(buf,sub_fmtty$0);
           buffer_add_string(buf,cst$24);
           var fmtty$0=rest$8;
           continue;
          case 10:
           var rest$9=fmtty$0[1];
           buffer_add_string(buf,cst_a);
           var fmtty$0=rest$9;
           continue;
          case 11:
           var rest$10=fmtty$0[1];
           buffer_add_string(buf,cst_t$0);
           var fmtty$0=rest$10;
           continue;
          case 12:
           var rest$11=fmtty$0[1];
           buffer_add_string(buf,cst$25);
           var fmtty$0=rest$11;
           continue;
          case 13:
           var rest$12=fmtty$0[1];
           buffer_add_string(buf,cst_r$0);
           var fmtty$0=rest$12;
           continue;
          default:
           var rest$13=fmtty$0[1];
           buffer_add_string(buf,cst_r$1);
           var fmtty$0=rest$13;
           continue}}
    function int_of_custom_arity(param)
     {if(param){var x=param[1];return 1 + int_of_custom_arity(x) | 0}return 0}
    function string_of_fmt(fmt)
     {var buf=buffer_create(16);
      function fmtiter(fmt,ign_flag)
       {var fmt$0=fmt,ign_flag$0=ign_flag;
        a:
        for(;;)
         if(typeof fmt$0 === "number")
          return 0;
         else
          switch(fmt$0[0])
           {case 0:
             var rest=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             buffer_add_char(buf,99);
             var fmt$0=rest,ign_flag$0=0;
             continue;
            case 1:
             var rest$0=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             buffer_add_char(buf,67);
             var fmt$0=rest$0,ign_flag$0=0;
             continue;
            case 2:
             var rest$1=fmt$0[2],pad=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_padding(buf,pad);
             buffer_add_char(buf,115);
             var fmt$0=rest$1,ign_flag$0=0;
             continue;
            case 3:
             var rest$2=fmt$0[2],pad$0=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_padding(buf,pad$0);
             buffer_add_char(buf,83);
             var fmt$0=rest$2,ign_flag$0=0;
             continue;
            case 4:
             var rest$3=fmt$0[4],prec=fmt$0[3],pad$1=fmt$0[2],iconv=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_iconv_flag(buf,iconv);
             bprint_padding(buf,pad$1);
             bprint_precision(buf,prec);
             buffer_add_char(buf,char_of_iconv(iconv));
             var fmt$0=rest$3,ign_flag$0=0;
             continue;
            case 5:
             var
              rest$4=fmt$0[4],
              prec$0=fmt$0[3],
              pad$2=fmt$0[2],
              iconv$0=fmt$0[1];
             bprint_altint_fmt(buf,ign_flag$0,iconv$0,pad$2,prec$0,108);
             var fmt$0=rest$4,ign_flag$0=0;
             continue;
            case 6:
             var
              rest$5=fmt$0[4],
              prec$1=fmt$0[3],
              pad$3=fmt$0[2],
              iconv$1=fmt$0[1];
             bprint_altint_fmt(buf,ign_flag$0,iconv$1,pad$3,prec$1,110);
             var fmt$0=rest$5,ign_flag$0=0;
             continue;
            case 7:
             var
              rest$6=fmt$0[4],
              prec$2=fmt$0[3],
              pad$4=fmt$0[2],
              iconv$2=fmt$0[1];
             bprint_altint_fmt(buf,ign_flag$0,iconv$2,pad$4,prec$2,76);
             var fmt$0=rest$6,ign_flag$0=0;
             continue;
            case 8:
             var
              rest$7=fmt$0[4],
              prec$3=fmt$0[3],
              pad$5=fmt$0[2],
              fconv=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_fconv_flag(buf,fconv);
             bprint_padding(buf,pad$5);
             bprint_precision(buf,prec$3);
             buffer_add_char(buf,char_of_fconv(0,fconv));
             var fmt$0=rest$7,ign_flag$0=0;
             continue;
            case 9:
             var rest$8=fmt$0[2],pad$6=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_padding(buf,pad$6);
             buffer_add_char(buf,66);
             var fmt$0=rest$8,ign_flag$0=0;
             continue;
            case 10:
             var rest$9=fmt$0[1];
             buffer_add_string(buf,cst$26);
             var fmt$0=rest$9;
             continue;
            case 11:
             var rest$10=fmt$0[2],str=fmt$0[1];
             bprint_string_literal(buf,str);
             var fmt$0=rest$10;
             continue;
            case 12:
             var rest$11=fmt$0[2],chr$0=fmt$0[1];
             bprint_char_literal(buf,chr$0);
             var fmt$0=rest$11;
             continue;
            case 13:
             var rest$12=fmt$0[3],fmtty=fmt$0[2],pad_opt=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_pad_opt(buf,pad_opt);
             buffer_add_char(buf,123);
             bprint_fmtty(buf,fmtty);
             buffer_add_char(buf,37);
             buffer_add_char(buf,125);
             var fmt$0=rest$12,ign_flag$0=0;
             continue;
            case 14:
             var rest$13=fmt$0[3],fmtty$0=fmt$0[2],pad_opt$0=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_pad_opt(buf,pad_opt$0);
             buffer_add_char(buf,40);
             bprint_fmtty(buf,fmtty$0);
             buffer_add_char(buf,37);
             buffer_add_char(buf,41);
             var fmt$0=rest$13,ign_flag$0=0;
             continue;
            case 15:
             var rest$14=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             buffer_add_char(buf,97);
             var fmt$0=rest$14,ign_flag$0=0;
             continue;
            case 16:
             var rest$15=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             buffer_add_char(buf,116);
             var fmt$0=rest$15,ign_flag$0=0;
             continue;
            case 17:
             var rest$16=fmt$0[2],fmting_lit=fmt$0[1];
             bprint_string_literal(buf,string_of_formatting_lit(fmting_lit));
             var fmt$0=rest$16;
             continue;
            case 18:
             var rest$17=fmt$0[2],fmting_gen=fmt$0[1];
             if(0 === fmting_gen[0])
              {var match$1=fmting_gen[1],str$0=match$1[2];
               buffer_add_string(buf,cst$27);
               buffer_add_string(buf,str$0)}
             else
              {var match$2=fmting_gen[1],str$1=match$2[2];
               buffer_add_string(buf,cst$28);
               buffer_add_string(buf,str$1)}
             var fmt$0=rest$17;
             continue;
            case 19:
             var rest$18=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             buffer_add_char(buf,114);
             var fmt$0=rest$18,ign_flag$0=0;
             continue;
            case 20:
             var rest$19=fmt$0[3],char_set=fmt$0[2],width_opt=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_pad_opt(buf,width_opt);
             var
              print_char=
               function(buf,i)
                {var c=char_of_int(i);
                 return 37 === c
                         ?(buffer_add_char(buf,37),buffer_add_char(buf,37))
                         :64 === c
                           ?(buffer_add_char(buf,37),buffer_add_char(buf,64))
                           :buffer_add_char(buf,c)};
             buffer_add_char(buf,91);
             var
              _uL_=
               is_in_char_set(char_set,0)
                ?(buffer_add_char(buf,94),rev_char_set(char_set))
                :char_set,
              is_alone$0=
               function(_uQ_)
                {function is_alone(c)
                  {var
                    after=chr(c + 1 | 0),
                    before=chr(c - 1 | 0),
                    _uR_=is_in_char_set(_uQ_,c);
                   if(_uR_)
                    var
                     _uS_=is_in_char_set(_uQ_,before),
                     _uT_=_uS_?is_in_char_set(_uQ_,after):_uS_,
                     _uU_=1 - _uT_;
                   else
                    var _uU_=_uR_;
                   return _uU_}
                 return is_alone},
              is_alone=is_alone$0(_uL_);
             if(is_alone(93))buffer_add_char(buf,93);
             var i=1;
             b:
             for(;;)
              {if(i < 256)
                {if(! is_in_char_set(_uL_,char_of_int(i)))
                  {var i$0=i + 1 | 0,i=i$0;continue}
                 var match=char_of_int(i),switcher=match - 45 | 0,switch$0=0;
                 if(48 < switcher >>> 0)
                  if(210 <= switcher)print_char(buf,255);else switch$0 = 1;
                 else
                  {if(46 < switcher - 1 >>> 0)
                    {var i$2=i + 1 | 0,i=i$2;continue}
                   switch$0 = 1}
                 if(switch$0)
                  {var i$1=i + 1 | 0;
                   if(! is_in_char_set(_uL_,char_of_int(i$1)))
                    {print_char(buf,i$1 - 1 | 0);
                     var i$6=i$1 + 1 | 0,i=i$6;
                     continue}
                   var
                    match$0=char_of_int(i$1),
                    switcher$0=match$0 - 45 | 0,
                    switch$1=0;
                   if(48 < switcher$0 >>> 0)
                    if(210 <= switcher$0)
                     {print_char(buf,254);print_char(buf,255)}
                    else
                     switch$1 = 1;
                   else
                    if(46 < switcher$0 - 1 >>> 0)
                     {if(! is_in_char_set(_uL_,char_of_int(i$1 + 1 | 0)))
                       {print_char(buf,i$1 - 1 | 0);
                        var i$5=i$1 + 1 | 0,i=i$5;
                        continue}
                      switch$1 = 1}
                    else
                     switch$1 = 1;
                   if(switch$1)
                    {if(! is_in_char_set(_uL_,char_of_int(i$1 + 1 | 0)))
                      {print_char(buf,i$1 - 1 | 0);
                       print_char(buf,i$1);
                       var i$4=i$1 + 2 | 0,i=i$4;
                       continue}
                     var j=i$1 + 2 | 0,i$3=i$1 - 1 | 0,j$0=j;
                     for(;;)
                      {if(256 !== j$0 && is_in_char_set(_uL_,char_of_int(j$0)))
                        {var j$1=j$0 + 1 | 0,j$0=j$1;continue}
                       print_char(buf,i$3);
                       print_char(buf,45);
                       print_char(buf,j$0 - 1 | 0);
                       if(j$0 < 256){var i$7=j$0 + 1 | 0,i=i$7;continue b}
                       break}}}}
               if(is_alone(45))buffer_add_char(buf,45);
               buffer_add_char(buf,93);
               var fmt$0=rest$19,ign_flag$0=0;
               continue a}
            case 21:
             var rest$20=fmt$0[2],counter=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             switch(counter)
              {case 0:var _uM_=108;break;
               case 1:var _uM_=110;break;
               default:var _uM_=78}
             buffer_add_char(buf,_uM_);
             var fmt$0=rest$20,ign_flag$0=0;
             continue;
            case 22:
             var rest$21=fmt$0[1];
             buffer_add_char(buf,37);
             bprint_ignored_flag(buf,ign_flag$0);
             bprint_string_literal(buf,cst_0c);
             var fmt$0=rest$21,ign_flag$0=0;
             continue;
            case 23:
             var
              rest$22=fmt$0[2],
              ign=fmt$0[1],
              match$3=param_format_of_ignored_format(ign,rest$22),
              fmt$1=match$3[1],
              fmt$0=fmt$1,
              ign_flag$0=1;
             continue;
            default:
             var
              rest$23=fmt$0[3],
              arity=fmt$0[1],
              _uO_=int_of_custom_arity(arity),
              _uN_=1;
             if(! (_uO_ < 1))
              {var i$8=_uN_;
               for(;;)
                {buffer_add_char(buf,37);
                 bprint_ignored_flag(buf,ign_flag$0);
                 buffer_add_char(buf,63);
                 var _uP_=i$8 + 1 | 0;
                 if(_uO_ !== i$8){var i$8=_uP_;continue}
                 break}}
             var fmt$0=rest$23,ign_flag$0=0;
             continue}}
      fmtiter(fmt,0);
      return buffer_contents(buf)}
    function symm(param)
     {if(typeof param === "number")
       return 0;
      else
       switch(param[0])
        {case 0:var rest=param[1];return [0,symm(rest)];
         case 1:var rest$0=param[1];return [1,symm(rest$0)];
         case 2:var rest$1=param[1];return [2,symm(rest$1)];
         case 3:var rest$2=param[1];return [3,symm(rest$2)];
         case 4:var rest$3=param[1];return [4,symm(rest$3)];
         case 5:var rest$4=param[1];return [5,symm(rest$4)];
         case 6:var rest$5=param[1];return [6,symm(rest$5)];
         case 7:var rest$6=param[1];return [7,symm(rest$6)];
         case 8:var rest$7=param[2],ty=param[1];return [8,ty,symm(rest$7)];
         case 9:
          var rest$8=param[3],ty2=param[2],ty1=param[1];
          return [9,ty2,ty1,symm(rest$8)];
         case 10:var rest$9=param[1];return [10,symm(rest$9)];
         case 11:var rest$10=param[1];return [11,symm(rest$10)];
         case 12:var rest$11=param[1];return [12,symm(rest$11)];
         case 13:var rest$12=param[1];return [13,symm(rest$12)];
         default:var rest$13=param[1];return [14,symm(rest$13)]}}
    function trans(ty1,ty2)
     {var switch$0=0;
      if(typeof ty1 === "number")
       if(typeof ty2 === "number")
        return 0;
       else
        switch(ty2[0])
         {case 10:break;
          case 11:switch$0 = 1;break;
          case 12:switch$0 = 2;break;
          case 13:switch$0 = 3;break;
          case 14:switch$0 = 4;break;
          case 8:switch$0 = 5;break;
          case 9:switch$0 = 6;break;
          default:throw [0,Assert_failure,_ah_]}
      else
       switch(ty1[0])
        {case 0:
          var switch$1=0,_us_=ty1[1];
          if(typeof ty2 !== "number")
           switch(ty2[0])
            {case 0:var rest2=ty2[1];return [0,trans(_us_,rest2)];
             case 8:switch$0 = 5;switch$1 = 1;break;
             case 9:switch$0 = 6;switch$1 = 1;break;
             case 10:switch$1 = 1;break;
             case 11:switch$0 = 1;switch$1 = 1;break;
             case 12:switch$0 = 2;switch$1 = 1;break;
             case 13:switch$0 = 3;switch$1 = 1;break;
             case 14:switch$0 = 4;switch$1 = 1;break
             }
          if(! switch$1)switch$0 = 7;
          break;
         case 1:
          var switch$2=0,_ut_=ty1[1];
          if(typeof ty2 !== "number")
           switch(ty2[0])
            {case 1:var rest2$0=ty2[1];return [1,trans(_ut_,rest2$0)];
             case 8:switch$0 = 5;switch$2 = 1;break;
             case 9:switch$0 = 6;switch$2 = 1;break;
             case 10:switch$2 = 1;break;
             case 11:switch$0 = 1;switch$2 = 1;break;
             case 12:switch$0 = 2;switch$2 = 1;break;
             case 13:switch$0 = 3;switch$2 = 1;break;
             case 14:switch$0 = 4;switch$2 = 1;break
             }
          if(! switch$2)switch$0 = 7;
          break;
         case 2:
          var switch$3=0,_uu_=ty1[1];
          if(typeof ty2 === "number")
           switch$3 = 1;
          else
           switch(ty2[0])
            {case 2:var rest2$1=ty2[1];return [2,trans(_uu_,rest2$1)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$3 = 1}
          if(switch$3)switch$0 = 7;
          break;
         case 3:
          var switch$4=0,_uv_=ty1[1];
          if(typeof ty2 === "number")
           switch$4 = 1;
          else
           switch(ty2[0])
            {case 3:var rest2$2=ty2[1];return [3,trans(_uv_,rest2$2)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$4 = 1}
          if(switch$4)switch$0 = 7;
          break;
         case 4:
          var switch$5=0,_uw_=ty1[1];
          if(typeof ty2 === "number")
           switch$5 = 1;
          else
           switch(ty2[0])
            {case 4:var rest2$3=ty2[1];return [4,trans(_uw_,rest2$3)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$5 = 1}
          if(switch$5)switch$0 = 7;
          break;
         case 5:
          var switch$6=0,_ux_=ty1[1];
          if(typeof ty2 === "number")
           switch$6 = 1;
          else
           switch(ty2[0])
            {case 5:var rest2$4=ty2[1];return [5,trans(_ux_,rest2$4)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$6 = 1}
          if(switch$6)switch$0 = 7;
          break;
         case 6:
          var switch$7=0,_uy_=ty1[1];
          if(typeof ty2 === "number")
           switch$7 = 1;
          else
           switch(ty2[0])
            {case 6:var rest2$5=ty2[1];return [6,trans(_uy_,rest2$5)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$7 = 1}
          if(switch$7)switch$0 = 7;
          break;
         case 7:
          var switch$8=0,_uz_=ty1[1];
          if(typeof ty2 === "number")
           switch$8 = 1;
          else
           switch(ty2[0])
            {case 7:var rest2$6=ty2[1];return [7,trans(_uz_,rest2$6)];
             case 8:switch$0 = 5;break;
             case 9:switch$0 = 6;break;
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$8 = 1}
          if(switch$8)switch$0 = 7;
          break;
         case 8:
          var switch$9=0,_uA_=ty1[2],_uB_=ty1[1];
          if(typeof ty2 === "number")
           switch$9 = 1;
          else
           switch(ty2[0])
            {case 8:
              var rest2$7=ty2[2],ty2$0=ty2[1],_uC_=trans(_uA_,rest2$7);
              return [8,trans(_uB_,ty2$0),_uC_];
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$9 = 1}
          if(switch$9)throw [0,Assert_failure,_aq_];
          break;
         case 9:
          var switch$10=0,_uD_=ty1[3],_uE_=ty1[2],_uF_=ty1[1];
          if(typeof ty2 === "number")
           switch$10 = 1;
          else
           switch(ty2[0])
            {case 8:switch$0 = 5;break;
             case 9:
              var
               rest2$8=ty2[3],
               ty22=ty2[2],
               ty21=ty2[1],
               ty=trans(symm(_uE_),ty21),
               match=fmtty_rel_det(ty),
               f4=match[4],
               f2=match[2];
              caml_call1(f2,0);
              caml_call1(f4,0);
              return [9,_uF_,ty22,trans(_uD_,rest2$8)];
             case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:switch$0 = 4;break;
             default:switch$10 = 1}
          if(switch$10)throw [0,Assert_failure,_ar_];
          break;
         case 10:
          var _uG_=ty1[1];
          if(typeof ty2 !== "number" && 10 === ty2[0])
           {var rest2$9=ty2[1];return [10,trans(_uG_,rest2$9)]}
          throw [0,Assert_failure,_as_];
         case 11:
          var switch$11=0,_uH_=ty1[1];
          if(typeof ty2 === "number")
           switch$11 = 1;
          else
           switch(ty2[0])
            {case 10:break;
             case 11:var rest2$10=ty2[1];return [11,trans(_uH_,rest2$10)];
             default:switch$11 = 1}
          if(switch$11)throw [0,Assert_failure,_at_];
          break;
         case 12:
          var switch$12=0,_uI_=ty1[1];
          if(typeof ty2 === "number")
           switch$12 = 1;
          else
           switch(ty2[0])
            {case 10:break;
             case 11:switch$0 = 1;break;
             case 12:var rest2$11=ty2[1];return [12,trans(_uI_,rest2$11)];
             default:switch$12 = 1}
          if(switch$12)throw [0,Assert_failure,_au_];
          break;
         case 13:
          var switch$13=0,_uJ_=ty1[1];
          if(typeof ty2 === "number")
           switch$13 = 1;
          else
           switch(ty2[0])
            {case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:var rest2$12=ty2[1];return [13,trans(_uJ_,rest2$12)];
             default:switch$13 = 1}
          if(switch$13)throw [0,Assert_failure,_av_];
          break;
         default:
          var switch$14=0,_uK_=ty1[1];
          if(typeof ty2 === "number")
           switch$14 = 1;
          else
           switch(ty2[0])
            {case 10:break;
             case 11:switch$0 = 1;break;
             case 12:switch$0 = 2;break;
             case 13:switch$0 = 3;break;
             case 14:var rest2$13=ty2[1];return [14,trans(_uK_,rest2$13)];
             default:switch$14 = 1}
          if(switch$14)throw [0,Assert_failure,_aw_]}
      switch(switch$0)
       {case 0:throw [0,Assert_failure,_ak_];
        case 1:throw [0,Assert_failure,_al_];
        case 2:throw [0,Assert_failure,_am_];
        case 3:throw [0,Assert_failure,_an_];
        case 4:throw [0,Assert_failure,_ao_];
        case 5:throw [0,Assert_failure,_ai_];
        case 6:throw [0,Assert_failure,_aj_];
        default:throw [0,Assert_failure,_ap_]}}
    function fmtty_rel_det(param)
     {if(typeof param === "number")
       {var
         _t6_=function(param){return 0},
         _t7_=function(param){return 0},
         _t8_=function(param){return 0};
        return [0,function(param){return 0},_t8_,_t7_,_t6_]}
      else
       switch(param[0])
        {case 0:
          var
           rest=param[1],
           match=fmtty_rel_det(rest),
           de=match[4],
           ed=match[3],
           af=match[2],
           fa=match[1],
           _t9_=function(param){caml_call1(af,0);return 0};
          return [0,function(param){caml_call1(fa,0);return 0},_t9_,ed,de];
         case 1:
          var
           rest$0=param[1],
           match$0=fmtty_rel_det(rest$0),
           de$0=match$0[4],
           ed$0=match$0[3],
           af$0=match$0[2],
           fa$0=match$0[1],
           _t__=function(param){caml_call1(af$0,0);return 0};
          return [0,
                  function(param){caml_call1(fa$0,0);return 0},
                  _t__,
                  ed$0,
                  de$0];
         case 2:
          var
           rest$1=param[1],
           match$1=fmtty_rel_det(rest$1),
           de$1=match$1[4],
           ed$1=match$1[3],
           af$1=match$1[2],
           fa$1=match$1[1],
           _t$_=function(param){caml_call1(af$1,0);return 0};
          return [0,
                  function(param){caml_call1(fa$1,0);return 0},
                  _t$_,
                  ed$1,
                  de$1];
         case 3:
          var
           rest$2=param[1],
           match$2=fmtty_rel_det(rest$2),
           de$2=match$2[4],
           ed$2=match$2[3],
           af$2=match$2[2],
           fa$2=match$2[1],
           _ua_=function(param){caml_call1(af$2,0);return 0};
          return [0,
                  function(param){caml_call1(fa$2,0);return 0},
                  _ua_,
                  ed$2,
                  de$2];
         case 4:
          var
           rest$3=param[1],
           match$3=fmtty_rel_det(rest$3),
           de$3=match$3[4],
           ed$3=match$3[3],
           af$3=match$3[2],
           fa$3=match$3[1],
           _ub_=function(param){caml_call1(af$3,0);return 0};
          return [0,
                  function(param){caml_call1(fa$3,0);return 0},
                  _ub_,
                  ed$3,
                  de$3];
         case 5:
          var
           rest$4=param[1],
           match$4=fmtty_rel_det(rest$4),
           de$4=match$4[4],
           ed$4=match$4[3],
           af$4=match$4[2],
           fa$4=match$4[1],
           _uc_=function(param){caml_call1(af$4,0);return 0};
          return [0,
                  function(param){caml_call1(fa$4,0);return 0},
                  _uc_,
                  ed$4,
                  de$4];
         case 6:
          var
           rest$5=param[1],
           match$5=fmtty_rel_det(rest$5),
           de$5=match$5[4],
           ed$5=match$5[3],
           af$5=match$5[2],
           fa$5=match$5[1],
           _ud_=function(param){caml_call1(af$5,0);return 0};
          return [0,
                  function(param){caml_call1(fa$5,0);return 0},
                  _ud_,
                  ed$5,
                  de$5];
         case 7:
          var
           rest$6=param[1],
           match$6=fmtty_rel_det(rest$6),
           de$6=match$6[4],
           ed$6=match$6[3],
           af$6=match$6[2],
           fa$6=match$6[1],
           _ue_=function(param){caml_call1(af$6,0);return 0};
          return [0,
                  function(param){caml_call1(fa$6,0);return 0},
                  _ue_,
                  ed$6,
                  de$6];
         case 8:
          var
           rest$7=param[2],
           match$7=fmtty_rel_det(rest$7),
           de$7=match$7[4],
           ed$7=match$7[3],
           af$7=match$7[2],
           fa$7=match$7[1],
           _uf_=function(param){caml_call1(af$7,0);return 0};
          return [0,
                  function(param){caml_call1(fa$7,0);return 0},
                  _uf_,
                  ed$7,
                  de$7];
         case 9:
          var
           rest$8=param[3],
           ty2=param[2],
           ty1=param[1],
           match$8=fmtty_rel_det(rest$8),
           de$8=match$8[4],
           ed$8=match$8[3],
           af$8=match$8[2],
           fa$8=match$8[1],
           ty=trans(symm(ty1),ty2),
           match$9=fmtty_rel_det(ty),
           jd=match$9[4],
           dj=match$9[3],
           ga=match$9[2],
           ag=match$9[1],
           _ug_=function(param){caml_call1(jd,0);caml_call1(de$8,0);return 0},
           _uh_=function(param){caml_call1(ed$8,0);caml_call1(dj,0);return 0},
           _ui_=function(param){caml_call1(ga,0);caml_call1(af$8,0);return 0};
          return [0,
                  function(param)
                   {caml_call1(fa$8,0);caml_call1(ag,0);return 0},
                  _ui_,
                  _uh_,
                  _ug_];
         case 10:
          var
           rest$9=param[1],
           match$10=fmtty_rel_det(rest$9),
           de$9=match$10[4],
           ed$9=match$10[3],
           af$9=match$10[2],
           fa$9=match$10[1],
           _uj_=function(param){caml_call1(af$9,0);return 0};
          return [0,
                  function(param){caml_call1(fa$9,0);return 0},
                  _uj_,
                  ed$9,
                  de$9];
         case 11:
          var
           rest$10=param[1],
           match$11=fmtty_rel_det(rest$10),
           de$10=match$11[4],
           ed$10=match$11[3],
           af$10=match$11[2],
           fa$10=match$11[1],
           _uk_=function(param){caml_call1(af$10,0);return 0};
          return [0,
                  function(param){caml_call1(fa$10,0);return 0},
                  _uk_,
                  ed$10,
                  de$10];
         case 12:
          var
           rest$11=param[1],
           match$12=fmtty_rel_det(rest$11),
           de$11=match$12[4],
           ed$11=match$12[3],
           af$11=match$12[2],
           fa$11=match$12[1],
           _ul_=function(param){caml_call1(af$11,0);return 0};
          return [0,
                  function(param){caml_call1(fa$11,0);return 0},
                  _ul_,
                  ed$11,
                  de$11];
         case 13:
          var
           rest$12=param[1],
           match$13=fmtty_rel_det(rest$12),
           de$12=match$13[4],
           ed$12=match$13[3],
           af$12=match$13[2],
           fa$12=match$13[1],
           _um_=function(param){caml_call1(de$12,0);return 0},
           _un_=function(param){caml_call1(ed$12,0);return 0},
           _uo_=function(param){caml_call1(af$12,0);return 0};
          return [0,
                  function(param){caml_call1(fa$12,0);return 0},
                  _uo_,
                  _un_,
                  _um_];
         default:
          var
           rest$13=param[1],
           match$14=fmtty_rel_det(rest$13),
           de$13=match$14[4],
           ed$13=match$14[3],
           af$13=match$14[2],
           fa$13=match$14[1],
           _up_=function(param){caml_call1(de$13,0);return 0},
           _uq_=function(param){caml_call1(ed$13,0);return 0},
           _ur_=function(param){caml_call1(af$13,0);return 0};
          return [0,
                  function(param){caml_call1(fa$13,0);return 0},
                  _ur_,
                  _uq_,
                  _up_]}}
    function fmtty_of_precision_fmtty(prec,fmtty)
     {return typeof prec === "number"?prec?[2,fmtty]:fmtty:fmtty}
    function fmtty_of_padding_fmtty(pad,fmtty)
     {return typeof pad === "number"?fmtty:0 === pad[0]?fmtty:[2,fmtty]}
    function fmtty_of_custom(arity,fmtty)
     {if(arity)
       {var arity$0=arity[1];return [12,fmtty_of_custom(arity$0,fmtty)]}
      return fmtty}
    function fmtty_of_fmt(fmtty)
     {var fmtty$0=fmtty;
      for(;;)
       if(typeof fmtty$0 === "number")
        return 0;
       else
        switch(fmtty$0[0])
         {case 0:var rest=fmtty$0[1];return [0,fmtty_of_fmt(rest)];
          case 1:var rest$0=fmtty$0[1];return [0,fmtty_of_fmt(rest$0)];
          case 2:
           var rest$1=fmtty$0[2],pad=fmtty$0[1];
           return fmtty_of_padding_fmtty(pad,[1,fmtty_of_fmt(rest$1)]);
          case 3:
           var rest$2=fmtty$0[2],pad$0=fmtty$0[1];
           return fmtty_of_padding_fmtty(pad$0,[1,fmtty_of_fmt(rest$2)]);
          case 4:
           var
            rest$3=fmtty$0[4],
            prec=fmtty$0[3],
            pad$1=fmtty$0[2],
            ty_rest=fmtty_of_fmt(rest$3),
            prec_ty=fmtty_of_precision_fmtty(prec,[2,ty_rest]);
           return fmtty_of_padding_fmtty(pad$1,prec_ty);
          case 5:
           var
            rest$4=fmtty$0[4],
            prec$0=fmtty$0[3],
            pad$2=fmtty$0[2],
            ty_rest$0=fmtty_of_fmt(rest$4),
            prec_ty$0=fmtty_of_precision_fmtty(prec$0,[3,ty_rest$0]);
           return fmtty_of_padding_fmtty(pad$2,prec_ty$0);
          case 6:
           var
            rest$5=fmtty$0[4],
            prec$1=fmtty$0[3],
            pad$3=fmtty$0[2],
            ty_rest$1=fmtty_of_fmt(rest$5),
            prec_ty$1=fmtty_of_precision_fmtty(prec$1,[4,ty_rest$1]);
           return fmtty_of_padding_fmtty(pad$3,prec_ty$1);
          case 7:
           var
            rest$6=fmtty$0[4],
            prec$2=fmtty$0[3],
            pad$4=fmtty$0[2],
            ty_rest$2=fmtty_of_fmt(rest$6),
            prec_ty$2=fmtty_of_precision_fmtty(prec$2,[5,ty_rest$2]);
           return fmtty_of_padding_fmtty(pad$4,prec_ty$2);
          case 8:
           var
            rest$7=fmtty$0[4],
            prec$3=fmtty$0[3],
            pad$5=fmtty$0[2],
            ty_rest$3=fmtty_of_fmt(rest$7),
            prec_ty$3=fmtty_of_precision_fmtty(prec$3,[6,ty_rest$3]);
           return fmtty_of_padding_fmtty(pad$5,prec_ty$3);
          case 9:
           var rest$8=fmtty$0[2],pad$6=fmtty$0[1];
           return fmtty_of_padding_fmtty(pad$6,[7,fmtty_of_fmt(rest$8)]);
          case 10:var fmtty$1=fmtty$0[1],fmtty$0=fmtty$1;continue;
          case 11:var fmtty$2=fmtty$0[2],fmtty$0=fmtty$2;continue;
          case 12:var fmtty$3=fmtty$0[2],fmtty$0=fmtty$3;continue;
          case 13:
           var rest$9=fmtty$0[3],ty=fmtty$0[2];
           return [8,ty,fmtty_of_fmt(rest$9)];
          case 14:
           var rest$10=fmtty$0[3],ty$0=fmtty$0[2];
           return [9,ty$0,ty$0,fmtty_of_fmt(rest$10)];
          case 15:var rest$11=fmtty$0[1];return [10,fmtty_of_fmt(rest$11)];
          case 16:var rest$12=fmtty$0[1];return [11,fmtty_of_fmt(rest$12)];
          case 17:var fmtty$4=fmtty$0[2],fmtty$0=fmtty$4;continue;
          case 18:
           var
            rest$13=fmtty$0[2],
            fmting_gen=fmtty$0[1],
            _t4_=fmtty_of_fmt(rest$13);
           if(0 === fmting_gen[0])
            var match=fmting_gen[1],fmt=match[1],_t5_=fmtty_of_fmt(fmt);
           else
            var
             match$0=fmting_gen[1],
             fmt$0=match$0[1],
             _t5_=fmtty_of_fmt(fmt$0);
           return concat_fmtty(_t5_,_t4_);
          case 19:var rest$14=fmtty$0[1];return [13,fmtty_of_fmt(rest$14)];
          case 20:var rest$15=fmtty$0[3];return [1,fmtty_of_fmt(rest$15)];
          case 21:var rest$16=fmtty$0[2];return [2,fmtty_of_fmt(rest$16)];
          case 22:var rest$17=fmtty$0[1];return [0,fmtty_of_fmt(rest$17)];
          case 23:
           var rest$18=fmtty$0[2],ign=fmtty$0[1];
           if(typeof ign === "number")
            switch(ign)
             {case 0:var fmtty$0=rest$18;continue;
              case 1:var fmtty$0=rest$18;continue;
              case 2:return [14,fmtty_of_fmt(rest$18)];
              default:var fmtty$0=rest$18;continue}
           else
            switch(ign[0])
             {case 0:var fmtty$0=rest$18;continue;
              case 1:var fmtty$0=rest$18;continue;
              case 2:var fmtty$0=rest$18;continue;
              case 3:var fmtty$0=rest$18;continue;
              case 4:var fmtty$0=rest$18;continue;
              case 5:var fmtty$0=rest$18;continue;
              case 6:var fmtty$0=rest$18;continue;
              case 7:var fmtty$0=rest$18;continue;
              case 8:var fmtty$0=rest$18;continue;
              case 9:
               var fmtty$5=ign[2];
               return concat_fmtty(fmtty$5,fmtty_of_fmt(rest$18));
              case 10:var fmtty$0=rest$18;continue;
              default:var fmtty$0=rest$18;continue}
          default:
           var rest$19=fmtty$0[3],arity=fmtty$0[1];
           return fmtty_of_custom(arity,fmtty_of_fmt(rest$19))}}
    var
     Type_mismatch=
      [248,cst_CamlinternalFormat_Type_mi,caml_fresh_oo_id(0)];
    function type_padding(pad,fmtty)
     {if(typeof pad === "number")
       return [0,0,fmtty];
      else
       {if(0 === pad[0])
         {var w=pad[2],padty=pad[1];return [0,[0,padty,w],fmtty]}
        if(typeof fmtty !== "number" && 2 === fmtty[0])
         {var rest=fmtty[1],padty$0=pad[1];return [0,[1,padty$0],rest]}
        throw Type_mismatch}}
    function type_padprec(pad,prec,fmtty)
     {var match=type_padding(pad,fmtty);
      if(typeof prec === "number")
       {if(prec)
         {var _t3_=match[2];
          if(typeof _t3_ !== "number" && 2 === _t3_[0])
           {var rest=_t3_[1],pad$0=match[1];return [0,pad$0,1,rest]}
          throw Type_mismatch}
        var rest$0=match[2],pad$1=match[1];
        return [0,pad$1,0,rest$0]}
      var rest$1=match[2],pad$2=match[1],p=prec[1];
      return [0,pad$2,[0,p],rest$1]}
    function type_ignored_format_substituti(sub_fmtty,fmt,fmtty)
     {if(typeof sub_fmtty === "number")
       return [0,0,type_format_gen(fmt,fmtty)];
      else
       switch(sub_fmtty[0])
        {case 0:
          if(typeof fmtty !== "number" && 0 === fmtty[0])
           {var
             fmtty_rest=fmtty[1],
             sub_fmtty_rest=sub_fmtty[1],
             match=
              type_ignored_format_substituti(sub_fmtty_rest,fmt,fmtty_rest),
             fmt$0=match[2],
             sub_fmtty_rest$0=match[1];
            return [0,[0,sub_fmtty_rest$0],fmt$0]}
          break;
         case 1:
          if(typeof fmtty !== "number" && 1 === fmtty[0])
           {var
             fmtty_rest$0=fmtty[1],
             sub_fmtty_rest$1=sub_fmtty[1],
             match$0=
              type_ignored_format_substituti
               (sub_fmtty_rest$1,fmt,fmtty_rest$0),
             fmt$1=match$0[2],
             sub_fmtty_rest$2=match$0[1];
            return [0,[1,sub_fmtty_rest$2],fmt$1]}
          break;
         case 2:
          if(typeof fmtty !== "number" && 2 === fmtty[0])
           {var
             fmtty_rest$1=fmtty[1],
             sub_fmtty_rest$3=sub_fmtty[1],
             match$1=
              type_ignored_format_substituti
               (sub_fmtty_rest$3,fmt,fmtty_rest$1),
             fmt$2=match$1[2],
             sub_fmtty_rest$4=match$1[1];
            return [0,[2,sub_fmtty_rest$4],fmt$2]}
          break;
         case 3:
          if(typeof fmtty !== "number" && 3 === fmtty[0])
           {var
             fmtty_rest$2=fmtty[1],
             sub_fmtty_rest$5=sub_fmtty[1],
             match$2=
              type_ignored_format_substituti
               (sub_fmtty_rest$5,fmt,fmtty_rest$2),
             fmt$3=match$2[2],
             sub_fmtty_rest$6=match$2[1];
            return [0,[3,sub_fmtty_rest$6],fmt$3]}
          break;
         case 4:
          if(typeof fmtty !== "number" && 4 === fmtty[0])
           {var
             fmtty_rest$3=fmtty[1],
             sub_fmtty_rest$7=sub_fmtty[1],
             match$3=
              type_ignored_format_substituti
               (sub_fmtty_rest$7,fmt,fmtty_rest$3),
             fmt$4=match$3[2],
             sub_fmtty_rest$8=match$3[1];
            return [0,[4,sub_fmtty_rest$8],fmt$4]}
          break;
         case 5:
          if(typeof fmtty !== "number" && 5 === fmtty[0])
           {var
             fmtty_rest$4=fmtty[1],
             sub_fmtty_rest$9=sub_fmtty[1],
             match$4=
              type_ignored_format_substituti
               (sub_fmtty_rest$9,fmt,fmtty_rest$4),
             fmt$5=match$4[2],
             sub_fmtty_rest$10=match$4[1];
            return [0,[5,sub_fmtty_rest$10],fmt$5]}
          break;
         case 6:
          if(typeof fmtty !== "number" && 6 === fmtty[0])
           {var
             fmtty_rest$5=fmtty[1],
             sub_fmtty_rest$11=sub_fmtty[1],
             match$5=
              type_ignored_format_substituti
               (sub_fmtty_rest$11,fmt,fmtty_rest$5),
             fmt$6=match$5[2],
             sub_fmtty_rest$12=match$5[1];
            return [0,[6,sub_fmtty_rest$12],fmt$6]}
          break;
         case 7:
          if(typeof fmtty !== "number" && 7 === fmtty[0])
           {var
             fmtty_rest$6=fmtty[1],
             sub_fmtty_rest$13=sub_fmtty[1],
             match$6=
              type_ignored_format_substituti
               (sub_fmtty_rest$13,fmt,fmtty_rest$6),
             fmt$7=match$6[2],
             sub_fmtty_rest$14=match$6[1];
            return [0,[7,sub_fmtty_rest$14],fmt$7]}
          break;
         case 8:
          if(typeof fmtty !== "number" && 8 === fmtty[0])
           {var
             fmtty_rest$7=fmtty[2],
             sub2_fmtty=fmtty[1],
             sub_fmtty_rest$15=sub_fmtty[2],
             sub2_fmtty$0=sub_fmtty[1];
            if(caml_notequal([0,sub2_fmtty$0],[0,sub2_fmtty]))
             throw Type_mismatch;
            var
             match$7=
              type_ignored_format_substituti
               (sub_fmtty_rest$15,fmt,fmtty_rest$7),
             fmt$8=match$7[2],
             sub_fmtty_rest$16=match$7[1];
            return [0,[8,sub2_fmtty,sub_fmtty_rest$16],fmt$8]}
          break;
         case 9:
          if(typeof fmtty !== "number" && 9 === fmtty[0])
           {var
             fmtty_rest$8=fmtty[3],
             sub2_fmtty$1=fmtty[2],
             sub1_fmtty=fmtty[1],
             sub_fmtty_rest$17=sub_fmtty[3],
             sub2_fmtty$2=sub_fmtty[2],
             sub1_fmtty$0=sub_fmtty[1],
             _t1_=[0,erase_rel(sub1_fmtty)];
            if(caml_notequal([0,erase_rel(sub1_fmtty$0)],_t1_))
             throw Type_mismatch;
            var _t2_=[0,erase_rel(sub2_fmtty$1)];
            if(caml_notequal([0,erase_rel(sub2_fmtty$2)],_t2_))
             throw Type_mismatch;
            var
             sub_fmtty$0=trans(symm(sub1_fmtty),sub2_fmtty$1),
             match$8=fmtty_rel_det(sub_fmtty$0),
             f4=match$8[4],
             f2=match$8[2];
            caml_call1(f2,0);
            caml_call1(f4,0);
            var
             match$9=
              type_ignored_format_substituti
               (erase_rel(sub_fmtty_rest$17),fmt,fmtty_rest$8),
             fmt$9=match$9[2],
             sub_fmtty_rest$18=match$9[1];
            return [0,
                    [9,sub1_fmtty,sub2_fmtty$1,symm(sub_fmtty_rest$18)],
                    fmt$9]}
          break;
         case 10:
          if(typeof fmtty !== "number" && 10 === fmtty[0])
           {var
             fmtty_rest$9=fmtty[1],
             sub_fmtty_rest$19=sub_fmtty[1],
             match$10=
              type_ignored_format_substituti
               (sub_fmtty_rest$19,fmt,fmtty_rest$9),
             fmt$10=match$10[2],
             sub_fmtty_rest$20=match$10[1];
            return [0,[10,sub_fmtty_rest$20],fmt$10]}
          break;
         case 11:
          if(typeof fmtty !== "number" && 11 === fmtty[0])
           {var
             fmtty_rest$10=fmtty[1],
             sub_fmtty_rest$21=sub_fmtty[1],
             match$11=
              type_ignored_format_substituti
               (sub_fmtty_rest$21,fmt,fmtty_rest$10),
             fmt$11=match$11[2],
             sub_fmtty_rest$22=match$11[1];
            return [0,[11,sub_fmtty_rest$22],fmt$11]}
          break;
         case 13:
          if(typeof fmtty !== "number" && 13 === fmtty[0])
           {var
             fmtty_rest$11=fmtty[1],
             sub_fmtty_rest$23=sub_fmtty[1],
             match$12=
              type_ignored_format_substituti
               (sub_fmtty_rest$23,fmt,fmtty_rest$11),
             fmt$12=match$12[2],
             sub_fmtty_rest$24=match$12[1];
            return [0,[13,sub_fmtty_rest$24],fmt$12]}
          break;
         case 14:
          if(typeof fmtty !== "number" && 14 === fmtty[0])
           {var
             fmtty_rest$12=fmtty[1],
             sub_fmtty_rest$25=sub_fmtty[1],
             match$13=
              type_ignored_format_substituti
               (sub_fmtty_rest$25,fmt,fmtty_rest$12),
             fmt$13=match$13[2],
             sub_fmtty_rest$26=match$13[1];
            return [0,[14,sub_fmtty_rest$26],fmt$13]}
          break
         }
      throw Type_mismatch}
    function type_format_gen(fmt,fmtty)
     {if(typeof fmt === "number")
       return [0,0,fmtty];
      else
       switch(fmt[0])
        {case 0:
          if(typeof fmtty !== "number" && 0 === fmtty[0])
           {var
             fmtty_rest=fmtty[1],
             fmt_rest=fmt[1],
             match=type_format_gen(fmt_rest,fmtty_rest),
             fmtty$0=match[2],
             fmt$0=match[1];
            return [0,[0,fmt$0],fmtty$0]}
          break;
         case 1:
          if(typeof fmtty !== "number" && 0 === fmtty[0])
           {var
             fmtty_rest$0=fmtty[1],
             fmt_rest$0=fmt[1],
             match$0=type_format_gen(fmt_rest$0,fmtty_rest$0),
             fmtty$1=match$0[2],
             fmt$1=match$0[1];
            return [0,[1,fmt$1],fmtty$1]}
          break;
         case 2:
          var
           fmt_rest$1=fmt[2],
           pad=fmt[1],
           match$1=type_padding(pad,fmtty),
           _tK_=match$1[2],
           _tJ_=match$1[1];
          if(typeof _tK_ !== "number" && 1 === _tK_[0])
           {var
             fmtty_rest$1=_tK_[1],
             match$2=type_format_gen(fmt_rest$1,fmtty_rest$1),
             fmtty$2=match$2[2],
             fmt$2=match$2[1];
            return [0,[2,_tJ_,fmt$2],fmtty$2]}
          throw Type_mismatch;
         case 3:
          var
           fmt_rest$2=fmt[2],
           pad$0=fmt[1],
           match$3=type_padding(pad$0,fmtty),
           _tM_=match$3[2],
           _tL_=match$3[1];
          if(typeof _tM_ !== "number" && 1 === _tM_[0])
           {var
             fmtty_rest$2=_tM_[1],
             match$4=type_format_gen(fmt_rest$2,fmtty_rest$2),
             fmtty$3=match$4[2],
             fmt$3=match$4[1];
            return [0,[3,_tL_,fmt$3],fmtty$3]}
          throw Type_mismatch;
         case 4:
          var
           fmt_rest$3=fmt[4],
           prec=fmt[3],
           pad$1=fmt[2],
           iconv=fmt[1],
           match$5=type_padprec(pad$1,prec,fmtty),
           _tO_=match$5[3],
           _tN_=match$5[1];
          if(typeof _tO_ !== "number" && 2 === _tO_[0])
           {var
             fmtty_rest$3=_tO_[1],
             prec$0=match$5[2],
             match$6=type_format_gen(fmt_rest$3,fmtty_rest$3),
             fmtty$4=match$6[2],
             fmt$4=match$6[1];
            return [0,[4,iconv,_tN_,prec$0,fmt$4],fmtty$4]}
          throw Type_mismatch;
         case 5:
          var
           fmt_rest$4=fmt[4],
           prec$1=fmt[3],
           pad$2=fmt[2],
           iconv$0=fmt[1],
           match$7=type_padprec(pad$2,prec$1,fmtty),
           _tQ_=match$7[3],
           _tP_=match$7[1];
          if(typeof _tQ_ !== "number" && 3 === _tQ_[0])
           {var
             fmtty_rest$4=_tQ_[1],
             prec$2=match$7[2],
             match$8=type_format_gen(fmt_rest$4,fmtty_rest$4),
             fmtty$5=match$8[2],
             fmt$5=match$8[1];
            return [0,[5,iconv$0,_tP_,prec$2,fmt$5],fmtty$5]}
          throw Type_mismatch;
         case 6:
          var
           fmt_rest$5=fmt[4],
           prec$3=fmt[3],
           pad$3=fmt[2],
           iconv$1=fmt[1],
           match$9=type_padprec(pad$3,prec$3,fmtty),
           _tS_=match$9[3],
           _tR_=match$9[1];
          if(typeof _tS_ !== "number" && 4 === _tS_[0])
           {var
             fmtty_rest$5=_tS_[1],
             prec$4=match$9[2],
             match$10=type_format_gen(fmt_rest$5,fmtty_rest$5),
             fmtty$6=match$10[2],
             fmt$6=match$10[1];
            return [0,[6,iconv$1,_tR_,prec$4,fmt$6],fmtty$6]}
          throw Type_mismatch;
         case 7:
          var
           fmt_rest$6=fmt[4],
           prec$5=fmt[3],
           pad$4=fmt[2],
           iconv$2=fmt[1],
           match$11=type_padprec(pad$4,prec$5,fmtty),
           _tU_=match$11[3],
           _tT_=match$11[1];
          if(typeof _tU_ !== "number" && 5 === _tU_[0])
           {var
             fmtty_rest$6=_tU_[1],
             prec$6=match$11[2],
             match$12=type_format_gen(fmt_rest$6,fmtty_rest$6),
             fmtty$7=match$12[2],
             fmt$7=match$12[1];
            return [0,[7,iconv$2,_tT_,prec$6,fmt$7],fmtty$7]}
          throw Type_mismatch;
         case 8:
          var
           fmt_rest$7=fmt[4],
           prec$7=fmt[3],
           pad$5=fmt[2],
           fconv=fmt[1],
           match$13=type_padprec(pad$5,prec$7,fmtty),
           _tW_=match$13[3],
           _tV_=match$13[1];
          if(typeof _tW_ !== "number" && 6 === _tW_[0])
           {var
             fmtty_rest$7=_tW_[1],
             prec$8=match$13[2],
             match$14=type_format_gen(fmt_rest$7,fmtty_rest$7),
             fmtty$8=match$14[2],
             fmt$8=match$14[1];
            return [0,[8,fconv,_tV_,prec$8,fmt$8],fmtty$8]}
          throw Type_mismatch;
         case 9:
          var
           fmt_rest$8=fmt[2],
           pad$6=fmt[1],
           match$15=type_padding(pad$6,fmtty),
           _tY_=match$15[2],
           _tX_=match$15[1];
          if(typeof _tY_ !== "number" && 7 === _tY_[0])
           {var
             fmtty_rest$8=_tY_[1],
             match$16=type_format_gen(fmt_rest$8,fmtty_rest$8),
             fmtty$9=match$16[2],
             fmt$9=match$16[1];
            return [0,[9,_tX_,fmt$9],fmtty$9]}
          throw Type_mismatch;
         case 10:
          var
           fmt_rest$9=fmt[1],
           match$17=type_format_gen(fmt_rest$9,fmtty),
           fmtty$10=match$17[2],
           fmt$10=match$17[1];
          return [0,[10,fmt$10],fmtty$10];
         case 11:
          var
           fmt_rest$10=fmt[2],
           str=fmt[1],
           match$18=type_format_gen(fmt_rest$10,fmtty),
           fmtty$11=match$18[2],
           fmt$11=match$18[1];
          return [0,[11,str,fmt$11],fmtty$11];
         case 12:
          var
           fmt_rest$11=fmt[2],
           chr=fmt[1],
           match$19=type_format_gen(fmt_rest$11,fmtty),
           fmtty$12=match$19[2],
           fmt$12=match$19[1];
          return [0,[12,chr,fmt$12],fmtty$12];
         case 13:
          if(typeof fmtty !== "number" && 8 === fmtty[0])
           {var
             fmtty_rest$9=fmtty[2],
             sub_fmtty=fmtty[1],
             fmt_rest$12=fmt[3],
             sub_fmtty$0=fmt[2],
             pad_opt=fmt[1];
            if(caml_notequal([0,sub_fmtty$0],[0,sub_fmtty]))
             throw Type_mismatch;
            var
             match$20=type_format_gen(fmt_rest$12,fmtty_rest$9),
             fmtty$13=match$20[2],
             fmt$13=match$20[1];
            return [0,[13,pad_opt,sub_fmtty,fmt$13],fmtty$13]}
          break;
         case 14:
          if(typeof fmtty !== "number" && 9 === fmtty[0])
           {var
             fmtty_rest$10=fmtty[3],
             sub_fmtty1=fmtty[1],
             fmt_rest$13=fmt[3],
             sub_fmtty$1=fmt[2],
             pad_opt$0=fmt[1],
             _tZ_=[0,erase_rel(sub_fmtty1)];
            if(caml_notequal([0,erase_rel(sub_fmtty$1)],_tZ_))
             throw Type_mismatch;
            var
             match$21=type_format_gen(fmt_rest$13,erase_rel(fmtty_rest$10)),
             fmtty$14=match$21[2],
             fmt$14=match$21[1];
            return [0,[14,pad_opt$0,sub_fmtty1,fmt$14],fmtty$14]}
          break;
         case 15:
          if(typeof fmtty !== "number" && 10 === fmtty[0])
           {var
             fmtty_rest$11=fmtty[1],
             fmt_rest$14=fmt[1],
             match$22=type_format_gen(fmt_rest$14,fmtty_rest$11),
             fmtty$15=match$22[2],
             fmt$15=match$22[1];
            return [0,[15,fmt$15],fmtty$15]}
          break;
         case 16:
          if(typeof fmtty !== "number" && 11 === fmtty[0])
           {var
             fmtty_rest$12=fmtty[1],
             fmt_rest$15=fmt[1],
             match$23=type_format_gen(fmt_rest$15,fmtty_rest$12),
             fmtty$16=match$23[2],
             fmt$16=match$23[1];
            return [0,[16,fmt$16],fmtty$16]}
          break;
         case 17:
          var
           fmt_rest$16=fmt[2],
           formatting_lit=fmt[1],
           match$24=type_format_gen(fmt_rest$16,fmtty),
           fmtty$17=match$24[2],
           fmt$17=match$24[1];
          return [0,[17,formatting_lit,fmt$17],fmtty$17];
         case 18:
          var fmt_rest$17=fmt[2],formatting_gen=fmt[1];
          if(0 === formatting_gen[0])
           {var
             match$28=formatting_gen[1],
             str$0=match$28[2],
             fmt1=match$28[1],
             match$29=type_format_gen(fmt1,fmtty),
             fmtty2=match$29[2],
             fmt2=match$29[1],
             match$30=type_format_gen(fmt_rest$17,fmtty2),
             fmtty3=match$30[2],
             fmt3=match$30[1];
            return [0,[18,[0,[0,fmt2,str$0]],fmt3],fmtty3]}
          var
           match$31=formatting_gen[1],
           str$1=match$31[2],
           fmt1$0=match$31[1],
           match$32=type_format_gen(fmt1$0,fmtty),
           fmtty2$0=match$32[2],
           fmt2$0=match$32[1],
           match$33=type_format_gen(fmt_rest$17,fmtty2$0),
           fmtty3$0=match$33[2],
           fmt3$0=match$33[1];
          return [0,[18,[1,[0,fmt2$0,str$1]],fmt3$0],fmtty3$0];
         case 19:
          if(typeof fmtty !== "number" && 13 === fmtty[0])
           {var
             fmtty_rest$13=fmtty[1],
             fmt_rest$18=fmt[1],
             match$25=type_format_gen(fmt_rest$18,fmtty_rest$13),
             fmtty$18=match$25[2],
             fmt$18=match$25[1];
            return [0,[19,fmt$18],fmtty$18]}
          break;
         case 20:
          if(typeof fmtty !== "number" && 1 === fmtty[0])
           {var
             fmtty_rest$14=fmtty[1],
             fmt_rest$19=fmt[3],
             char_set=fmt[2],
             width_opt=fmt[1],
             match$26=type_format_gen(fmt_rest$19,fmtty_rest$14),
             fmtty$19=match$26[2],
             fmt$19=match$26[1];
            return [0,[20,width_opt,char_set,fmt$19],fmtty$19]}
          break;
         case 21:
          if(typeof fmtty !== "number" && 2 === fmtty[0])
           {var
             fmtty_rest$15=fmtty[1],
             fmt_rest$20=fmt[2],
             counter=fmt[1],
             match$27=type_format_gen(fmt_rest$20,fmtty_rest$15),
             fmtty$20=match$27[2],
             fmt$20=match$27[1];
            return [0,[21,counter,fmt$20],fmtty$20]}
          break;
         case 23:
          var rest=fmt[2],ign=fmt[1];
          if(typeof ign === "number")
           switch(ign)
            {case 0:return type_ignored_param_one(ign,rest,fmtty);
             case 1:return type_ignored_param_one(ign,rest,fmtty);
             case 2:
              if(typeof fmtty !== "number" && 14 === fmtty[0])
               {var
                 fmtty_rest$16=fmtty[1],
                 match$34=type_format_gen(rest,fmtty_rest$16),
                 fmtty$21=match$34[2],
                 fmt$21=match$34[1];
                return [0,[23,2,fmt$21],fmtty$21]}
              throw Type_mismatch;
             default:return type_ignored_param_one(ign,rest,fmtty)}
          else
           switch(ign[0])
            {case 0:return type_ignored_param_one(ign,rest,fmtty);
             case 1:return type_ignored_param_one(ign,rest,fmtty);
             case 2:return type_ignored_param_one(ign,rest,fmtty);
             case 3:return type_ignored_param_one(ign,rest,fmtty);
             case 4:return type_ignored_param_one(ign,rest,fmtty);
             case 5:return type_ignored_param_one(ign,rest,fmtty);
             case 6:return type_ignored_param_one(ign,rest,fmtty);
             case 7:return type_ignored_param_one(ign,rest,fmtty);
             case 8:
              var sub_fmtty$2=ign[2],pad_opt$1=ign[1];
              return type_ignored_param_one
                      ([8,pad_opt$1,sub_fmtty$2],rest,fmtty);
             case 9:
              var
               sub_fmtty$3=ign[2],
               pad_opt$2=ign[1],
               _t0_=type_ignored_format_substituti(sub_fmtty$3,rest,fmtty),
               match$35=_t0_[2],
               fmtty$22=match$35[2],
               fmt$22=match$35[1],
               sub_fmtty$4=_t0_[1];
              return [0,[23,[9,pad_opt$2,sub_fmtty$4],fmt$22],fmtty$22];
             case 10:return type_ignored_param_one(ign,rest,fmtty);
             default:return type_ignored_param_one(ign,rest,fmtty)}
         }
      throw Type_mismatch}
    function type_ignored_param_one(ign,fmt,fmtty)
     {var match=type_format_gen(fmt,fmtty),fmtty$0=match[2],fmt$0=match[1];
      return [0,[23,ign,fmt$0],fmtty$0]}
    function type_format(fmt,fmtty)
     {var _tI_=type_format_gen(fmt,fmtty);
      if(typeof _tI_[2] === "number"){var fmt$0=_tI_[1];return fmt$0}
      throw Type_mismatch}
    function recast(fmt,fmtty){return type_format(fmt,erase_rel(symm(fmtty)))}
    function fix_padding(padty,width,str)
     {var
       len=caml_ml_string_length(str),
       padty$0=0 <= width?padty:0,
       width$0=abs(width);
      if(width$0 <= len)return str;
      var _tH_=2 === padty$0?48:32,res=make$0(width$0,_tH_);
      switch(padty$0)
       {case 0:blit$0(str,0,res,0,len);break;
        case 1:blit$0(str,0,res,width$0 - len | 0,len);break;
        default:
         var switch$0=0;
         if(0 < len)
          {var switch$1=0;
           if
            (43
             !==
             caml_string_get(str,0)
             &&
             45
             !==
             caml_string_get(str,0)
             &&
             32
             !==
             caml_string_get(str,0))
            {switch$0 = 1;switch$1 = 1}
           if(! switch$1)
            {caml_bytes_set(res,0,caml_string_get(str,0));
             blit$0(str,1,res,(width$0 - len | 0) + 1 | 0,len - 1 | 0)}}
         else
          switch$0 = 1;
         if(switch$0)
          {var switch$2=0;
           if(1 < len && 48 === caml_string_get(str,0))
            {var switch$3=0;
             if
              (120
               !==
               caml_string_get(str,1)
               &&
               88
               !==
               caml_string_get(str,1))
              {switch$2 = 1;switch$3 = 1}
             if(! switch$3)
              {caml_bytes_set(res,1,caml_string_get(str,1));
               blit$0(str,2,res,(width$0 - len | 0) + 2 | 0,len - 2 | 0)}}
           else
            switch$2 = 1;
           if(switch$2)blit$0(str,0,res,width$0 - len | 0,len)}}
      return caml_string_of_bytes(res)}
    function fix_int_precision(prec,str)
     {var
       prec$0=abs(prec),
       len=caml_ml_string_length(str),
       c=caml_string_get(str,0),
       switch$0=0;
      if(58 <= c)
       {if(71 <= c)
         {if(! (5 < c - 97 >>> 0))switch$0 = 1}
        else
         if(65 <= c)switch$0 = 1}
      else
       {var switch$1=0;
        if(32 !== c)
         if(43 <= c)
          switch(c - 43 | 0)
           {case 5:
             if(len < (prec$0 + 2 | 0) && 1 < len)
              {var switch$2=0;
               if
                (120
                 ===
                 caml_string_get(str,1)
                 ||
                 88
                 ===
                 caml_string_get(str,1))
                switch$2 = 1;
               if(switch$2)
                {var res$1=make$0(prec$0 + 2 | 0,48);
                 caml_bytes_set(res$1,1,caml_string_get(str,1));
                 blit$0(str,2,res$1,(prec$0 - len | 0) + 4 | 0,len - 2 | 0);
                 return caml_string_of_bytes(res$1)}}
             switch$0 = 1;
             switch$1 = 1;
             break;
            case 0:
            case 2:break;
            case 1:
            case 3:
            case 4:switch$1 = 1;break;
            default:switch$0 = 1;switch$1 = 1}
         else
          switch$1 = 1;
        if(! switch$1 && len < (prec$0 + 1 | 0))
         {var res$0=make$0(prec$0 + 1 | 0,48);
          caml_bytes_set(res$0,0,c);
          blit$0(str,1,res$0,(prec$0 - len | 0) + 2 | 0,len - 1 | 0);
          return caml_string_of_bytes(res$0)}}
      if(switch$0 && len < prec$0)
       {var res=make$0(prec$0,48);
        blit$0(str,0,res,prec$0 - len | 0,len);
        return caml_string_of_bytes(res)}
      return str}
    function string_to_caml_string(str)
     {var
       str$0=escaped$1(str),
       l=caml_ml_string_length(str$0),
       res=make$0(l + 2 | 0,34);
      caml_blit_string(str$0,0,res,1,l);
      return caml_string_of_bytes(res)}
    function format_of_fconv(fconv,prec)
     {var
       prec$0=abs(prec),
       symb=char_of_fconv(_ax_,fconv),
       buf=buffer_create(16);
      buffer_add_char(buf,37);
      bprint_fconv_flag(buf,fconv);
      buffer_add_char(buf,46);
      buffer_add_string(buf,caml_string_of_jsbytes("" + prec$0));
      buffer_add_char(buf,symb);
      return buffer_contents(buf)}
    function transform_int_alt(iconv,s)
     {if(13 <= iconv)
       {var n=[0,0],_tC_=caml_ml_string_length(s) - 1 | 0,_tB_=0;
        if(! (_tC_ < 0))
         {var i$0=_tB_;
          for(;;)
           {var match=caml_string_unsafe_get(s,i$0);
            if(! (9 < match - 48 >>> 0))n[1]++;
            var _tG_=i$0 + 1 | 0;
            if(_tC_ !== i$0){var i$0=_tG_;continue}
            break}}
        var
         digits=n[1],
         buf=
          caml_create_bytes
           (caml_ml_string_length(s) + ((digits - 1 | 0) / 3 | 0) | 0),
         pos=[0,0],
         put=function(c){caml_bytes_set(buf,pos[1],c);pos[1]++;return 0},
         left=[0,((digits - 1 | 0) % 3 | 0) + 1 | 0],
         _tE_=caml_ml_string_length(s) - 1 | 0,
         _tD_=0;
        if(! (_tE_ < 0))
         {var i=_tD_;
          for(;;)
           {var c=caml_string_unsafe_get(s,i);
            if(9 < c - 48 >>> 0)
             put(c);
            else
             {if(0 === left[1]){put(95);left[1] = 3}left[1] += -1;put(c)}
            var _tF_=i + 1 | 0;
            if(_tE_ !== i){var i=_tF_;continue}
            break}}
        return caml_string_of_bytes(buf)}
      return s}
    function convert_int(iconv,n)
     {switch(iconv)
       {case 1:var _tA_=cst_d$3;break;
        case 2:var _tA_=cst_d$4;break;
        case 4:var _tA_=cst_i$1;break;
        case 5:var _tA_=cst_i$2;break;
        case 6:var _tA_=cst_x;break;
        case 7:var _tA_=cst_x$0;break;
        case 8:var _tA_=cst_X$0;break;
        case 9:var _tA_=cst_X$1;break;
        case 10:var _tA_=cst_o;break;
        case 11:var _tA_=cst_o$0;break;
        case 0:
        case 13:var _tA_=cst_d$2;break;
        case 3:
        case 14:var _tA_=cst_i$0;break;
        default:var _tA_=cst_u}
      return transform_int_alt(iconv,caml_format_int(_tA_,n))}
    function convert_int32(iconv,n)
     {switch(iconv)
       {case 1:var _tz_=cst_ld$0;break;
        case 2:var _tz_=cst_ld$1;break;
        case 4:var _tz_=cst_li$1;break;
        case 5:var _tz_=cst_li$2;break;
        case 6:var _tz_=cst_lx;break;
        case 7:var _tz_=cst_lx$0;break;
        case 8:var _tz_=cst_lX;break;
        case 9:var _tz_=cst_lX$0;break;
        case 10:var _tz_=cst_lo;break;
        case 11:var _tz_=cst_lo$0;break;
        case 0:
        case 13:var _tz_=cst_ld;break;
        case 3:
        case 14:var _tz_=cst_li$0;break;
        default:var _tz_=cst_lu}
      return transform_int_alt(iconv,caml_format_int(_tz_,n))}
    function convert_nativeint(iconv,n)
     {switch(iconv)
       {case 1:var _ty_=cst_nd$0;break;
        case 2:var _ty_=cst_nd$1;break;
        case 4:var _ty_=cst_ni$1;break;
        case 5:var _ty_=cst_ni$2;break;
        case 6:var _ty_=cst_nx;break;
        case 7:var _ty_=cst_nx$0;break;
        case 8:var _ty_=cst_nX;break;
        case 9:var _ty_=cst_nX$0;break;
        case 10:var _ty_=cst_no;break;
        case 11:var _ty_=cst_no$0;break;
        case 0:
        case 13:var _ty_=cst_nd;break;
        case 3:
        case 14:var _ty_=cst_ni$0;break;
        default:var _ty_=cst_nu}
      return transform_int_alt(iconv,caml_format_int(_ty_,n))}
    function convert_int64(iconv,n)
     {switch(iconv)
       {case 1:var _tx_=cst_Ld$0;break;
        case 2:var _tx_=cst_Ld$1;break;
        case 4:var _tx_=cst_Li$1;break;
        case 5:var _tx_=cst_Li$2;break;
        case 6:var _tx_=cst_Lx;break;
        case 7:var _tx_=cst_Lx$0;break;
        case 8:var _tx_=cst_LX;break;
        case 9:var _tx_=cst_LX$0;break;
        case 10:var _tx_=cst_Lo;break;
        case 11:var _tx_=cst_Lo$0;break;
        case 0:
        case 13:var _tx_=cst_Ld;break;
        case 3:
        case 14:var _tx_=cst_Li$0;break;
        default:var _tx_=cst_Lu}
      return transform_int_alt(iconv,caml_int64_format(_tx_,n))}
    function convert_float(fconv,prec,x)
     {function hex(param)
       {switch(fconv[1])
         {case 0:var sign=45;break;
          case 1:var sign=43;break;
          default:var sign=32}
        return runtime.caml_hexstring_of_float(x,prec,sign)}
      function caml_special_val(str)
       {var match=runtime.caml_classify_float(x);
        return 3 === match
                ?x < 0.?cst_neg_infinity:cst_infinity
                :4 <= match?cst_nan:str}
      switch(fconv[2])
       {case 5:
         var
          str=caml_format_float(format_of_fconv(fconv,prec),x),
          len=caml_ml_string_length(str),
          i=0;
         for(;;)
          {if(i === len)
            var _tv_=0;
           else
            {var match=caml_string_get(str,i),_tu_=match - 46 | 0,switch$0=0;
             if(23 < _tu_ >>> 0)
              {if(55 === _tu_)switch$0 = 1}
             else
              if(21 < _tu_ - 1 >>> 0)switch$0 = 1;
             if(! switch$0){var i$0=i + 1 | 0,i=i$0;continue}
             var _tv_=1}
           var _tw_=_tv_?str:cat(str,cst$29);
           return caml_special_val(_tw_)}
        case 6:return hex(0);
        case 7:return uppercase_ascii$1(hex(0));
        case 8:return caml_special_val(hex(0));
        default:return caml_format_float(format_of_fconv(fconv,prec),x)}}
    function string_of_fmtty(fmtty)
     {var buf=buffer_create(16);
      bprint_fmtty(buf,fmtty);
      return buffer_contents(buf)}
    function make_printf$0(counter,k,acc,fmt)
     {var k$0=k,acc$0=acc,fmt$0=fmt;
      for(;;)
       if(typeof fmt$0 === "number")
        return caml_call1(k$0,acc$0);
       else
        switch(fmt$0[0])
         {case 0:
           var rest=fmt$0[1];
           return function(c)
            {var new_acc=[5,acc$0,c];return make_printf(k$0,new_acc,rest)};
          case 1:
           var rest$0=fmt$0[1];
           return function(c)
            {var
              str=escaped(c),
              l=caml_ml_string_length(str),
              res=make$0(l + 2 | 0,39);
             caml_blit_string(str,0,res,1,l);
             var new_acc=[4,acc$0,caml_string_of_bytes(res)];
             return make_printf(k$0,new_acc,rest$0)};
          case 2:
           var rest$1=fmt$0[2],pad=fmt$0[1];
           return make_padding(k$0,acc$0,rest$1,pad,function(str){return str});
          case 3:
           var rest$2=fmt$0[2],pad$0=fmt$0[1];
           return make_padding(k$0,acc$0,rest$2,pad$0,string_to_caml_string);
          case 4:
           var rest$3=fmt$0[4],prec=fmt$0[3],pad$1=fmt$0[2],iconv=fmt$0[1];
           return make_int_padding_precision
                   (k$0,acc$0,rest$3,pad$1,prec,convert_int,iconv);
          case 5:
           var
            rest$4=fmt$0[4],
            prec$0=fmt$0[3],
            pad$2=fmt$0[2],
            iconv$0=fmt$0[1];
           return make_int_padding_precision
                   (k$0,acc$0,rest$4,pad$2,prec$0,convert_int32,iconv$0);
          case 6:
           var
            rest$5=fmt$0[4],
            prec$1=fmt$0[3],
            pad$3=fmt$0[2],
            iconv$1=fmt$0[1];
           return make_int_padding_precision
                   (k$0,acc$0,rest$5,pad$3,prec$1,convert_nativeint,iconv$1);
          case 7:
           var
            rest$6=fmt$0[4],
            prec$2=fmt$0[3],
            pad$4=fmt$0[2],
            iconv$2=fmt$0[1];
           return make_int_padding_precision
                   (k$0,acc$0,rest$6,pad$4,prec$2,convert_int64,iconv$2);
          case 8:
           var rest$7=fmt$0[4],prec$3=fmt$0[3],pad$5=fmt$0[2],fconv=fmt$0[1];
           if(typeof pad$5 === "number")
            {if(typeof prec$3 === "number")
              return prec$3
                      ?function(p,x)
                        {var str=convert_float(fconv,p,x);
                         return make_printf(k$0,[4,acc$0,str],rest$7)}
                      :function(x)
                        {var
                          str=
                           convert_float(fconv,default_float_precision(fconv),x);
                         return make_printf(k$0,[4,acc$0,str],rest$7)};
             var p=prec$3[1];
             return function(x)
              {var str=convert_float(fconv,p,x);
               return make_printf(k$0,[4,acc$0,str],rest$7)}}
           else
            {if(0 === pad$5[0])
              {var _tr_=pad$5[2],_ts_=pad$5[1];
               if(typeof prec$3 === "number")
                return prec$3
                        ?function(p,x)
                          {var str=fix_padding(_ts_,_tr_,convert_float(fconv,p,x));
                           return make_printf(k$0,[4,acc$0,str],rest$7)}
                        :function(x)
                          {var
                            str=convert_float(fconv,default_float_precision(fconv),x),
                            str$0=fix_padding(_ts_,_tr_,str);
                           return make_printf(k$0,[4,acc$0,str$0],rest$7)};
               var p$0=prec$3[1];
               return function(x)
                {var str=fix_padding(_ts_,_tr_,convert_float(fconv,p$0,x));
                 return make_printf(k$0,[4,acc$0,str],rest$7)}}
             var _tt_=pad$5[1];
             if(typeof prec$3 === "number")
              return prec$3
                      ?function(w,p,x)
                        {var str=fix_padding(_tt_,w,convert_float(fconv,p,x));
                         return make_printf(k$0,[4,acc$0,str],rest$7)}
                      :function(w,x)
                        {var
                          str=convert_float(fconv,default_float_precision(fconv),x),
                          str$0=fix_padding(_tt_,w,str);
                         return make_printf(k$0,[4,acc$0,str$0],rest$7)};
             var p$1=prec$3[1];
             return function(w,x)
              {var str=fix_padding(_tt_,w,convert_float(fconv,p$1,x));
               return make_printf(k$0,[4,acc$0,str],rest$7)}}
          case 9:
           var rest$8=fmt$0[2],pad$6=fmt$0[1];
           return make_padding(k$0,acc$0,rest$8,pad$6,string_of_bool);
          case 10:
           var fmt$1=fmt$0[1],acc$1=[7,acc$0],acc$0=acc$1,fmt$0=fmt$1;
           continue;
          case 11:
           var
            fmt$2=fmt$0[2],
            str=fmt$0[1],
            acc$2=[2,acc$0,str],
            acc$0=acc$2,
            fmt$0=fmt$2;
           continue;
          case 12:
           var
            fmt$3=fmt$0[2],
            chr=fmt$0[1],
            acc$3=[3,acc$0,chr],
            acc$0=acc$3,
            fmt$0=fmt$3;
           continue;
          case 13:
           var
            rest$9=fmt$0[3],
            sub_fmtty=fmt$0[2],
            ty=string_of_fmtty(sub_fmtty);
           return function(str){return make_printf(k$0,[4,acc$0,ty],rest$9)};
          case 14:
           var rest$10=fmt$0[3],fmtty=fmt$0[2];
           return function(param)
            {var fmt=param[1];
             return make_printf
                     (k$0,acc$0,concat_fmt(recast(fmt,fmtty),rest$10))};
          case 15:
           var rest$11=fmt$0[1];
           return function(f,x)
            {return make_printf
                     (k$0,
                      [6,acc$0,function(o){return caml_call2(f,o,x)}],
                      rest$11)};
          case 16:
           var rest$12=fmt$0[1];
           return function(f){return make_printf(k$0,[6,acc$0,f],rest$12)};
          case 17:
           var
            fmt$4=fmt$0[2],
            fmting_lit=fmt$0[1],
            acc$4=[0,acc$0,fmting_lit],
            acc$0=acc$4,
            fmt$0=fmt$4;
           continue;
          case 18:
           var _tp_=fmt$0[1];
           if(0 === _tp_[0])
            {var
              rest$13=fmt$0[2],
              match=_tp_[1],
              fmt$5=match[1],
              k$3=
               function(acc,k,rest)
                {function k$0(kacc)
                  {return make_printf(k,[1,acc,[0,kacc]],rest)}
                 return k$0},
              k$1=k$3(acc$0,k$0,rest$13),
              k$0=k$1,
              acc$0=0,
              fmt$0=fmt$5;
             continue}
           var
            rest$14=fmt$0[2],
            match$0=_tp_[1],
            fmt$6=match$0[1],
            k$4=
             function(acc,k,rest)
              {function k$0(kacc){return make_printf(k,[1,acc,[1,kacc]],rest)}
               return k$0},
            k$2=k$4(acc$0,k$0,rest$14),
            k$0=k$2,
            acc$0=0,
            fmt$0=fmt$6;
           continue;
          case 19:throw [0,Assert_failure,_ay_];
          case 20:
           var rest$15=fmt$0[3],new_acc=[8,acc$0,cst_Printf_bad_conversion];
           return function(param){return make_printf(k$0,new_acc,rest$15)};
          case 21:
           var rest$16=fmt$0[2];
           return function(n)
            {var new_acc=[4,acc$0,caml_format_int(cst_u$0,n)];
             return make_printf(k$0,new_acc,rest$16)};
          case 22:
           var rest$17=fmt$0[1];
           return function(c)
            {var new_acc=[5,acc$0,c];return make_printf(k$0,new_acc,rest$17)};
          case 23:
           var rest$18=fmt$0[2],ign=fmt$0[1];
           if(counter < 50)
            {var counter$1=counter + 1 | 0;
             return make_ignored_param$0(counter$1,k$0,acc$0,ign,rest$18)}
           return caml_trampoline_return
                   (make_ignored_param$0,[0,k$0,acc$0,ign,rest$18]);
          default:
           var
            rest$19=fmt$0[3],
            f=fmt$0[2],
            arity=fmt$0[1],
            _tq_=caml_call1(f,0);
           if(counter < 50)
            {var counter$0=counter + 1 | 0;
             return make_custom$0(counter$0,k$0,acc$0,rest$19,arity,_tq_)}
           return caml_trampoline_return
                   (make_custom$0,[0,k$0,acc$0,rest$19,arity,_tq_])}}
    function make_ignored_param$0(counter,k,acc,ign,fmt)
     {if(typeof ign === "number")
       switch(ign)
        {case 0:
          if(counter < 50)
           {var counter$0=counter + 1 | 0;
            return make_invalid_arg(counter$0,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 1:
          if(counter < 50)
           {var counter$1=counter + 1 | 0;
            return make_invalid_arg(counter$1,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 2:throw [0,Assert_failure,_az_];
         default:
          if(counter < 50)
           {var counter$2=counter + 1 | 0;
            return make_invalid_arg(counter$2,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt])}
      else
       switch(ign[0])
        {case 0:
          if(counter < 50)
           {var counter$3=counter + 1 | 0;
            return make_invalid_arg(counter$3,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 1:
          if(counter < 50)
           {var counter$4=counter + 1 | 0;
            return make_invalid_arg(counter$4,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 2:
          if(counter < 50)
           {var counter$5=counter + 1 | 0;
            return make_invalid_arg(counter$5,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 3:
          if(counter < 50)
           {var counter$6=counter + 1 | 0;
            return make_invalid_arg(counter$6,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 4:
          if(counter < 50)
           {var counter$7=counter + 1 | 0;
            return make_invalid_arg(counter$7,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 5:
          if(counter < 50)
           {var counter$8=counter + 1 | 0;
            return make_invalid_arg(counter$8,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 6:
          if(counter < 50)
           {var counter$9=counter + 1 | 0;
            return make_invalid_arg(counter$9,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 7:
          if(counter < 50)
           {var counter$10=counter + 1 | 0;
            return make_invalid_arg(counter$10,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 8:
          if(counter < 50)
           {var counter$11=counter + 1 | 0;
            return make_invalid_arg(counter$11,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         case 9:
          var fmtty=ign[2];
          if(counter < 50)
           {var counter$14=counter + 1 | 0;
            return make_from_fmtty$0(counter$14,k,acc,fmtty,fmt)}
          return caml_trampoline_return(make_from_fmtty$0,[0,k,acc,fmtty,fmt]);
         case 10:
          if(counter < 50)
           {var counter$12=counter + 1 | 0;
            return make_invalid_arg(counter$12,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt]);
         default:
          if(counter < 50)
           {var counter$13=counter + 1 | 0;
            return make_invalid_arg(counter$13,k,acc,fmt)}
          return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt])}}
    function make_from_fmtty$0(counter,k,acc,fmtty,fmt)
     {if(typeof fmtty === "number")
       {if(counter < 50)
         {var counter$0=counter + 1 | 0;
          return make_invalid_arg(counter$0,k,acc,fmt)}
        return caml_trampoline_return(make_invalid_arg,[0,k,acc,fmt])}
      else
       switch(fmtty[0])
        {case 0:
          var rest=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest,fmt)};
         case 1:
          var rest$0=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$0,fmt)};
         case 2:
          var rest$1=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$1,fmt)};
         case 3:
          var rest$2=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$2,fmt)};
         case 4:
          var rest$3=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$3,fmt)};
         case 5:
          var rest$4=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$4,fmt)};
         case 6:
          var rest$5=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$5,fmt)};
         case 7:
          var rest$6=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$6,fmt)};
         case 8:
          var rest$7=fmtty[2];
          return function(param){return make_from_fmtty(k,acc,rest$7,fmt)};
         case 9:
          var
           rest$8=fmtty[3],
           ty2=fmtty[2],
           ty1=fmtty[1],
           ty=trans(symm(ty1),ty2);
          return function(param)
           {return make_from_fmtty(k,acc,concat_fmtty(ty,rest$8),fmt)};
         case 10:
          var rest$9=fmtty[1];
          return function(param,_to_)
           {return make_from_fmtty(k,acc,rest$9,fmt)};
         case 11:
          var rest$10=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$10,fmt)};
         case 12:
          var rest$11=fmtty[1];
          return function(param){return make_from_fmtty(k,acc,rest$11,fmt)};
         case 13:throw [0,Assert_failure,_aA_];
         default:throw [0,Assert_failure,_aB_]}}
    function make_invalid_arg(counter,k,acc,fmt)
     {var _tn_=[8,acc,cst_Printf_bad_conversion$0];
      if(counter < 50)
       {var counter$0=counter + 1 | 0;
        return make_printf$0(counter$0,k,_tn_,fmt)}
      return caml_trampoline_return(make_printf$0,[0,k,_tn_,fmt])}
    function make_custom$0(counter,k,acc,rest,arity,f)
     {if(arity)
       {var arity$0=arity[1];
        return function(x)
         {return make_custom(k,acc,rest,arity$0,caml_call1(f,x))}}
      var _tm_=[4,acc,f];
      if(counter < 50)
       {var counter$0=counter + 1 | 0;
        return make_printf$0(counter$0,k,_tm_,rest)}
      return caml_trampoline_return(make_printf$0,[0,k,_tm_,rest])}
    function make_printf(k,acc,fmt)
     {return caml_trampoline(make_printf$0(0,k,acc,fmt))}
    function make_ignored_param(k,acc,ign,fmt)
     {return caml_trampoline(make_ignored_param$0(0,k,acc,ign,fmt))}
    function make_from_fmtty(k,acc,fmtty,fmt)
     {return caml_trampoline(make_from_fmtty$0(0,k,acc,fmtty,fmt))}
    function make_custom(k,acc,rest,arity,f)
     {return caml_trampoline(make_custom$0(0,k,acc,rest,arity,f))}
    function make_padding(k,acc,fmt,pad,trans)
     {if(typeof pad === "number")
       return function(x)
        {var new_acc=[4,acc,caml_call1(trans,x)];
         return make_printf(k,new_acc,fmt)};
      else
       {if(0 === pad[0])
         {var width=pad[2],padty=pad[1];
          return function(x)
           {var new_acc=[4,acc,fix_padding(padty,width,caml_call1(trans,x))];
            return make_printf(k,new_acc,fmt)}}
        var padty$0=pad[1];
        return function(w,x)
         {var new_acc=[4,acc,fix_padding(padty$0,w,caml_call1(trans,x))];
          return make_printf(k,new_acc,fmt)}}}
    function make_int_padding_precision(k,acc,fmt,pad,prec,trans,iconv)
     {if(typeof pad === "number")
       {if(typeof prec === "number")
         return prec
                 ?function(p,x)
                   {var str=fix_int_precision(p,caml_call2(trans,iconv,x));
                    return make_printf(k,[4,acc,str],fmt)}
                 :function(x)
                   {var str=caml_call2(trans,iconv,x);
                    return make_printf(k,[4,acc,str],fmt)};
        var p=prec[1];
        return function(x)
         {var str=fix_int_precision(p,caml_call2(trans,iconv,x));
          return make_printf(k,[4,acc,str],fmt)}}
      else
       {if(0 === pad[0])
         {var _tj_=pad[2],_tk_=pad[1];
          if(typeof prec === "number")
           return prec
                   ?function(p,x)
                     {var
                       str=
                        fix_padding
                         (_tk_,_tj_,fix_int_precision(p,caml_call2(trans,iconv,x)));
                      return make_printf(k,[4,acc,str],fmt)}
                   :function(x)
                     {var str=fix_padding(_tk_,_tj_,caml_call2(trans,iconv,x));
                      return make_printf(k,[4,acc,str],fmt)};
          var p$0=prec[1];
          return function(x)
           {var
             str=
              fix_padding
               (_tk_,_tj_,fix_int_precision(p$0,caml_call2(trans,iconv,x)));
            return make_printf(k,[4,acc,str],fmt)}}
        var _tl_=pad[1];
        if(typeof prec === "number")
         return prec
                 ?function(w,p,x)
                   {var
                     str=
                      fix_padding
                       (_tl_,w,fix_int_precision(p,caml_call2(trans,iconv,x)));
                    return make_printf(k,[4,acc,str],fmt)}
                 :function(w,x)
                   {var str=fix_padding(_tl_,w,caml_call2(trans,iconv,x));
                    return make_printf(k,[4,acc,str],fmt)};
        var p$1=prec[1];
        return function(w,x)
         {var
           str=
            fix_padding
             (_tl_,w,fix_int_precision(p$1,caml_call2(trans,iconv,x)));
          return make_printf(k,[4,acc,str],fmt)}}}
    function make_iprintf$0(counter,k,o,fmt)
     {var k$0=k,fmt$0=fmt;
      for(;;)
       if(typeof fmt$0 === "number")
        return caml_call1(k$0,o);
       else
        switch(fmt$0[0])
         {case 0:
           var rest=fmt$0[1],_sA_=make_iprintf(k$0,o,rest);
           return function(_ti_){return _sA_};
          case 1:
           var rest$0=fmt$0[1],_sB_=make_iprintf(k$0,o,rest$0);
           return function(_th_){return _sB_};
          case 2:
           var _sC_=fmt$0[1];
           if(typeof _sC_ === "number")
            {var rest$1=fmt$0[2],_sD_=make_iprintf(k$0,o,rest$1);
             return function(_td_){return _sD_}}
           else
            {if(0 === _sC_[0])
              {var rest$2=fmt$0[2],_sE_=make_iprintf(k$0,o,rest$2);
               return function(_tg_){return _sE_}}
             var
              rest$3=fmt$0[2],
              _sF_=make_iprintf(k$0,o,rest$3),
              _sG_=function(_tf_){return _sF_};
             return function(_te_){return _sG_}}
          case 3:
           var _sH_=fmt$0[1];
           if(typeof _sH_ === "number")
            {var rest$4=fmt$0[2],_sI_=make_iprintf(k$0,o,rest$4);
             return function(_s$_){return _sI_}}
           else
            {if(0 === _sH_[0])
              {var rest$5=fmt$0[2],_sJ_=make_iprintf(k$0,o,rest$5);
               return function(_tc_){return _sJ_}}
             var
              rest$6=fmt$0[2],
              _sK_=make_iprintf(k$0,o,rest$6),
              _sL_=function(_tb_){return _sK_};
             return function(_ta_){return _sL_}}
          case 4:
           var rest$7=fmt$0[4],prec=fmt$0[3],pad=fmt$0[2];
           return fn_of_padding_precision(k$0,o,rest$7,pad,prec);
          case 5:
           var rest$8=fmt$0[4],prec$0=fmt$0[3],pad$0=fmt$0[2];
           return fn_of_padding_precision(k$0,o,rest$8,pad$0,prec$0);
          case 6:
           var rest$9=fmt$0[4],prec$1=fmt$0[3],pad$1=fmt$0[2];
           return fn_of_padding_precision(k$0,o,rest$9,pad$1,prec$1);
          case 7:
           var rest$10=fmt$0[4],prec$2=fmt$0[3],pad$2=fmt$0[2];
           return fn_of_padding_precision(k$0,o,rest$10,pad$2,prec$2);
          case 8:
           var rest$11=fmt$0[4],prec$3=fmt$0[3],pad$3=fmt$0[2];
           return fn_of_padding_precision(k$0,o,rest$11,pad$3,prec$3);
          case 9:
           var _sM_=fmt$0[1];
           if(typeof _sM_ === "number")
            {var rest$12=fmt$0[2],_sN_=make_iprintf(k$0,o,rest$12);
             return function(_s7_){return _sN_}}
           else
            {if(0 === _sM_[0])
              {var rest$13=fmt$0[2],_sO_=make_iprintf(k$0,o,rest$13);
               return function(_s__){return _sO_}}
             var
              rest$14=fmt$0[2],
              _sP_=make_iprintf(k$0,o,rest$14),
              _sQ_=function(_s9_){return _sP_};
             return function(_s8_){return _sQ_}}
          case 10:var fmt$1=fmt$0[1],fmt$0=fmt$1;continue;
          case 11:var fmt$2=fmt$0[2],fmt$0=fmt$2;continue;
          case 12:var fmt$3=fmt$0[2],fmt$0=fmt$3;continue;
          case 13:
           var rest$15=fmt$0[3],_sR_=make_iprintf(k$0,o,rest$15);
           return function(_s6_){return _sR_};
          case 14:
           var rest$16=fmt$0[3],fmtty=fmt$0[2];
           return function(param)
            {var fmt=param[1];
             return make_iprintf(k$0,o,concat_fmt(recast(fmt,fmtty),rest$16))};
          case 15:
           var
            rest$17=fmt$0[1],
            _sS_=make_iprintf(k$0,o,rest$17),
            _sT_=function(_s5_){return _sS_};
           return function(_s4_){return _sT_};
          case 16:
           var rest$18=fmt$0[1],_sU_=make_iprintf(k$0,o,rest$18);
           return function(_s3_){return _sU_};
          case 17:var fmt$4=fmt$0[2],fmt$0=fmt$4;continue;
          case 18:
           var _sV_=fmt$0[1];
           if(0 === _sV_[0])
            {var
              rest$19=fmt$0[2],
              match=_sV_[1],
              fmt$5=match[1],
              k$3=
               function(k,rest)
                {function k$0(koc){return make_iprintf(k,koc,rest)}return k$0},
              k$1=k$3(k$0,rest$19),
              k$0=k$1,
              fmt$0=fmt$5;
             continue}
           var
            rest$20=fmt$0[2],
            match$0=_sV_[1],
            fmt$6=match$0[1],
            k$4=
             function(k,rest)
              {function k$0(koc){return make_iprintf(k,koc,rest)}return k$0},
            k$2=k$4(k$0,rest$20),
            k$0=k$2,
            fmt$0=fmt$6;
           continue;
          case 19:throw [0,Assert_failure,_aC_];
          case 20:
           var rest$21=fmt$0[3],_sW_=make_iprintf(k$0,o,rest$21);
           return function(_s2_){return _sW_};
          case 21:
           var rest$22=fmt$0[2],_sX_=make_iprintf(k$0,o,rest$22);
           return function(_s1_){return _sX_};
          case 22:
           var rest$23=fmt$0[1],_sY_=make_iprintf(k$0,o,rest$23);
           return function(_s0_){return _sY_};
          case 23:
           var rest$24=fmt$0[2],ign=fmt$0[1],_sZ_=0;
           return make_ignored_param
                   (function(param){return caml_call1(k$0,o)},_sZ_,ign,rest$24);
          default:
           var rest$25=fmt$0[3],arity=fmt$0[1];
           if(counter < 50)
            {var counter$0=counter + 1 | 0;
             return fn_of_custom_arity$0(counter$0,k$0,o,rest$25,arity)}
           return caml_trampoline_return
                   (fn_of_custom_arity$0,[0,k$0,o,rest$25,arity])}}
    function fn_of_custom_arity$0(counter,k,o,fmt,param)
     {if(param)
       {var arity=param[1],_sy_=fn_of_custom_arity(k,o,fmt,arity);
        return function(_sz_){return _sy_}}
      if(counter < 50)
       {var counter$0=counter + 1 | 0;
        return make_iprintf$0(counter$0,k,o,fmt)}
      return caml_trampoline_return(make_iprintf$0,[0,k,o,fmt])}
    function make_iprintf(k,o,fmt)
     {return caml_trampoline(make_iprintf$0(0,k,o,fmt))}
    function fn_of_custom_arity(k,o,fmt,param)
     {return caml_trampoline(fn_of_custom_arity$0(0,k,o,fmt,param))}
    function fn_of_padding_precision(k,o,fmt,pad,prec)
     {if(typeof pad === "number")
       {if(typeof prec === "number")
         {if(prec)
           {var _r6_=make_iprintf(k,o,fmt),_r7_=function(_sm_){return _r6_};
            return function(_sl_){return _r7_}}
          var _r8_=make_iprintf(k,o,fmt);
          return function(_sk_){return _r8_}}
        var _r9_=make_iprintf(k,o,fmt);
        return function(_sj_){return _r9_}}
      else
       {if(0 === pad[0])
         {if(typeof prec === "number")
           {if(prec)
             {var _r__=make_iprintf(k,o,fmt),_r$_=function(_sx_){return _r__};
              return function(_sw_){return _r$_}}
            var _sa_=make_iprintf(k,o,fmt);
            return function(_sv_){return _sa_}}
          var _sb_=make_iprintf(k,o,fmt);
          return function(_su_){return _sb_}}
        if(typeof prec === "number")
         {if(prec)
           {var
             _sc_=make_iprintf(k,o,fmt),
             _sd_=function(_st_){return _sc_},
             _se_=function(_ss_){return _sd_};
            return function(_sr_){return _se_}}
          var _sf_=make_iprintf(k,o,fmt),_sg_=function(_sq_){return _sf_};
          return function(_sp_){return _sg_}}
        var _sh_=make_iprintf(k,o,fmt),_si_=function(_so_){return _sh_};
        return function(_sn_){return _si_}}}
    function output_acc(o,acc)
     {var acc$0=acc;
      for(;;)
       if(typeof acc$0 === "number")
        return 0;
       else
        switch(acc$0[0])
         {case 0:
           var
            fmting_lit=acc$0[2],
            p=acc$0[1],
            s=string_of_formatting_lit(fmting_lit);
           output_acc(o,p);
           return output_string(o,s);
          case 1:
           var _r4_=acc$0[2],_r5_=acc$0[1];
           if(0 === _r4_[0])
            {var acc$1=_r4_[1];
             output_acc(o,_r5_);
             output_string(o,cst$30);
             var acc$0=acc$1;
             continue}
           var acc$2=_r4_[1];
           output_acc(o,_r5_);
           output_string(o,cst$31);
           var acc$0=acc$2;
           continue;
          case 6:
           var f=acc$0[2],p$2=acc$0[1];
           output_acc(o,p$2);
           return caml_call1(f,o);
          case 7:var p$3=acc$0[1];output_acc(o,p$3);return caml_ml_flush(o);
          case 8:
           var msg=acc$0[2],p$4=acc$0[1];
           output_acc(o,p$4);
           return invalid_arg(msg);
          case 2:
          case 4:
           var s$0=acc$0[2],p$0=acc$0[1];
           output_acc(o,p$0);
           return output_string(o,s$0);
          default:
           var c=acc$0[2],p$1=acc$0[1];
           output_acc(o,p$1);
           return caml_ml_output_char(o,c)}}
    function bufput_acc(b,acc)
     {var acc$0=acc;
      for(;;)
       if(typeof acc$0 === "number")
        return 0;
       else
        switch(acc$0[0])
         {case 0:
           var
            fmting_lit=acc$0[2],
            p=acc$0[1],
            s=string_of_formatting_lit(fmting_lit);
           bufput_acc(b,p);
           return add_string(b,s);
          case 1:
           var _r2_=acc$0[2],_r3_=acc$0[1];
           if(0 === _r2_[0])
            {var acc$1=_r2_[1];
             bufput_acc(b,_r3_);
             add_string(b,cst$32);
             var acc$0=acc$1;
             continue}
           var acc$2=_r2_[1];
           bufput_acc(b,_r3_);
           add_string(b,cst$33);
           var acc$0=acc$2;
           continue;
          case 6:
           var f=acc$0[2],p$2=acc$0[1];
           bufput_acc(b,p$2);
           return caml_call1(f,b);
          case 7:var acc$3=acc$0[1],acc$0=acc$3;continue;
          case 8:
           var msg=acc$0[2],p$3=acc$0[1];
           bufput_acc(b,p$3);
           return invalid_arg(msg);
          case 2:
          case 4:
           var s$0=acc$0[2],p$0=acc$0[1];
           bufput_acc(b,p$0);
           return add_string(b,s$0);
          default:
           var c=acc$0[2],p$1=acc$0[1];bufput_acc(b,p$1);return add_char(b,c)}}
    function strput_acc(b,acc)
     {var acc$0=acc;
      for(;;)
       if(typeof acc$0 === "number")
        return 0;
       else
        switch(acc$0[0])
         {case 0:
           var
            fmting_lit=acc$0[2],
            p=acc$0[1],
            s=string_of_formatting_lit(fmting_lit);
           strput_acc(b,p);
           return add_string(b,s);
          case 1:
           var _r0_=acc$0[2],_r1_=acc$0[1];
           if(0 === _r0_[0])
            {var acc$1=_r0_[1];
             strput_acc(b,_r1_);
             add_string(b,cst$34);
             var acc$0=acc$1;
             continue}
           var acc$2=_r0_[1];
           strput_acc(b,_r1_);
           add_string(b,cst$35);
           var acc$0=acc$2;
           continue;
          case 6:
           var f=acc$0[2],p$2=acc$0[1];
           strput_acc(b,p$2);
           return add_string(b,caml_call1(f,0));
          case 7:var acc$3=acc$0[1],acc$0=acc$3;continue;
          case 8:
           var msg=acc$0[2],p$3=acc$0[1];
           strput_acc(b,p$3);
           return invalid_arg(msg);
          case 2:
          case 4:
           var s$0=acc$0[2],p$0=acc$0[1];
           strput_acc(b,p$0);
           return add_string(b,s$0);
          default:
           var c=acc$0[2],p$1=acc$0[1];strput_acc(b,p$1);return add_char(b,c)}}
    function failwith_message(param)
     {var fmt=param[1],buf=create$2(256);
      function k(acc){strput_acc(buf,acc);return failwith(contents(buf))}
      return make_printf(k,0,fmt)}
    function open_box_of_string(str)
     {if(caml_string_equal(str,cst$36))return _aD_;
      var len=caml_ml_string_length(str);
      function invalid_box(param)
       {return caml_call1(failwith_message(_aE_),str)}
      function parse_spaces(i)
       {var i$0=i;
        for(;;)
         {if(i$0 === len)return i$0;
          var match=caml_string_get(str,i$0);
          if(9 !== match && 32 !== match)return i$0;
          var i$1=i$0 + 1 | 0,i$0=i$1;
          continue}}
      function parse_lword(i,j)
       {var j$0=j;
        for(;;)
         {if(j$0 === len)return j$0;
          var match=caml_string_get(str,j$0);
          if(25 < match - 97 >>> 0)return j$0;
          var j$1=j$0 + 1 | 0,j$0=j$1;
          continue}}
      function parse_int(i,j)
       {var j$0=j;
        for(;;)
         {if(j$0 === len)return j$0;
          var match=caml_string_get(str,j$0),switch$0=0;
          if(48 <= match)
           {if(! (58 <= match))switch$0 = 1}
          else
           if(45 === match)switch$0 = 1;
          if(switch$0){var j$1=j$0 + 1 | 0,j$0=j$1;continue}
          return j$0}}
      var
       wstart=parse_spaces(0),
       wend=parse_lword(wstart,wstart),
       box_name=sub$0(str,wstart,wend - wstart | 0),
       nstart=parse_spaces(wend),
       nend=parse_int(nstart,nstart);
      if(nstart === nend)
       var indent=0;
      else
       try
        {var
          _rY_=caml_int_of_string(sub$0(str,nstart,nend - nstart | 0)),
          indent=_rY_}
       catch(_rZ_)
        {_rZ_ = caml_wrap_exception(_rZ_);
         if(_rZ_[1] !== Failure)throw _rZ_;
         var indent=invalid_box(0)}
      var exp_end=parse_spaces(nend);
      if(exp_end !== len)invalid_box(0);
      var switch$0=0;
      if
       (caml_string_notequal(box_name,cst$37)
        &&
        caml_string_notequal(box_name,cst_b$0))
       var
        box_type=
         caml_string_notequal(box_name,cst_h)
          ?caml_string_notequal(box_name,cst_hov)
            ?caml_string_notequal(box_name,cst_hv)
              ?caml_string_notequal(box_name,cst_v)?invalid_box(0):1
              :2
            :3
          :0;
      else
       switch$0 = 1;
      if(switch$0)var box_type=4;
      return [0,indent,box_type]}
    function make_padding_fmt_ebb(pad,fmt)
     {if(typeof pad === "number")
       return [0,0,fmt];
      else
       {if(0 === pad[0]){var w=pad[2],s=pad[1];return [0,[0,s,w],fmt]}
        var s$0=pad[1];
        return [0,[1,s$0],fmt]}}
    function make_padprec_fmt_ebb(pad,prec,fmt)
     {if(typeof prec === "number")
       var match=prec?[0,1,fmt]:[0,0,fmt];
      else
       var p=prec[1],match=[0,[0,p],fmt];
      var prec$0=match[1];
      if(typeof pad === "number")
       return [0,0,prec$0,fmt];
      else
       {if(0 === pad[0]){var w=pad[2],s=pad[1];return [0,[0,s,w],prec$0,fmt]}
        var s$0=pad[1];
        return [0,[1,s$0],prec$0,fmt]}}
    function fmt_ebb_of_string(legacy_behavior,str)
     {if(legacy_behavior)
       var flag=legacy_behavior[1],legacy_behavior$0=flag;
      else
       var legacy_behavior$0=1;
      function invalid_format_message(str_ind,msg)
       {return caml_call3(failwith_message(_aF_),str,str_ind,msg)}
      function unexpected_end_of_format(end_ind)
       {return invalid_format_message(end_ind,cst_unexpected_end_of_format)}
      function invalid_format_without(str_ind,c,s)
       {return caml_call4(failwith_message(_aG_),str,str_ind,c,s)}
      function expected_character(str_ind,expected,read)
       {return caml_call4(failwith_message(_aH_),str,str_ind,expected,read)}
      function add_literal(lit_start,str_ind,fmt)
       {var size=str_ind - lit_start | 0;
        return 0 === size
                ?[0,fmt]
                :1 === size
                  ?[0,[12,caml_string_get(str,lit_start),fmt]]
                  :[0,[11,sub$0(str,lit_start,size),fmt]]}
      function parse_positive(str_ind,end_ind,acc)
       {var str_ind$0=str_ind,acc$0=acc;
        for(;;)
         {if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
          var c=caml_string_get(str,str_ind$0);
          if(9 < c - 48 >>> 0)return [0,str_ind$0,acc$0];
          var acc$1=(acc$0 * 10 | 0) + (c - 48 | 0) | 0;
          if(max_string_length < acc$1)
           return caml_call3
                   (failwith_message(_aY_),str,acc$1,max_string_length);
          var str_ind$1=str_ind$0 + 1 | 0,str_ind$0=str_ind$1,acc$0=acc$1;
          continue}}
      function parse_integer(str_ind,end_ind)
       {if(str_ind === end_ind)unexpected_end_of_format(end_ind);
        var match=caml_string_get(str,str_ind);
        if(48 <= match)
         {if(! (58 <= match))return parse_positive(str_ind,end_ind,0)}
        else
         if(45 === match)
          {if((str_ind + 1 | 0) === end_ind)unexpected_end_of_format(end_ind);
           var c=caml_string_get(str,str_ind + 1 | 0);
           if(9 < c - 48 >>> 0)
            return expected_character(str_ind + 1 | 0,cst_digit,c);
           var
            match$0=parse_positive(str_ind + 1 | 0,end_ind,0),
            n=match$0[2],
            next_ind=match$0[1];
           return [0,next_ind,- n | 0]}
        throw [0,Assert_failure,_aZ_]}
      function parse_spaces(str_ind,end_ind)
       {var str_ind$0=str_ind;
        for(;;)
         {if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
          if(32 === caml_string_get(str,str_ind$0))
           {var str_ind$1=str_ind$0 + 1 | 0,str_ind$0=str_ind$1;continue}
          return str_ind$0}}
      function incompatible_flag(pct_ind,str_ind,symb,option)
       {var subfmt=sub$0(str,pct_ind,str_ind - pct_ind | 0);
        return caml_call5
                (failwith_message(_a4_),str,pct_ind,option,symb,subfmt)}
      function compute_int_conv(pct_ind,str_ind,plus,hash,space,symb)
       {var plus$0=plus,hash$0=hash,space$0=space;
        for(;;)
         {var switch$0=0;
          if(plus$0)
           {if(hash$0)
             switch$0 = 1;
            else
             if(! space$0){if(100 === symb)return 1;if(105 === symb)return 4}}
          else
           if(hash$0)
            if(space$0)
             switch$0 = 1;
            else
             {var switcher$0=symb - 88 | 0;
              if(32 < switcher$0 >>> 0)
               switch$0 = 1;
              else
               switch(switcher$0)
                {case 0:return 9;
                 case 12:return 13;
                 case 17:return 14;
                 case 23:return 11;
                 case 29:return 15;
                 case 32:return 7;
                 default:switch$0 = 1}}
           else
            if(space$0)
             {if(100 === symb)return 2;if(105 === symb)return 5}
            else
             {var switcher$1=symb - 88 | 0;
              if(! (32 < switcher$1 >>> 0))
               switch(switcher$1)
                {case 0:return 8;
                 case 12:return 0;
                 case 17:return 3;
                 case 23:return 10;
                 case 29:return 12;
                 case 32:return 6
                 }}
          if(switch$0)
           {var switcher=symb - 88 | 0;
            if(! (32 < switcher >>> 0))
             switch(switcher)
              {case 0:if(legacy_behavior$0)return 9;break;
               case 23:if(legacy_behavior$0)return 11;break;
               case 32:if(legacy_behavior$0)return 7;break;
               case 12:
               case 17:
               case 29:
                if(legacy_behavior$0){var hash$0=0;continue}
                return incompatible_flag(pct_ind,str_ind,symb,cst$49)
               }}
          if(plus$0)
           {if(space$0)
             {if(legacy_behavior$0){var space$0=0;continue}
              return incompatible_flag(pct_ind,str_ind,32,cst$46)}
            if(legacy_behavior$0){var plus$0=0;continue}
            return incompatible_flag(pct_ind,str_ind,symb,cst$47)}
          if(space$0)
           {if(legacy_behavior$0){var space$0=0;continue}
            return incompatible_flag(pct_ind,str_ind,symb,cst$48)}
          throw [0,Assert_failure,_a2_]}}
      function search_subformat_end(str_ind,end_ind,c)
       {var str_ind$0=str_ind;
        for(;;)
         {if(str_ind$0 === end_ind)
           caml_call3(failwith_message(_a0_),str,c,end_ind);
          var match=caml_string_get(str,str_ind$0);
          if(37 === match)
           {if((str_ind$0 + 1 | 0) === end_ind)
             unexpected_end_of_format(end_ind);
            if(caml_string_get(str,str_ind$0 + 1 | 0) === c)return str_ind$0;
            var match$0=caml_string_get(str,str_ind$0 + 1 | 0);
            if(95 <= match$0)
             {if(123 <= match$0)
               {if(! (126 <= match$0))
                 switch(match$0 - 123 | 0)
                  {case 0:
                    var
                     sub_end=search_subformat_end(str_ind$0 + 2 | 0,end_ind,125),
                     str_ind$2=sub_end + 2 | 0,
                     str_ind$0=str_ind$2;
                    continue;
                   case 1:break;
                   default:
                    return expected_character
                            (str_ind$0 + 1 | 0,cst_character,125)}}
              else
               if(! (96 <= match$0))
                {if((str_ind$0 + 2 | 0) === end_ind)
                  unexpected_end_of_format(end_ind);
                 var match$1=caml_string_get(str,str_ind$0 + 2 | 0);
                 if(40 === match$1)
                  {var
                    sub_end$0=search_subformat_end(str_ind$0 + 3 | 0,end_ind,41),
                    str_ind$3=sub_end$0 + 2 | 0,
                    str_ind$0=str_ind$3;
                   continue}
                 if(123 === match$1)
                  {var
                    sub_end$1=
                     search_subformat_end(str_ind$0 + 3 | 0,end_ind,125),
                    str_ind$4=sub_end$1 + 2 | 0,
                    str_ind$0=str_ind$4;
                   continue}
                 var str_ind$5=str_ind$0 + 3 | 0,str_ind$0=str_ind$5;
                 continue}}
            else
             {if(40 === match$0)
               {var
                 sub_end$2=search_subformat_end(str_ind$0 + 2 | 0,end_ind,41),
                 str_ind$6=sub_end$2 + 2 | 0,
                 str_ind$0=str_ind$6;
                continue}
              if(41 === match$0)
               return expected_character(str_ind$0 + 1 | 0,cst_character$0,41)}
            var str_ind$1=str_ind$0 + 2 | 0,str_ind$0=str_ind$1;
            continue}
          var str_ind$7=str_ind$0 + 1 | 0,str_ind$0=str_ind$7;
          continue}}
      function parse_magic_size(str_ind,end_ind)
       {try
         {var
           str_ind_1=parse_spaces(str_ind,end_ind),
           match$2=caml_string_get(str,str_ind_1),
           switch$0=0;
          if(48 <= match$2)
           {if(! (58 <= match$2))switch$0 = 1}
          else
           if(45 === match$2)switch$0 = 1;
          if(switch$0)
           {var
             match$3=parse_integer(str_ind_1,end_ind),
             size=match$3[2],
             str_ind_2=match$3[1],
             str_ind_3=parse_spaces(str_ind_2,end_ind);
            if(62 !== caml_string_get(str,str_ind_3))throw Not_found;
            var
             s=sub$0(str,str_ind - 2 | 0,(str_ind_3 - str_ind | 0) + 3 | 0),
             _rW_=[0,[0,str_ind_3 + 1 | 0,[1,s,size]]]}
          else
           var _rW_=0;
          var _rV_=_rW_}
        catch(_rX_)
         {_rX_ = caml_wrap_exception(_rX_);
          if(_rX_ !== Not_found && _rX_[1] !== Failure)throw _rX_;
          var _rV_=0}
        if(_rV_)
         {var
           match=_rV_[1],
           formatting_lit=match[2],
           next_ind=match[1],
           match$0=parse(next_ind,end_ind),
           fmt_rest=match$0[1];
          return [0,[17,formatting_lit,fmt_rest]]}
        var match$1=parse(str_ind,end_ind),fmt_rest$0=match$1[1];
        return [0,[17,_aW_,fmt_rest$0]]}
      function parse_good_break(str_ind,end_ind)
       {try
         {var
           _rO_=str_ind === end_ind?1:0,
           _rP_=_rO_ || (60 !== caml_string_get(str,str_ind)?1:0);
          if(_rP_)throw Not_found;
          var
           str_ind_1=parse_spaces(str_ind + 1 | 0,end_ind),
           match$0=caml_string_get(str,str_ind_1),
           switch$0=0;
          if(48 <= match$0)
           {if(! (58 <= match$0))switch$0 = 1}
          else
           if(45 === match$0)switch$0 = 1;
          if(! switch$0)throw Not_found;
          var
           match$1=parse_integer(str_ind_1,end_ind),
           width=match$1[2],
           str_ind_2=match$1[1],
           str_ind_3=parse_spaces(str_ind_2,end_ind),
           match$2=caml_string_get(str,str_ind_3),
           switcher=match$2 - 45 | 0,
           switch$1=0;
          if(12 < switcher >>> 0)
           if(17 === switcher)
            var
             s=sub$0(str,str_ind - 2 | 0,(str_ind_3 - str_ind | 0) + 3 | 0),
             _rQ_=[0,s,width,0],
             _rR_=str_ind_3 + 1 | 0,
             formatting_lit$0=_rQ_,
             next_ind=_rR_;
           else
            switch$1 = 1;
          else
           if(1 < switcher - 1 >>> 0)
            {var
              match$3=parse_integer(str_ind_3,end_ind),
              offset=match$3[2],
              str_ind_4=match$3[1],
              str_ind_5=parse_spaces(str_ind_4,end_ind);
             if(62 !== caml_string_get(str,str_ind_5))throw Not_found;
             var
              s$0=sub$0(str,str_ind - 2 | 0,(str_ind_5 - str_ind | 0) + 3 | 0),
              _rS_=[0,s$0,width,offset],
              _rT_=str_ind_5 + 1 | 0,
              formatting_lit$0=_rS_,
              next_ind=_rT_}
           else
            switch$1 = 1;
          if(switch$1)throw Not_found}
        catch(_rU_)
         {_rU_ = caml_wrap_exception(_rU_);
          if(_rU_ !== Not_found && _rU_[1] !== Failure)throw _rU_;
          var formatting_lit$0=formatting_lit,next_ind=str_ind}
        var match=parse(next_ind,end_ind),fmt_rest=match[1];
        return [0,[17,formatting_lit$0,fmt_rest]]}
      function parse_tag(is_open_tag,str_ind,end_ind)
       {try
         {if(str_ind === end_ind)throw Not_found;
          var match$0=caml_string_get(str,str_ind);
          if(60 === match$0)
           {var ind=index_from$0(str,str_ind + 1 | 0,62);
            if(end_ind <= ind)throw Not_found;
            var
             sub_str=sub$0(str,str_ind,(ind - str_ind | 0) + 1 | 0),
             match$1=parse(ind + 1 | 0,end_ind),
             fmt_rest$0=match$1[1],
             match$2=parse(str_ind,ind + 1 | 0),
             sub_fmt=match$2[1],
             sub_format$0=[0,sub_fmt,sub_str],
             formatting$0=is_open_tag?[0,sub_format$0]:[1,sub_format$0],
             _rM_=[0,[18,formatting$0,fmt_rest$0]];
            return _rM_}
          throw Not_found}
        catch(_rN_)
         {_rN_ = caml_wrap_exception(_rN_);
          if(_rN_ === Not_found)
           {var
             match=parse(str_ind,end_ind),
             fmt_rest=match[1],
             formatting=is_open_tag?[0,sub_format]:[1,sub_format];
            return [0,[18,formatting,fmt_rest]]}
          throw _rN_}}
      function parse_flags(pct_ind,str_ind,end_ind,ign)
       {var zero=[0,0],minus=[0,0],plus=[0,0],space=[0,0],hash=[0,0];
        function set_flag(str_ind,flag)
         {var _rJ_=flag[1],_rK_=_rJ_?1 - legacy_behavior$0:_rJ_;
          if(_rK_)
           {var _rL_=caml_string_get(str,str_ind);
            caml_call3(failwith_message(_aI_),str,str_ind,_rL_)}
          flag[1] = 1;
          return 0}
        var str_ind$0=str_ind;
        for(;;)
         {if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
          var match=caml_string_get(str,str_ind$0),switcher=match - 32 | 0;
          if(! (16 < switcher >>> 0))
           switch(switcher)
            {case 0:
              set_flag(str_ind$0,space);
              var str_ind$1=str_ind$0 + 1 | 0,str_ind$0=str_ind$1;
              continue;
             case 3:
              set_flag(str_ind$0,hash);
              var str_ind$2=str_ind$0 + 1 | 0,str_ind$0=str_ind$2;
              continue;
             case 11:
              set_flag(str_ind$0,plus);
              var str_ind$3=str_ind$0 + 1 | 0,str_ind$0=str_ind$3;
              continue;
             case 13:
              set_flag(str_ind$0,minus);
              var str_ind$4=str_ind$0 + 1 | 0,str_ind$0=str_ind$4;
              continue;
             case 16:
              set_flag(str_ind$0,zero);
              var str_ind$5=str_ind$0 + 1 | 0,str_ind$0=str_ind$5;
              continue
             }
          var
           _rE_=space[1],
           _rF_=hash[1],
           _rG_=plus[1],
           _rH_=minus[1],
           _rI_=zero[1];
          if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
          var
           padty=
            _rI_
             ?_rH_
               ?legacy_behavior$0
                 ?0
                 :incompatible_flag(pct_ind,str_ind$0,45,cst_0)
               :2
             :_rH_?0:1,
           match$0=caml_string_get(str,str_ind$0);
          if(48 <= match$0)
           {if(! (58 <= match$0))
             {var
               match$1=parse_positive(str_ind$0,end_ind,0),
               width=match$1[2],
               new_ind=match$1[1];
              return parse_after_padding
                      (pct_ind,
                       new_ind,
                       end_ind,
                       _rH_,
                       _rG_,
                       _rF_,
                       _rE_,
                       ign,
                       [0,padty,width])}}
          else
           if(42 === match$0)
            return parse_after_padding
                    (pct_ind,
                     str_ind$0 + 1 | 0,
                     end_ind,
                     _rH_,
                     _rG_,
                     _rF_,
                     _rE_,
                     ign,
                     [1,padty]);
          switch(padty)
           {case 0:
             if(1 - legacy_behavior$0)
              invalid_format_without(str_ind$0 - 1 | 0,45,cst_padding);
             return parse_after_padding
                     (pct_ind,str_ind$0,end_ind,_rH_,_rG_,_rF_,_rE_,ign,0);
            case 1:
             return parse_after_padding
                     (pct_ind,str_ind$0,end_ind,_rH_,_rG_,_rF_,_rE_,ign,0);
            default:
             return parse_after_padding
                     (pct_ind,str_ind$0,end_ind,_rH_,_rG_,_rF_,_rE_,ign,_aJ_)}}}
      function parse_after_padding
       (pct_ind,str_ind,end_ind,minus,plus,hash,space,ign,pad)
       {if(str_ind === end_ind)unexpected_end_of_format(end_ind);
        var symb=caml_string_get(str,str_ind);
        if(46 === symb)
         {var str_ind$0=str_ind + 1 | 0;
          if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
          var
           parse_literal=
            function(minus,str_ind)
             {var
               match=parse_positive(str_ind,end_ind,0),
               prec=match[2],
               new_ind=match[1];
              return parse_after_precision
                      (pct_ind,
                       new_ind,
                       end_ind,
                       minus,
                       plus,
                       hash,
                       space,
                       ign,
                       pad,
                       [0,prec])},
           symb$0=caml_string_get(str,str_ind$0);
          if(48 <= symb$0)
           {if(! (58 <= symb$0))return parse_literal(minus,str_ind$0)}
          else
           if(42 <= symb$0)
            switch(symb$0 - 42 | 0)
             {case 0:
               return parse_after_precision
                       (pct_ind,
                        str_ind$0 + 1 | 0,
                        end_ind,
                        minus,
                        plus,
                        hash,
                        space,
                        ign,
                        pad,
                        1);
              case 1:
              case 3:
               if(legacy_behavior$0)
                {var
                  _rD_=str_ind$0 + 1 | 0,
                  minus$0=minus || (45 === symb$0?1:0);
                 return parse_literal(minus$0,_rD_)}
               break
              }
          return legacy_behavior$0
                  ?parse_after_precision
                    (pct_ind,
                     str_ind$0,
                     end_ind,
                     minus,
                     plus,
                     hash,
                     space,
                     ign,
                     pad,
                     _aK_)
                  :invalid_format_without(str_ind$0 - 1 | 0,46,cst_precision)}
        return parse_conversion
                (pct_ind,
                 str_ind + 1 | 0,
                 end_ind,
                 plus,
                 hash,
                 space,
                 ign,
                 pad,
                 0,
                 pad,
                 symb)}
      function parse_after_precision
       (pct_ind,str_ind,end_ind,minus,plus,hash,space,ign,pad,prec)
       {if(str_ind === end_ind)unexpected_end_of_format(end_ind);
        function parse_conv(padprec)
         {return parse_conversion
                  (pct_ind,
                   str_ind + 1 | 0,
                   end_ind,
                   plus,
                   hash,
                   space,
                   ign,
                   pad,
                   prec,
                   padprec,
                   caml_string_get(str,str_ind))}
        if(typeof pad === "number")
         {if(typeof prec === "number" && ! prec)return parse_conv(0);
          if(minus)
           {if(typeof prec === "number")return parse_conv(_aL_);
            var n=prec[1];
            return parse_conv([0,0,n])}
          if(typeof prec === "number")return parse_conv(_aM_);
          var n$0=prec[1];
          return parse_conv([0,1,n$0])}
        return parse_conv(pad)}
      function parse_conversion
       (pct_ind,str_ind,end_ind,plus,hash,space,ign,pad,prec,padprec,symb)
       {var
         plus_used=[0,0],
         hash_used=[0,0],
         space_used=[0,0],
         ign_used=[0,0],
         pad_used=[0,0],
         prec_used=[0,0];
        function get_plus(param){plus_used[1] = 1;return plus}
        function get_hash(param){hash_used[1] = 1;return hash}
        function get_space(param){space_used[1] = 1;return space}
        function get_ign(param){ign_used[1] = 1;return ign}
        function get_pad(param){pad_used[1] = 1;return pad}
        function get_prec(param){prec_used[1] = 1;return prec}
        function get_padprec(param){pad_used[1] = 1;return padprec}
        function get_int_pad(param)
         {var pad=get_pad(0),match=get_prec(0);
          if(typeof match === "number" && ! match)return pad;
          if(typeof pad === "number")
           return 0;
          else
           {if(0 === pad[0])
             {if(2 <= pad[1])
               {var n=pad[2];
                return legacy_behavior$0
                        ?[0,1,n]
                        :incompatible_flag(pct_ind,str_ind,48,cst_precision$0)}
              return pad}
            return 2 <= pad[1]
                    ?legacy_behavior$0
                      ?_aN_
                      :incompatible_flag(pct_ind,str_ind,48,cst_precision$1)
                    :pad}}
        function check_no_0(symb,pad)
         {if(typeof pad === "number")
           return pad;
          else
           {if(0 === pad[0])
             {if(2 <= pad[1])
               {var width=pad[2];
                return legacy_behavior$0
                        ?[0,1,width]
                        :incompatible_flag(pct_ind,str_ind,symb,cst_0$0)}
              return pad}
            return 2 <= pad[1]
                    ?legacy_behavior$0
                      ?_aO_
                      :incompatible_flag(pct_ind,str_ind,symb,cst_0$1)
                    :pad}}
        function opt_of_pad(c,pad)
         {if(typeof pad === "number")
           return 0;
          else
           {if(0 === pad[0])
             switch(pad[1])
              {case 0:
                var width=pad[2];
                return legacy_behavior$0
                        ?[0,width]
                        :incompatible_flag(pct_ind,str_ind,c,cst$38);
               case 1:var width$0=pad[2];return [0,width$0];
               default:
                var width$1=pad[2];
                return legacy_behavior$0
                        ?[0,width$1]
                        :incompatible_flag(pct_ind,str_ind,c,cst_0$2)}
            return incompatible_flag(pct_ind,str_ind,c,cst$39)}}
        function get_pad_opt(c){return opt_of_pad(c,get_pad(0))}
        function get_padprec_opt(c){return opt_of_pad(c,get_padprec(0))}
        var switch$0=0;
        if(124 <= symb)
         switch$0 = 1;
        else
         switch(symb)
          {case 33:
            var
             match$6=parse(str_ind,end_ind),
             fmt_rest$5=match$6[1],
             fmt_result=[0,[10,fmt_rest$5]];
            break;
           case 40:
            var
             sub_end=search_subformat_end(str_ind,end_ind,41),
             match$8=parse(sub_end + 2 | 0,end_ind),
             fmt_rest$7=match$8[1],
             match$9=parse(str_ind,sub_end),
             sub_fmt=match$9[1],
             sub_fmtty=fmtty_of_fmt(sub_fmt);
            if(get_ign(0))
             var
              ignored$2=[9,get_pad_opt(95),sub_fmtty],
              _ra_=[0,[23,ignored$2,fmt_rest$7]];
            else
             var _ra_=[0,[14,get_pad_opt(40),sub_fmtty,fmt_rest$7]];
            var fmt_result=_ra_;
            break;
           case 44:var fmt_result=parse(str_ind,end_ind);break;
           case 67:
            var
             match$12=parse(str_ind,end_ind),
             fmt_rest$10=match$12[1],
             _rc_=get_ign(0)?[0,[23,1,fmt_rest$10]]:[0,[1,fmt_rest$10]],
             fmt_result=_rc_;
            break;
           case 78:
            var
             match$16=parse(str_ind,end_ind),
             fmt_rest$14=match$16[1],
             counter$0=2;
            if(get_ign(0))
             var ignored$6=[11,counter$0],_ri_=[0,[23,ignored$6,fmt_rest$14]];
            else
             var _ri_=[0,[21,counter$0,fmt_rest$14]];
            var fmt_result=_ri_;
            break;
           case 83:
            var
             pad$6=check_no_0(symb,get_padprec(0)),
             match$17=parse(str_ind,end_ind),
             fmt_rest$15=match$17[1];
            if(get_ign(0))
             var
              ignored$7=[1,get_padprec_opt(95)],
              _rj_=[0,[23,ignored$7,fmt_rest$15]];
            else
             var
              match$18=make_padding_fmt_ebb(pad$6,fmt_rest$15),
              fmt_rest$16=match$18[2],
              pad$7=match$18[1],
              _rj_=[0,[3,pad$7,fmt_rest$16]];
            var fmt_result=_rj_;
            break;
           case 91:
            if(str_ind === end_ind)unexpected_end_of_format(end_ind);
            var
             char_set=create_char_set(0),
             add_char=function(c){return add_in_char_set(char_set,c)},
             add_range=
              function(c$0,c)
               {if(! (c < c$0))
                 {var i=c$0;
                  for(;;)
                   {add_in_char_set(char_set,char_of_int(i));
                    var _rC_=i + 1 | 0;
                    if(c !== i){var i=_rC_;continue}
                    break}}
                return 0},
             fail_single_percent=
              function(str_ind)
               {return caml_call2(failwith_message(_aX_),str,str_ind)},
             parse_char_set_content=
              function(counter,str_ind,end_ind)
               {var str_ind$0=str_ind;
                for(;;)
                 {if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
                  var c=caml_string_get(str,str_ind$0);
                  if(45 === c)
                   {add_char(45);
                    var str_ind$1=str_ind$0 + 1 | 0,str_ind$0=str_ind$1;
                    continue}
                  if(93 === c)return str_ind$0 + 1 | 0;
                  var _rB_=str_ind$0 + 1 | 0;
                  if(counter < 50)
                   {var counter$0=counter + 1 | 0;
                    return parse_char_set_after_char$0(counter$0,_rB_,end_ind,c)}
                  return caml_trampoline_return
                          (parse_char_set_after_char$0,[0,_rB_,end_ind,c])}},
             parse_char_set_after_char$0=
              function(counter,str_ind,end_ind,c)
               {var str_ind$0=str_ind,c$0=c;
                for(;;)
                 {if(str_ind$0 === end_ind)unexpected_end_of_format(end_ind);
                  var c$1=caml_string_get(str,str_ind$0),switch$0=0;
                  if(46 <= c$1)
                   {if(64 === c$1)
                     switch$0 = 1;
                    else
                     if(93 === c$1){add_char(c$0);return str_ind$0 + 1 | 0}}
                  else
                   if(37 === c$1)
                    switch$0 = 1;
                   else
                    if(45 <= c$1)
                     {var str_ind$2=str_ind$0 + 1 | 0;
                      if(str_ind$2 === end_ind)unexpected_end_of_format(end_ind);
                      var c$2=caml_string_get(str,str_ind$2);
                      if(37 === c$2)
                       {if((str_ind$2 + 1 | 0) === end_ind)
                         unexpected_end_of_format(end_ind);
                        var c$3=caml_string_get(str,str_ind$2 + 1 | 0);
                        if(37 !== c$3 && 64 !== c$3)
                         return fail_single_percent(str_ind$2);
                        add_range(c$0,c$3);
                        var _rz_=str_ind$2 + 2 | 0;
                        if(counter < 50)
                         {var counter$2=counter + 1 | 0;
                          return parse_char_set_content(counter$2,_rz_,end_ind)}
                        return caml_trampoline_return
                                (parse_char_set_content,[0,_rz_,end_ind])}
                      if(93 === c$2)
                       {add_char(c$0);add_char(45);return str_ind$2 + 1 | 0}
                      add_range(c$0,c$2);
                      var _rA_=str_ind$2 + 1 | 0;
                      if(counter < 50)
                       {var counter$1=counter + 1 | 0;
                        return parse_char_set_content(counter$1,_rA_,end_ind)}
                      return caml_trampoline_return
                              (parse_char_set_content,[0,_rA_,end_ind])}
                  if(switch$0 && 37 === c$0)
                   {add_char(c$1);
                    var _ry_=str_ind$0 + 1 | 0;
                    if(counter < 50)
                     {var counter$0=counter + 1 | 0;
                      return parse_char_set_content(counter$0,_ry_,end_ind)}
                    return caml_trampoline_return
                            (parse_char_set_content,[0,_ry_,end_ind])}
                  if(37 === c$0)fail_single_percent(str_ind$0);
                  add_char(c$0);
                  var str_ind$1=str_ind$0 + 1 | 0,str_ind$0=str_ind$1,c$0=c$1;
                  continue}},
             parse_char_set_after_char=
              function(str_ind,end_ind,c)
               {return caml_trampoline
                        (parse_char_set_after_char$0(0,str_ind,end_ind,c))};
            if(str_ind === end_ind)unexpected_end_of_format(end_ind);
            var match$31=caml_string_get(str,str_ind);
            if(94 === match$31)
             var str_ind$0=str_ind + 1 | 0,reverse=1,str_ind$1=str_ind$0;
            else
             var reverse=0,str_ind$1=str_ind;
            if(str_ind$1 === end_ind)unexpected_end_of_format(end_ind);
            var
             c=caml_string_get(str,str_ind$1),
             next_ind=parse_char_set_after_char(str_ind$1 + 1 | 0,end_ind,c),
             char_set$0=freeze_char_set(char_set),
             char_set$1=reverse?rev_char_set(char_set$0):char_set$0,
             match$21=parse(next_ind,end_ind),
             fmt_rest$19=match$21[1];
            if(get_ign(0))
             var
              ignored$9=[10,get_pad_opt(95),char_set$1],
              _ro_=[0,[23,ignored$9,fmt_rest$19]];
            else
             var _ro_=[0,[20,get_pad_opt(91),char_set$1,fmt_rest$19]];
            var fmt_result=_ro_;
            break;
           case 97:
            var
             match$22=parse(str_ind,end_ind),
             fmt_rest$20=match$22[1],
             fmt_result=[0,[15,fmt_rest$20]];
            break;
           case 99:
            var
             char_format=
              function(fmt_rest)
               {return get_ign(0)?[0,[23,0,fmt_rest]]:[0,[0,fmt_rest]]},
             match$23=parse(str_ind,end_ind),
             fmt_rest$21=match$23[1],
             match$24=get_pad_opt(99);
            if(match$24)
             {if(0 === match$24[1])
               var
                _rp_=get_ign(0)?[0,[23,3,fmt_rest$21]]:[0,[22,fmt_rest$21]],
                _rq_=_rp_;
              else
               var
                _rq_=
                 legacy_behavior$0
                  ?char_format(fmt_rest$21)
                  :invalid_format_message
                    (str_ind,cst_non_zero_widths_are_unsupp);
              var _rr_=_rq_}
            else
             var _rr_=char_format(fmt_rest$21);
            var fmt_result=_rr_;
            break;
           case 114:
            var
             match$25=parse(str_ind,end_ind),
             fmt_rest$22=match$25[1],
             _rs_=get_ign(0)?[0,[23,2,fmt_rest$22]]:[0,[19,fmt_rest$22]],
             fmt_result=_rs_;
            break;
           case 115:
            var
             pad$9=check_no_0(symb,get_padprec(0)),
             match$26=parse(str_ind,end_ind),
             fmt_rest$23=match$26[1];
            if(get_ign(0))
             var
              ignored$10=[0,get_padprec_opt(95)],
              _rt_=[0,[23,ignored$10,fmt_rest$23]];
            else
             var
              match$27=make_padding_fmt_ebb(pad$9,fmt_rest$23),
              fmt_rest$24=match$27[2],
              pad$10=match$27[1],
              _rt_=[0,[2,pad$10,fmt_rest$24]];
            var fmt_result=_rt_;
            break;
           case 116:
            var
             match$28=parse(str_ind,end_ind),
             fmt_rest$25=match$28[1],
             fmt_result=[0,[16,fmt_rest$25]];
            break;
           case 123:
            var
             sub_end$0=search_subformat_end(str_ind,end_ind,125),
             match$29=parse(str_ind,sub_end$0),
             sub_fmt$0=match$29[1],
             match$30=parse(sub_end$0 + 2 | 0,end_ind),
             fmt_rest$26=match$30[1],
             sub_fmtty$0=fmtty_of_fmt(sub_fmt$0);
            if(get_ign(0))
             var
              ignored$11=[8,get_pad_opt(95),sub_fmtty$0],
              _ru_=[0,[23,ignored$11,fmt_rest$26]];
            else
             var _ru_=[0,[13,get_pad_opt(123),sub_fmtty$0,fmt_rest$26]];
            var fmt_result=_ru_;
            break;
           case 66:
           case 98:
            var
             pad$3=check_no_0(symb,get_padprec(0)),
             match$10=parse(str_ind,end_ind),
             fmt_rest$8=match$10[1];
            if(get_ign(0))
             var
              ignored$3=[7,get_padprec_opt(95)],
              _rb_=[0,[23,ignored$3,fmt_rest$8]];
            else
             var
              match$11=make_padding_fmt_ebb(pad$3,fmt_rest$8),
              fmt_rest$9=match$11[2],
              pad$4=match$11[1],
              _rb_=[0,[9,pad$4,fmt_rest$9]];
            var fmt_result=_rb_;
            break;
           case 37:
           case 64:
            var
             match$7=parse(str_ind,end_ind),
             fmt_rest$6=match$7[1],
             fmt_result=[0,[12,symb,fmt_rest$6]];
            break;
           case 76:
           case 108:
           case 110:
            var switch$1=0;
            if(str_ind !== end_ind)
             {var
               symb$0=caml_string_get(str,str_ind),
               _rv_=symb$0 - 88 | 0,
               switch$2=0;
              if(! (32 < _rv_ >>> 0))
               switch(_rv_)
                {case 0:
                 case 12:
                 case 17:
                 case 23:
                 case 29:
                 case 32:var _rh_=1;switch$2 = 1;break
                 }
              if(! switch$2)var _rh_=0;
              if(_rh_){switch$0 = 1;switch$1 = 1}}
            if(! switch$1)
             {var
               match$15=parse(str_ind,end_ind),
               fmt_rest$13=match$15[1],
               switch$3=0;
              if(108 <= symb)
               {if(! (111 <= symb))
                 switch(symb - 108 | 0)
                  {case 0:var counter=0;switch$3 = 1;break;
                   case 1:break;
                   default:var counter=1;switch$3 = 1}}
              else
               if(76 === symb){var counter=2;switch$3 = 1}
              if(! switch$3)throw [0,Assert_failure,_a1_];
              if(get_ign(0))
               var ignored$5=[11,counter],_rg_=[0,[23,ignored$5,fmt_rest$13]];
              else
               var _rg_=[0,[21,counter,fmt_rest$13]];
              var fmt_result=_rg_}
            break;
           case 32:
           case 35:
           case 43:
           case 45:
           case 95:
            var
             fmt_result=
              caml_call3(failwith_message(_aS_),str,pct_ind,symb);
            break;
           case 88:
           case 100:
           case 105:
           case 111:
           case 117:
           case 120:
            var
             _rk_=get_space(0),
             _rl_=get_hash(0),
             iconv$2=
              compute_int_conv(pct_ind,str_ind,get_plus(0),_rl_,_rk_,symb),
             match$19=parse(str_ind,end_ind),
             fmt_rest$17=match$19[1];
            if(get_ign(0))
             var
              ignored$8=[2,iconv$2,get_pad_opt(95)],
              _rm_=[0,[23,ignored$8,fmt_rest$17]];
            else
             var
              _rn_=get_prec(0),
              match$20=make_padprec_fmt_ebb(get_int_pad(0),_rn_,fmt_rest$17),
              fmt_rest$18=match$20[3],
              prec$4=match$20[2],
              pad$8=match$20[1],
              _rm_=[0,[4,iconv$2,pad$8,prec$4,fmt_rest$18]];
            var fmt_result=_rm_;
            break;
           case 69:
           case 70:
           case 71:
           case 72:
           case 101:
           case 102:
           case 103:
           case 104:
            var
             space$1=get_space(0),
             hash$1=get_hash(0),
             plus$2=get_plus(0),
             flag=
              plus$2
               ?space$1
                 ?legacy_behavior$0
                   ?1
                   :incompatible_flag(pct_ind,str_ind,32,cst$50)
                 :1
               :space$1?2:0,
             switch$4=0;
            if(73 <= symb)
             {var switcher=symb - 101 | 0;
              if(3 < switcher >>> 0)
               switch$4 = 1;
              else
               {switch(switcher)
                 {case 0:var _rw_=1;break;
                  case 1:var _rw_=0;break;
                  case 2:var _rw_=3;break;
                  default:var _rw_=6}
                var kind=_rw_}}
            else
             if(69 <= symb)
              {var switch$5=0;
               switch(symb - 69 | 0)
                {case 0:var _rx_=2;break;
                 case 1:switch$4 = 1;switch$5 = 1;break;
                 case 2:var _rx_=4;break;
                 default:var _rx_=7}
               if(! switch$5)var kind=_rx_}
             else
              switch$4 = 1;
            if(switch$4)
             {var switch$6=0;
              if(hash$1)
               if(70 === symb)var kind=8;else switch$6 = 1;
              else
               if(70 === symb)var kind=5;else switch$6 = 1;
              if(switch$6)throw [0,Assert_failure,_a3_]}
            var
             fconv=[0,flag,kind],
             match$13=parse(str_ind,end_ind),
             fmt_rest$11=match$13[1];
            if(get_ign(0))
             {var match=get_prec(0);
              if(typeof match === "number")
               var _rd_=match?incompatible_flag(pct_ind,str_ind,95,cst$40):0;
              else
               var ndec=match[1],_rd_=[0,ndec];
              var
               ignored$4=[6,get_pad_opt(95),_rd_],
               _re_=[0,[23,ignored$4,fmt_rest$11]]}
            else
             var
              _rf_=get_prec(0),
              match$14=make_padprec_fmt_ebb(get_pad(0),_rf_,fmt_rest$11),
              fmt_rest$12=match$14[3],
              prec$3=match$14[2],
              pad$5=match$14[1],
              _re_=[0,[8,fconv,pad$5,prec$3,fmt_rest$12]];
            var fmt_result=_re_;
            break;
           default:switch$0 = 1}
        if(switch$0)
         {var switch$7=0;
          if(108 <= symb)
           if(111 <= symb)
            switch$7 = 1;
           else
            {var switch$8=0;
             switch(symb - 108 | 0)
              {case 0:
                var
                 _qW_=caml_string_get(str,str_ind),
                 _qX_=get_space(0),
                 _qY_=get_hash(0),
                 iconv=
                  compute_int_conv
                   (pct_ind,str_ind + 1 | 0,get_plus(0),_qY_,_qX_,_qW_),
                 match$0=parse(str_ind + 1 | 0,end_ind),
                 fmt_rest=match$0[1];
                if(get_ign(0))
                 var
                  ignored=[3,iconv,get_pad_opt(95)],
                  _qZ_=[0,[23,ignored,fmt_rest]];
                else
                 var
                  _q1_=get_prec(0),
                  match$1=make_padprec_fmt_ebb(get_int_pad(0),_q1_,fmt_rest),
                  fmt_rest$0=match$1[3],
                  prec$0=match$1[2],
                  pad$0=match$1[1],
                  _qZ_=[0,[5,iconv,pad$0,prec$0,fmt_rest$0]];
                var _q0_=_qZ_;
                break;
               case 1:switch$7 = 1;switch$8 = 1;break;
               default:
                var
                 _q2_=caml_string_get(str,str_ind),
                 _q3_=get_space(0),
                 _q4_=get_hash(0),
                 iconv$0=
                  compute_int_conv
                   (pct_ind,str_ind + 1 | 0,get_plus(0),_q4_,_q3_,_q2_),
                 match$2=parse(str_ind + 1 | 0,end_ind),
                 fmt_rest$1=match$2[1];
                if(get_ign(0))
                 var
                  ignored$0=[4,iconv$0,get_pad_opt(95)],
                  _q5_=[0,[23,ignored$0,fmt_rest$1]];
                else
                 var
                  _q6_=get_prec(0),
                  match$3=make_padprec_fmt_ebb(get_int_pad(0),_q6_,fmt_rest$1),
                  fmt_rest$2=match$3[3],
                  prec$1=match$3[2],
                  pad$1=match$3[1],
                  _q5_=[0,[6,iconv$0,pad$1,prec$1,fmt_rest$2]];
                var _q0_=_q5_}
             if(! switch$8)var fmt_result=_q0_}
          else
           if(76 === symb)
            {var
              _q7_=caml_string_get(str,str_ind),
              _q8_=get_space(0),
              _q9_=get_hash(0),
              iconv$1=
               compute_int_conv
                (pct_ind,str_ind + 1 | 0,get_plus(0),_q9_,_q8_,_q7_),
              match$4=parse(str_ind + 1 | 0,end_ind),
              fmt_rest$3=match$4[1];
             if(get_ign(0))
              var
               ignored$1=[5,iconv$1,get_pad_opt(95)],
               _q__=[0,[23,ignored$1,fmt_rest$3]];
             else
              var
               _q$_=get_prec(0),
               match$5=make_padprec_fmt_ebb(get_int_pad(0),_q$_,fmt_rest$3),
               fmt_rest$4=match$5[3],
               prec$2=match$5[2],
               pad$2=match$5[1],
               _q__=[0,[7,iconv$1,pad$2,prec$2,fmt_rest$4]];
             var fmt_result=_q__}
           else
            switch$7 = 1;
          if(switch$7)
           var
            fmt_result=
             caml_call3(failwith_message(_aP_),str,str_ind - 1 | 0,symb)}
        if(1 - legacy_behavior$0)
         {var _qN_=1 - plus_used[1],plus$0=_qN_?plus:_qN_;
          if(plus$0)incompatible_flag(pct_ind,str_ind,symb,cst$41);
          var _qO_=1 - hash_used[1],hash$0=_qO_?hash:_qO_;
          if(hash$0)incompatible_flag(pct_ind,str_ind,symb,cst$42);
          var _qP_=1 - space_used[1],space$0=_qP_?space:_qP_;
          if(space$0)incompatible_flag(pct_ind,str_ind,symb,cst$43);
          var _qQ_=1 - pad_used[1],_qR_=_qQ_?caml_notequal([0,pad],_aQ_):_qQ_;
          if(_qR_)incompatible_flag(pct_ind,str_ind,symb,cst_padding$0);
          var
           _qS_=1 - prec_used[1],
           _qT_=_qS_?caml_notequal([0,prec],_aR_):_qS_;
          if(_qT_)
           {var _qU_=ign?95:symb;
            incompatible_flag(pct_ind,str_ind,_qU_,cst_precision$2)}
          var plus$1=ign?plus:ign;
          if(plus$1)incompatible_flag(pct_ind,str_ind,95,cst$44)}
        var _qV_=1 - ign_used[1],ign$0=_qV_?ign:_qV_;
        if(ign$0)
         {var switch$9=0;
          if(38 <= symb)
           {if(44 !== symb && 64 !== symb)switch$9 = 1}
          else
           if(33 !== symb && ! (37 <= symb))switch$9 = 1;
          var switch$10=0;
          if(switch$9 || ! legacy_behavior$0)switch$10 = 1;
          if(switch$10)incompatible_flag(pct_ind,str_ind,symb,cst$45)}
        return fmt_result}
      function parse(lit_start,end_ind)
       {var str_ind=lit_start;
        for(;;)
         {if(str_ind === end_ind)return add_literal(lit_start,str_ind,0);
          var match=caml_string_get(str,str_ind);
          if(37 === match)
           {var str_ind$2=str_ind + 1 | 0;
            if(str_ind$2 === end_ind)unexpected_end_of_format(end_ind);
            var
             match$1=caml_string_get(str,str_ind$2),
             _qM_=
              95 === match$1
               ?parse_flags(str_ind,str_ind$2 + 1 | 0,end_ind,1)
               :parse_flags(str_ind,str_ind$2,end_ind,0),
             fmt_rest=_qM_[1];
            return add_literal(lit_start,str_ind,fmt_rest)}
          if(64 === match)
           {var str_ind$0=str_ind + 1 | 0;
            if(str_ind$0 === end_ind)
             var match$0=_aT_;
            else
             {var c=caml_string_get(str,str_ind$0),switch$0=0;
              if(65 <= c)
               if(94 <= c)
                {var switcher=c - 123 | 0;
                 if(2 < switcher >>> 0)
                  switch$0 = 1;
                 else
                  switch(switcher)
                   {case 0:
                     var match$0=parse_tag(1,str_ind$0 + 1 | 0,end_ind);break;
                    case 1:switch$0 = 1;break;
                    default:
                     var
                      match$3=parse(str_ind$0 + 1 | 0,end_ind),
                      fmt_rest$2=match$3[1],
                      match$0=[0,[17,1,fmt_rest$2]]}}
               else
                if(91 <= c)
                 switch(c - 91 | 0)
                  {case 0:
                    var match$0=parse_tag(0,str_ind$0 + 1 | 0,end_ind);break;
                   case 1:switch$0 = 1;break;
                   default:
                    var
                     match$4=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$3=match$4[1],
                     match$0=[0,[17,0,fmt_rest$3]]}
                else
                 switch$0 = 1;
              else
               if(10 === c)
                var
                 match$5=parse(str_ind$0 + 1 | 0,end_ind),
                 fmt_rest$4=match$5[1],
                 match$0=[0,[17,3,fmt_rest$4]];
               else
                if(32 <= c)
                 switch(c - 32 | 0)
                  {case 0:
                    var
                     match$6=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$5=match$6[1],
                     match$0=[0,[17,_aU_,fmt_rest$5]];
                    break;
                   case 5:
                    var switch$1=0;
                    if
                     ((str_ind$0 + 1 | 0)
                      <
                      end_ind
                      &&
                      37
                      ===
                      caml_string_get(str,str_ind$0 + 1 | 0))
                     {var
                       match$7=parse(str_ind$0 + 2 | 0,end_ind),
                       fmt_rest$6=match$7[1],
                       match$0=[0,[17,6,fmt_rest$6]];
                      switch$1 = 1}
                    if(! switch$1)
                     var
                      match$8=parse(str_ind$0,end_ind),
                      fmt_rest$7=match$8[1],
                      match$0=[0,[12,64,fmt_rest$7]];
                    break;
                   case 12:
                    var
                     match$9=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$8=match$9[1],
                     match$0=[0,[17,_aV_,fmt_rest$8]];
                    break;
                   case 14:
                    var
                     match$10=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$9=match$10[1],
                     match$0=[0,[17,4,fmt_rest$9]];
                    break;
                   case 27:
                    var match$0=parse_good_break(str_ind$0 + 1 | 0,end_ind);
                    break;
                   case 28:
                    var match$0=parse_magic_size(str_ind$0 + 1 | 0,end_ind);
                    break;
                   case 31:
                    var
                     match$11=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$10=match$11[1],
                     match$0=[0,[17,2,fmt_rest$10]];
                    break;
                   case 32:
                    var
                     match$12=parse(str_ind$0 + 1 | 0,end_ind),
                     fmt_rest$11=match$12[1],
                     match$0=[0,[17,5,fmt_rest$11]];
                    break;
                   default:switch$0 = 1}
                else
                 switch$0 = 1;
              if(switch$0)
               var
                match$2=parse(str_ind$0 + 1 | 0,end_ind),
                fmt_rest$1=match$2[1],
                match$0=[0,[17,[2,c],fmt_rest$1]]}
            var fmt_rest$0=match$0[1];
            return add_literal(lit_start,str_ind,fmt_rest$0)}
          var str_ind$1=str_ind + 1 | 0,str_ind=str_ind$1;
          continue}}
      return parse(0,caml_ml_string_length(str))}
    function format_of_string_fmtty(str,fmtty)
     {var match=fmt_ebb_of_string(0,str),fmt=match[1];
      try
       {var _qK_=[0,type_format(fmt,fmtty),str];return _qK_}
      catch(_qL_)
       {_qL_ = caml_wrap_exception(_qL_);
        if(_qL_ === Type_mismatch)
         {var _qJ_=string_of_fmtty(fmtty);
          return caml_call2(failwith_message(_a5_),str,_qJ_)}
        throw _qL_}}
    function format_of_string_format(str,param)
     {var
       str$0=param[2],
       fmt=param[1],
       match=fmt_ebb_of_string(0,str),
       fmt$0=match[1];
      try
       {var _qH_=[0,type_format(fmt$0,fmtty_of_fmt(fmt)),str];return _qH_}
      catch(_qI_)
       {_qI_ = caml_wrap_exception(_qI_);
        if(_qI_ === Type_mismatch)
         return caml_call2(failwith_message(_a6_),str,str$0);
        throw _qI_}}
    var
     CamlinternalFormat=
      [0,
       is_in_char_set,
       rev_char_set,
       create_char_set,
       add_in_char_set,
       freeze_char_set,
       param_format_of_ignored_format,
       make_printf,
       make_iprintf,
       output_acc,
       bufput_acc,
       strput_acc,
       type_format,
       fmt_ebb_of_string,
       format_of_string_fmtty,
       format_of_string_format,
       char_of_iconv,
       string_of_formatting_lit,
       string_of_fmtty,
       string_of_fmt,
       open_box_of_string,
       symm,
       trans,
       recast];
    caml_register_global(807,CamlinternalFormat,"CamlinternalFormat");
    function kfprintf(k,o,param)
     {var fmt=param[1],_qG_=0;
      return make_printf
              (function(acc){output_acc(o,acc);return caml_call1(k,o)},
               _qG_,
               fmt)}
    function kbprintf(k,b,param)
     {var fmt=param[1],_qF_=0;
      return make_printf
              (function(acc){bufput_acc(b,acc);return caml_call1(k,b)},
               _qF_,
               fmt)}
    function ikfprintf(k,oc,param)
     {var fmt=param[1];return make_iprintf(k,oc,fmt)}
    function fprintf(oc,fmt){return kfprintf(function(_qE_){return 0},oc,fmt)}
    function bprintf(b,fmt){return kbprintf(function(_qD_){return 0},b,fmt)}
    function ifprintf(oc,fmt)
     {return ikfprintf(function(_qC_){return 0},oc,fmt)}
    function ibprintf(b,fmt){return ikfprintf(function(_qB_){return 0},b,fmt)}
    function printf(fmt){return fprintf(stdout,fmt)}
    function eprintf(fmt){return fprintf(stderr,fmt)}
    function ksprintf(k,param)
     {var fmt=param[1];
      function k$0(acc)
       {var buf=create$2(64);
        strput_acc(buf,acc);
        return caml_call1(k,contents(buf))}
      return make_printf(k$0,0,fmt)}
    function sprintf(fmt){return ksprintf(function(s){return s},fmt)}
    var
     Stdlib_Printf=
      [0,
       fprintf,
       printf,
       eprintf,
       sprintf,
       bprintf,
       ifprintf,
       ibprintf,
       kfprintf,
       ikfprintf,
       ksprintf,
       kbprintf,
       ikfprintf,
       ksprintf];
    caml_register_global(808,Stdlib_Printf,"Stdlib__Printf");
    var
     Bad=[248,cst_Stdlib_Arg_Bad,caml_fresh_oo_id(0)],
     Help=[248,cst_Stdlib_Arg_Help,caml_fresh_oo_id(0)],
     Stop=[248,cst_Stdlib_Arg_Stop,caml_fresh_oo_id(0)];
    function assoc3(x,l)
     {var l$0=l;
      for(;;)
       {if(l$0)
         {var match=l$0[1],y2=match[2],y1=match[1];
          if(caml_equal(y1,x))return y2;
          var l$1=l$0[2],l$0=l$1;
          continue}
        throw Not_found}}
    function split$1(s)
     {var
       i=index$0(s,61),
       len=caml_ml_string_length(s),
       _qA_=sub$0(s,i + 1 | 0,len - (i + 1 | 0) | 0);
      return [0,sub$0(s,0,i),_qA_]}
    function make_symlist(prefix,sep,suffix,l)
     {if(l)
       {var t=l[2],h=l[1],_qz_=cat(prefix,h);
        return cat
                (fold_left$0(function(x,y){return cat(x,cat(sep,y))},_qz_,t),
                 suffix)}
      return cst_none}
    function help_action(param){throw [0,Stop,_a9_]}
    function add_help(speclist)
     {try
       {assoc3(cst_help$2,speclist);var _qw_=0,_qu_=_qw_}
      catch(_qy_)
       {_qy_ = caml_wrap_exception(_qy_);
        if(_qy_ !== Not_found)throw _qy_;
        var
         _qu_=
          [0,[0,cst_help,[0,help_action],cst_Display_this_list_of_optio],0]}
      try
       {assoc3(cst_help$1,speclist);var _qv_=0,add2=_qv_}
      catch(_qx_)
       {_qx_ = caml_wrap_exception(_qx_);
        if(_qx_ !== Not_found)throw _qx_;
        var
         add2=
          [0,
           [0,cst_help$0,[0,help_action],cst_Display_this_list_of_optio$0],
           0]}
      return append(speclist,append(_qu_,add2))}
    function usage_b(buf,speclist,errmsg)
     {caml_call1(bprintf(buf,_a__),errmsg);
      var _qr_=add_help(speclist);
      return iter$2
              (function(param)
                {var
                  doc=param[3],
                  spec=param[2],
                  key=param[1],
                  _qs_=0 < caml_ml_string_length(doc)?1:0;
                 if(_qs_)
                  {if(11 === spec[0])
                    {var l=spec[1],_qt_=make_symlist(cst$53,cst$52,cst$51,l);
                     return caml_call3(bprintf(buf,_a8_),key,_qt_,doc)}
                   return caml_call2(bprintf(buf,_a7_),key,doc)}
                 return _qs_},
               _qr_)}
    function usage_string(speclist,errmsg)
     {var b=create$2(200);usage_b(b,speclist,errmsg);return contents(b)}
    function usage(speclist,errmsg)
     {var _qq_=usage_string(speclist,errmsg);
      return caml_call1(eprintf(_a$_),_qq_)}
    var current=[0,0];
    function bool_of_string_opt$0(x)
     {try
       {var _qo_=[0,bool_of_string(x)];return _qo_}
      catch(_qp_)
       {_qp_ = caml_wrap_exception(_qp_);
        if(_qp_[1] === Invalid_argument)return 0;
        throw _qp_}}
    function int_of_string_opt$0(x)
     {try
       {var _qm_=[0,caml_int_of_string(x)];return _qm_}
      catch(_qn_)
       {_qn_ = caml_wrap_exception(_qn_);
        if(_qn_[1] === Failure)return 0;
        throw _qn_}}
    function float_of_string_opt(x)
     {try
       {var _qk_=[0,caml_float_of_string(x)];return _qk_}
      catch(_ql_)
       {_ql_ = caml_wrap_exception(_ql_);
        if(_ql_[1] === Failure)return 0;
        throw _ql_}}
    function parse_and_expand_argv_dynamic_
     (allow_expand,current,argv,speclist,anonfun,errmsg)
     {var initpos=current[1];
      function convert_error(error)
       {var
         b=create$2(200),
         progname=
          initpos < argv[1].length - 1
           ?caml_check_bound(argv[1],initpos)[1 + initpos]
           :cst$54;
        switch(error[0])
         {case 0:
           var _qj_=error[1];
           if
            (caml_string_notequal(_qj_,cst_help$3)
             &&
             caml_string_notequal(_qj_,cst_help$4))
            caml_call2(bprintf(b,_ba_),progname,_qj_);
           break;
          case 1:
           var expected=error[3],arg=error[2],opt=error[1];
           caml_call4(bprintf(b,_bd_),progname,arg,opt,expected);
           break;
          case 2:var s=error[1];caml_call2(bprintf(b,_be_),progname,s);break;
          default:var s$0=error[1];caml_call2(bprintf(b,_bf_),progname,s$0)}
        usage_b(b,speclist[1],errmsg);
        if(! caml_equal(error,_bb_) && ! caml_equal(error,_bc_))
         return [0,Bad,contents(b)];
        return [0,Help,contents(b)]}
      current[1]++;
      for(;;)
       {if(current[1] < argv[1].length - 1)
         {try
           {var
             _p__=current[1],
             s=caml_check_bound(argv[1],_p__)[1 + _p__],
             switch$0=0;
            if(1 <= caml_ml_string_length(s) && 45 === caml_string_get(s,0))
             {try
               {var
                 follow$1=0,
                 _qa_=assoc3(s,speclist[1]),
                 follow$0=follow$1,
                 action=_qa_}
              catch(_qh_)
               {_qh_ = caml_wrap_exception(_qh_);
                if(_qh_ !== Not_found)throw _qh_;
                try
                 {var
                   match=split$1(s),
                   arg=match[2],
                   keyword=match[1],
                   follow=[0,arg],
                   _p$_=assoc3(keyword,speclist[1])}
                catch(_qi_)
                 {_qi_ = caml_wrap_exception(_qi_);
                  if(_qi_ === Not_found)throw [0,Stop,[0,s]];
                  throw _qi_;
                  var _qb_=_qi_}
                var follow$0=follow,action=_p$_,_qc_=_qh_}
              var
               no_arg$0=
                function(s,follow)
                 {function no_arg(param)
                   {if(follow)
                     {var arg=follow[1];throw [0,Stop,[1,s,arg,cst_no_argument]]}
                    return 0}
                  return no_arg},
               no_arg=no_arg$0(s,follow$0),
               get_arg$0=
                function(s,follow)
                 {function get_arg(param)
                   {if(follow){var arg=follow[1];return arg}
                    if((current[1] + 1 | 0) < argv[1].length - 1)
                     {var _qg_=current[1] + 1 | 0;
                      return caml_check_bound(argv[1],_qg_)[1 + _qg_]}
                    throw [0,Stop,[2,s]]}
                  return get_arg},
               get_arg=get_arg$0(s,follow$0),
               consume_arg$0=
                function(follow)
                 {function consume_arg(param)
                   {return follow?0:(current[1]++,0)}
                  return consume_arg},
               consume_arg=consume_arg$0(follow$0),
               treat_action$0=
                function(s,no_arg,get_arg,consume_arg)
                 {function treat_action(param)
                   {switch(param[0])
                     {case 0:var f=param[1];no_arg(0);return caml_call1(f,0);
                      case 1:
                       var
                        f$0=param[1],
                        arg=get_arg(0),
                        match=bool_of_string_opt$0(arg);
                       if(match)
                        {var s$0=match[1];caml_call1(f$0,s$0);return consume_arg(0)}
                       throw [0,Stop,[1,s,arg,cst_a_boolean]];
                      case 2:var r=param[1];no_arg(0);r[1] = 1;return 0;
                      case 3:var r$0=param[1];no_arg(0);r$0[1] = 0;return 0;
                      case 4:
                       var f$1=param[1],arg$0=get_arg(0);
                       caml_call1(f$1,arg$0);
                       return consume_arg(0);
                      case 5:
                       var r$1=param[1];r$1[1] = get_arg(0);return consume_arg(0);
                      case 6:
                       var
                        f$2=param[1],
                        arg$1=get_arg(0),
                        match$0=int_of_string_opt$0(arg$1);
                       if(match$0)
                        {var x=match$0[1];caml_call1(f$2,x);return consume_arg(0)}
                       throw [0,Stop,[1,s,arg$1,cst_an_integer]];
                      case 7:
                       var
                        r$2=param[1],
                        arg$2=get_arg(0),
                        match$1=int_of_string_opt$0(arg$2);
                       if(match$1)
                        {var x$0=match$1[1];r$2[1] = x$0;return consume_arg(0)}
                       throw [0,Stop,[1,s,arg$2,cst_an_integer$0]];
                      case 8:
                       var
                        f$3=param[1],
                        arg$3=get_arg(0),
                        match$2=float_of_string_opt(arg$3);
                       if(match$2)
                        {var x$1=match$2[1];
                         caml_call1(f$3,x$1);
                         return consume_arg(0)}
                       throw [0,Stop,[1,s,arg$3,cst_a_float]];
                      case 9:
                       var
                        r$3=param[1],
                        arg$4=get_arg(0),
                        match$3=float_of_string_opt(arg$4);
                       if(match$3)
                        {var x$2=match$3[1];r$3[1] = x$2;return consume_arg(0)}
                       throw [0,Stop,[1,s,arg$4,cst_a_float$0]];
                      case 10:
                       var specs=param[1];
                       no_arg(0);
                       return iter$2(treat_action,specs);
                      case 11:
                       var f$4=param[2],symb=param[1],arg$5=get_arg(0);
                       if(mem(arg$5,symb))
                        {caml_call1(f$4,arg$5);return consume_arg(0)}
                       throw [0,
                              Stop,
                              [1,
                               s,
                               arg$5,
                               cat(cst_one_of,make_symlist(cst$57,cst$56,cst$55,symb))]];
                      case 12:
                       var f$5=param[1];
                       no_arg(0);
                       for(;;)
                        {if(current[1] < (argv[1].length - 1 - 1 | 0))
                          {var _qd_=current[1] + 1 | 0;
                           caml_call1(f$5,caml_check_bound(argv[1],_qd_)[1 + _qd_]);
                           consume_arg(0);
                           continue}
                         return 0}
                      case 13:
                       var f$6=param[1];
                       no_arg(0);
                       var acc=[0,0];
                       for(;;)
                        {if(current[1] < (argv[1].length - 1 - 1 | 0))
                          {var _qf_=current[1] + 1 | 0,_qe_=acc[1];
                           acc[1] = [0,caml_check_bound(argv[1],_qf_)[1 + _qf_],_qe_];
                           consume_arg(0);
                           continue}
                         return caml_call1(f$6,rev(acc[1]))}
                      default:
                       var f$7=param[1];
                       if(1 - allow_expand)
                        throw [0,Invalid_argument,cst_Arg_Expand_is_is_only_allo];
                       var arg$6=get_arg(0),newarg=caml_call1(f$7,arg$6);
                       consume_arg(0);
                       var
                        before=sub$1(argv[1],0,current[1] + 1 | 0),
                        after=
                         sub$1
                          (argv[1],
                           current[1] + 1 | 0,
                           (argv[1].length - 1 - current[1] | 0) - 1 | 0);
                       argv[1]
                       =
                       caml_array_concat([0,before,[0,newarg,[0,after,0]]]);
                       return 0}}
                  return treat_action},
               treat_action=treat_action$0(s,no_arg,get_arg,consume_arg);
              treat_action(action);
              switch$0 = 1}
            if(! switch$0)caml_call1(anonfun,s)}
          catch(exn$0)
           {exn$0 = caml_wrap_exception(exn$0);
            if(exn$0[1] === Bad){var m=exn$0[2];throw convert_error([3,m])}
            if(exn$0[1] === Stop){var e=exn$0[2];throw convert_error(e)}
            throw exn$0;
            var exn=exn$0}
          current[1]++;
          continue}
        return 0}}
    function parse_and_expand_argv_dynamic
     (current,argv,speclist,anonfun,errmsg)
     {return parse_and_expand_argv_dynamic_
              (1,current,argv,speclist,anonfun,errmsg)}
    function parse_argv_dynamic(opt,argv,speclist,anonfun,errmsg)
     {if(opt)var sth=opt[1],current$0=sth;else var current$0=current;
      return parse_and_expand_argv_dynamic_
              (0,current$0,[0,argv],speclist,anonfun,errmsg)}
    function parse_argv(opt,argv,speclist,anonfun,errmsg)
     {if(opt)var sth=opt[1],current$0=sth;else var current$0=current;
      return parse_argv_dynamic
              ([0,current$0],argv,[0,speclist],anonfun,errmsg)}
    function parse(l,f,msg)
     {try
       {var _p9_=parse_argv(0,caml_sys_argv(0),l,f,msg);return _p9_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(exn[1] === Bad)
         {var msg$0=exn[2];caml_call1(eprintf(_bg_),msg$0);return exit(2)}
        if(exn[1] === Help)
         {var msg$1=exn[2];caml_call1(printf(_bh_),msg$1);return exit(0)}
        throw exn}}
    function parse_dynamic(l,f,msg)
     {try
       {var _p8_=parse_argv_dynamic(0,caml_sys_argv(0),l,f,msg);return _p8_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(exn[1] === Bad)
         {var msg$0=exn[2];caml_call1(eprintf(_bi_),msg$0);return exit(2)}
        if(exn[1] === Help)
         {var msg$1=exn[2];caml_call1(printf(_bj_),msg$1);return exit(0)}
        throw exn}}
    function parse_expand(l,f,msg)
     {try
       {var
         argv=[0,caml_sys_argv(0)],
         spec=[0,l],
         current$0=[0,current[1]],
         _p7_=parse_and_expand_argv_dynamic(current$0,argv,spec,f,msg);
        return _p7_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(exn[1] === Bad)
         {var msg$0=exn[2];caml_call1(eprintf(_bk_),msg$0);return exit(2)}
        if(exn[1] === Help)
         {var msg$1=exn[2];caml_call1(printf(_bl_),msg$1);return exit(0)}
        throw exn}}
    function second_word(s)
     {var len=caml_ml_string_length(s);
      function loop(n)
       {var n$0=n;
        for(;;)
         {if(len <= n$0)return len;
          if(32 === caml_string_get(s,n$0))
           {var n$1=n$0 + 1 | 0,n$0=n$1;continue}
          return n$0}}
      try
       {var n$0=index$0(s,9)}
      catch(_p5_)
       {_p5_ = caml_wrap_exception(_p5_);
        if(_p5_ === Not_found)
         {try
           {var n=index$0(s,32)}
          catch(_p6_)
           {_p6_ = caml_wrap_exception(_p6_);
            if(_p6_ === Not_found)return len;
            throw _p6_}
          return loop(n + 1 | 0)}
        throw _p5_}
      return loop(n$0 + 1 | 0)}
    function max_arg_len(cur,param)
     {var doc=param[3],spec=param[2],kwd=param[1];
      return 11 === spec[0]
              ?max$1(cur,caml_ml_string_length(kwd))
              :max$1(cur,caml_ml_string_length(kwd) + second_word(doc) | 0)}
    function replace_leading_tab(s)
     {var seen=[0,0];
      return map$6
              (function(c)
                {if(9 === c && ! seen[1]){seen[1] = 1;return 32}return c},
               s)}
    function align(opt,speclist)
     {if(opt)var sth=opt[1],limit=sth;else var limit=max_int;
      var
       completed=add_help(speclist),
       len=fold_left$0(max_arg_len,0,completed),
       len$0=min$1(len,limit);
      return map$4
              (function(ksd)
                {var _p3_=ksd[1],_p4_=ksd[2];
                 if(caml_string_notequal(ksd[3],cst$58))
                  {if(11 === _p4_[0])
                    {var
                      msg$0=ksd[3],
                      cutcol$0=second_word(msg$0),
                      spaces$0=make$1(max$1(0,len$0 - cutcol$0 | 0) + 3 | 0,32);
                     return [0,
                             _p3_,
                             _p4_,
                             cat(cst$59,cat(spaces$0,replace_leading_tab(msg$0)))]}
                   var
                    msg=ksd[3],
                    spec=ksd[2],
                    cutcol=second_word(msg),
                    kwd_len=caml_ml_string_length(_p3_),
                    diff=(len$0 - kwd_len | 0) - cutcol | 0;
                   if(0 < diff)
                    {var
                      spaces=make$1(diff,32),
                      prefix=sub$0(replace_leading_tab(msg),0,cutcol),
                      suffix=
                       sub$0(msg,cutcol,caml_ml_string_length(msg) - cutcol | 0);
                     return [0,_p3_,spec,cat(prefix,cat(spaces,suffix))]}
                   return [0,_p3_,spec,replace_leading_tab(msg)]}
                 return ksd},
               completed)}
    function read_aux(trim,sep,file)
     {var ic=open_bin$0(file),buf=create$2(200),words=[0,0];
      function stash(param)
       {var s=contents(buf);
        if(trim)
         {var len=caml_ml_string_length(s),switch$0=0;
          if(0 < len && 13 === caml_string_get(s,len - 1 | 0))
           {var _p2_=sub$0(s,0,len - 1 | 0);switch$0 = 1}
          if(! switch$0)var _p2_=s;
          var word=_p2_}
        else
         var word=s;
        words[1] = [0,word,words[1]];
        return clear$1(buf)}
      try
       {for(;;)
         {var c=caml_ml_input_char(ic);
          if(c === sep)stash(0);else add_char(buf,c);
          continue}}
      catch(_p1_)
       {_p1_ = caml_wrap_exception(_p1_);
        if(_p1_ === End_of_file)
         {if(0 < buf[2])stash(0);
          caml_ml_close_channel(ic);
          return of_list(rev(words[1]))}
        throw _p1_}}
    var _bm_=10,_bn_=1;
    function read_arg(_p0_){return read_aux(_bn_,_bm_,_p0_)}
    var _bo_=0,_bp_=0;
    function read_arg0(_pZ_){return read_aux(_bp_,_bo_,_pZ_)}
    function write_aux(sep,file,args)
     {var oc=open_bin(file);
      iter$5(function(s){return caml_call2(fprintf(oc,_bq_),s,sep)},args);
      return close(oc)}
    var _br_=10;
    function write_arg(_pX_,_pY_){return write_aux(_br_,_pX_,_pY_)}
    var _bs_=0;
    function write_arg0(_pV_,_pW_){return write_aux(_bs_,_pV_,_pW_)}
    var
     Stdlib_Arg=
      [0,
       parse,
       parse_dynamic,
       parse_argv,
       parse_argv_dynamic,
       parse_and_expand_argv_dynamic,
       parse_expand,
       Help,
       Bad,
       usage,
       usage_string,
       align,
       current,
       read_arg,
       read_arg0,
       write_arg,
       write_arg0];
    caml_register_global(809,Stdlib_Arg,"Stdlib__Arg");
    var
     Stdlib_Atomic=
      [0,make,get,set,exchange,compare_and_set,fetch_and_add,incr,decr];
    caml_register_global(810,Stdlib_Atomic,"Stdlib__Atomic");
    var printers=[0,0];
    function field(x,i)
     {var f=x[1 + i];
      return is_block(f)
              ?caml_obj_tag(f) === 252
                ?caml_call1(sprintf(_bt_),f)
                :caml_obj_tag(f) === 253?to_string(f):cst$60
              :caml_call1(sprintf(_bu_),f)}
    function other_fields(x,i)
     {if(x.length - 1 <= i)return cst$61;
      var _pT_=other_fields(x,i + 1 | 0),_pU_=field(x,i);
      return caml_call2(sprintf(_bv_),_pU_,_pT_)}
    function use_printers(x)
     {function conv(param)
       {var param$0=param;
        for(;;)
         {if(param$0)
           {var tl=param$0[2],hd=param$0[1];
            try
             {var switch$0=0,val=caml_call1(hd,x);switch$0 = 1}
            catch(_pS_){}
            if(switch$0 && val){var s=val[1];return [0,s]}
            var param$0=tl;
            continue}
          return 0}}
      return conv(printers[1])}
    function to_string_default(x)
     {if(x === Out_of_memory)return cst_Out_of_memory;
      if(x === Stack_overflow)return cst_Stack_overflow;
      if(x[1] === Match_failure)
       {var match$0=x[2],char$0=match$0[3],line=match$0[2],file=match$0[1];
        return caml_call5
                (sprintf(locfmt),
                 file,
                 line,
                 char$0,
                 char$0 + 5 | 0,
                 cst_Pattern_matching_failed)}
      if(x[1] === Assert_failure)
       {var
         match$1=x[2],
         char$1=match$1[3],
         line$0=match$1[2],
         file$0=match$1[1];
        return caml_call5
                (sprintf(locfmt),
                 file$0,
                 line$0,
                 char$1,
                 char$1 + 6 | 0,
                 cst_Assertion_failed)}
      if(x[1] === Undefined_recursive_module)
       {var
         match$2=x[2],
         char$2=match$2[3],
         line$1=match$2[2],
         file$1=match$2[1];
        return caml_call5
                (sprintf(locfmt),
                 file$1,
                 line$1,
                 char$2,
                 char$2 + 6 | 0,
                 cst_Undefined_recursive_module)}
      if(0 === caml_obj_tag(x))
       {var constructor=x[1][1],match=x.length - 1;
        if(2 < match >>> 0)
         var
          _pO_=other_fields(x,2),
          _pP_=field(x,1),
          _pR_=caml_call2(sprintf(_bw_),_pP_,_pO_);
        else
         switch(match)
          {case 0:var _pR_=cst$62;break;
           case 1:var _pR_=cst$63;break;
           default:var _pQ_=field(x,1),_pR_=caml_call1(sprintf(_bx_),_pQ_)}
        return cat(constructor,_pR_)}
      return x[1]}
    function to_string$6(e)
     {var match=use_printers(e);
      if(match){var s=match[1];return s}
      return to_string_default(e)}
    function print(fct,arg)
     {try
       {var _pN_=caml_call1(fct,arg);return _pN_}
      catch(x)
       {x = caml_wrap_exception(x);
        var _pM_=to_string$6(x);
        caml_call1(eprintf(_by_),_pM_);
        caml_ml_flush(stderr);
        throw x}}
    function catch$0(fct,arg)
     {try
       {var _pL_=caml_call1(fct,arg);return _pL_}
      catch(x)
       {x = caml_wrap_exception(x);
        caml_ml_flush(stdout);
        var _pK_=to_string$6(x);
        caml_call1(eprintf(_bz_),_pK_);
        return exit(2)}}
    function raw_backtrace_entries(bt){return bt}
    function convert_raw_backtrace(bt)
     {return [0,runtime.caml_convert_raw_backtrace(bt)]}
    function format_backtrace_slot(pos,slot)
     {function info(is_raise)
       {return is_raise
                ?0 === pos?cst_Raised_at:cst_Re_raised_at
                :0 === pos?cst_Raised_by_primitive_operat:cst_Called_from}
      if(0 === slot[0])
       {var
         _pC_=slot[5],
         _pD_=slot[4],
         _pE_=slot[3],
         _pF_=slot[6]?cst_inlined:cst$64,
         _pG_=slot[2],
         _pH_=slot[7],
         _pI_=info(slot[1]);
        return [0,
                caml_call7(sprintf(_bA_),_pI_,_pH_,_pG_,_pF_,_pE_,_pD_,_pC_)]}
      if(slot[1])return 0;
      var _pJ_=info(0);
      return [0,caml_call1(sprintf(_bB_),_pJ_)]}
    function print_raw_backtrace(outchan,raw_backtrace)
     {var backtrace=convert_raw_backtrace(raw_backtrace);
      if(backtrace)
       {var a=backtrace[1],_pA_=a.length - 1 - 1 | 0,_pz_=0;
        if(! (_pA_ < 0))
         {var i=_pz_;
          for(;;)
           {var match=format_backtrace_slot(i,caml_check_bound(a,i)[1 + i]);
            if(match){var str=match[1];caml_call1(fprintf(outchan,_bC_),str)}
            var _pB_=i + 1 | 0;
            if(_pA_ !== i){var i=_pB_;continue}
            break}}
        return 0}
      return fprintf(outchan,_bD_)}
    function print_backtrace(outchan)
     {return print_raw_backtrace(outchan,caml_get_exception_raw_backtra(0))}
    function raw_backtrace_to_string(raw_backtrace)
     {var backtrace=convert_raw_backtrace(raw_backtrace);
      if(backtrace)
       {var a=backtrace[1],b=create$2(1024),_px_=a.length - 1 - 1 | 0,_pw_=0;
        if(! (_px_ < 0))
         {var i=_pw_;
          for(;;)
           {var match=format_backtrace_slot(i,caml_check_bound(a,i)[1 + i]);
            if(match){var str=match[1];caml_call1(bprintf(b,_bE_),str)}
            var _py_=i + 1 | 0;
            if(_px_ !== i){var i=_py_;continue}
            break}}
        return contents(b)}
      return cst_Program_not_linked_with_g_}
    function backtrace_slot_is_raise(param)
     {return 0 === param[0]?param[1]:param[1]}
    function backtrace_slot_is_inline(param){return 0 === param[0]?param[6]:0}
    function backtrace_slot_location(param)
     {return 0 === param[0]?[0,[0,param[2],param[3],param[4],param[5]]]:0}
    function backtrace_slot_defname(param)
     {if(0 === param[0] && caml_string_notequal(param[7],cst$65))
       return [0,param[7]];
      return 0}
    function backtrace_slots(raw_backtrace)
     {var match=convert_raw_backtrace(raw_backtrace);
      if(match)
       {var backtrace=match[1],i$1=backtrace.length - 1 - 1 | 0,i=i$1;
        for(;;)
         {if(-1 === i)
           var _pv_=0;
          else
           {var
             param=caml_check_bound(backtrace,i)[1 + i],
             _pu_=0 === param[0]?1:0;
            if(! _pu_){var i$0=i - 1 | 0,i=i$0;continue}
            var _pv_=_pu_}
          return _pv_?[0,backtrace]:0}}
      return 0}
    function backtrace_slots_of_raw_entry(entry)
     {return backtrace_slots([0,entry])}
    function raw_backtrace_length(bt){return bt.length - 1}
    function get_backtrace(param)
     {return raw_backtrace_to_string(caml_get_exception_raw_backtra(0))}
    function register_printer(fn)
     {for(;;)
       {var
         old_printers=printers[1],
         new_printers=[0,fn,old_printers],
         success=compare_and_set(printers,old_printers,new_printers),
         _pt_=1 - success;
        if(_pt_)continue;
        return _pt_}}
    function exn_slot(x){return 0 === caml_obj_tag(x)?x[1]:x}
    function exn_slot_id(x){var slot=exn_slot(x);return slot[2]}
    function exn_slot_name(x){var slot=exn_slot(x);return slot[1]}
    var errors=_bF_.slice();
    function default_uncaught_exception_han(exn,raw_backtrace)
     {var _pr_=to_string$6(exn);
      caml_call1(eprintf(_bG_),_pr_);
      print_raw_backtrace(stderr,raw_backtrace);
      var status=runtime.caml_ml_debug_info_status(0);
      if(status < 0)
       {var _ps_=abs(status);
        prerr_endline(caml_check_bound(errors,_ps_)[1 + _ps_])}
      return caml_ml_flush(stderr)}
    var uncaught_exception_handler=[0,default_uncaught_exception_han];
    function set_uncaught_exception_handler(fn)
     {uncaught_exception_handler[1] = fn;return 0}
    var empty_backtrace=[0];
    function handle_uncaught_exception(exn,debugger_in_use)
     {try
       {try
         {var
           raw_backtrace=
            debugger_in_use?empty_backtrace:caml_get_exception_raw_backtra(0);
          try {do_at_exit(0)}catch(_pq_){}
          try
           {var
             _pm_=caml_call2(uncaught_exception_handler[1],exn,raw_backtrace),
             _pl_=_pm_}
          catch(exn$0)
           {exn$0 = caml_wrap_exception(exn$0);
            var
             raw_backtrace$0=caml_get_exception_raw_backtra(0),
             _pj_=to_string$6(exn);
            caml_call1(eprintf(_bH_),_pj_);
            print_raw_backtrace(stderr,raw_backtrace);
            var _pk_=to_string$6(exn$0);
            caml_call1(eprintf(_bI_),_pk_);
            print_raw_backtrace(stderr,raw_backtrace$0);
            var _pl_=caml_ml_flush(stderr)}
          var _pn_=_pl_}
        catch(_pp_)
         {_pp_ = caml_wrap_exception(_pp_);
          if(_pp_ !== Out_of_memory)throw _pp_;
          var _pn_=prerr_endline(cst_Fatal_error_out_of_memory_)}
        return _pn_}
      catch(_po_){return 0}}
    caml_register_named_value
     (caml_string_of_jsbytes("Printexc.handle_uncaught_exception"),
      handle_uncaught_exception);
    function _bJ_(_pi_){return runtime.caml_raw_backtrace_next_slot(_pi_)}
    function _bK_(_ph_){return runtime.caml_convert_raw_backtrace_slot(_ph_)}
    function _bL_(_pg_,_pf_)
     {return runtime.caml_raw_backtrace_slot(_pg_,_pf_)}
    var
     _bM_=
      [0,
       backtrace_slot_is_raise,
       backtrace_slot_is_inline,
       backtrace_slot_location,
       backtrace_slot_defname,
       format_backtrace_slot];
    function _bN_(_pe_){return caml_get_exception_raw_backtra(_pe_)}
    function _bO_(_pd_){return runtime.caml_backtrace_status(_pd_)}
    var
     Stdlib_Printexc=
      [0,
       to_string$6,
       to_string_default,
       print,
       catch$0,
       print_backtrace,
       get_backtrace,
       function(_pc_){return runtime.caml_record_backtrace(_pc_)},
       _bO_,
       register_printer,
       use_printers,
       raw_backtrace_entries,
       _bN_,
       print_raw_backtrace,
       raw_backtrace_to_string,
       default_uncaught_exception_han,
       set_uncaught_exception_handler,
       backtrace_slots,
       backtrace_slots_of_raw_entry,
       _bM_,
       raw_backtrace_length,
       _bL_,
       _bK_,
       _bJ_,
       exn_slot_id,
       exn_slot_name];
    caml_register_global(811,Stdlib_Printexc,"Stdlib__Printexc");
    function const$0(c,param){return c}
    function flip(f,x,y){return caml_call2(f,y,x)}
    function negate(p,v){return 1 - caml_call1(p,v)}
    var
     Finally_raised=
      [248,cst_Stdlib_Fun_Finally_raised,caml_fresh_oo_id(0)];
    register_printer
     (function(param)
       {if(param[1] === Finally_raised)
         {var exn=param[2];
          return [0,cat(cst_Fun_Finally_raised,to_string$6(exn))]}
        return 0});
    function protect(finally$0,work)
     {function finally_no_exn(param)
       {try
         {var _pb_=caml_call1(finally$0,0);return _pb_}
        catch(e)
         {e = caml_wrap_exception(e);
          var bt=caml_get_exception_raw_backtra(0),exn=[0,Finally_raised,e];
          caml_restore_raw_backtrace(exn,bt);
          throw exn}}
      try
       {var result=caml_call1(work,0)}
      catch(work_exn)
       {work_exn = caml_wrap_exception(work_exn);
        var work_bt=caml_get_exception_raw_backtra(0);
        finally_no_exn(0);
        caml_restore_raw_backtrace(work_exn,work_bt);
        throw work_exn}
      finally_no_exn(0);
      return result}
    var Stdlib_Fun=[0,const$0,flip,negate,protect,Finally_raised];
    caml_register_global(812,Stdlib_Fun,"Stdlib__Fun");
    function print_stat(c)
     {var st=runtime.caml_gc_stat(0),_oV_=st[4];
      caml_call1(fprintf(c,_bP_),_oV_);
      var _oW_=st[5];
      caml_call1(fprintf(c,_bQ_),_oW_);
      var _oX_=st[14];
      caml_call1(fprintf(c,_bR_),_oX_);
      var _oY_=st[17];
      caml_call1(fprintf(c,_bS_),_oY_);
      fprintf(c,_bT_);
      var
       _oZ_=st[1],
       l1=caml_ml_string_length(caml_call1(sprintf(_bU_),_oZ_)),
       _o0_=st[1];
      caml_call2(fprintf(c,_bV_),l1,_o0_);
      var _o1_=st[2];
      caml_call2(fprintf(c,_bW_),l1,_o1_);
      var _o2_=st[3];
      caml_call2(fprintf(c,_bX_),l1,_o2_);
      fprintf(c,_bY_);
      var
       _o3_=st[15],
       l2=caml_ml_string_length(caml_call1(sprintf(_bZ_),_o3_)),
       _o4_=st[15];
      caml_call2(fprintf(c,_b0_),l2,_o4_);
      var _o5_=st[6];
      caml_call2(fprintf(c,_b1_),l2,_o5_);
      var _o6_=st[8];
      caml_call2(fprintf(c,_b2_),l2,_o6_);
      var _o7_=st[10];
      caml_call2(fprintf(c,_b3_),l2,_o7_);
      var _o8_=st[12];
      caml_call2(fprintf(c,_b4_),l2,_o8_);
      var _o9_=st[13];
      caml_call2(fprintf(c,_b5_),l2,_o9_);
      fprintf(c,_b6_);
      var _o__=st[9];
      caml_call1(fprintf(c,_b7_),_o__);
      var _o$_=st[11];
      caml_call1(fprintf(c,_b8_),_o$_);
      var _pa_=st[7];
      return caml_call1(fprintf(c,_b9_),_pa_)}
    function allocated_bytes(param)
     {var
       match=runtime.caml_gc_counters(0),
       ma=match[3],
       pro=match[2],
       mi=match[1];
      return (mi + ma - pro) * 4}
    function create_alarm(f){return [0,1]}
    function delete_alarm(a){a[1] = 0;return 0}
    function _b__(param){return 0}
    function _b$_(param){return 0}
    function _ca_(param){return 0}
    function _cb_(param){return 0}
    var null_tracker=[0,function(param){return 0},_cb_,_ca_,_b$_,_b__];
    function start(sampling_rate,opt,tracker)
     {if(opt)
       var sth=opt[1],callstack_size=sth;
      else
       var callstack_size=max_int;
      return runtime.caml_memprof_start(sampling_rate,callstack_size,tracker)}
    var _cc_=[0,null_tracker,start,runtime.caml_memprof_stop];
    function _cd_(_oU_){return runtime.caml_final_release(_oU_)}
    function _ce_(_oT_,_oS_)
     {return runtime.caml_final_register_called_without_value(_oT_,_oS_)}
    var
     Stdlib_Gc=
      [0,
       print_stat,
       allocated_bytes,
       function(_oR_,_oQ_){return runtime.caml_final_register(_oR_,_oQ_)},
       _ce_,
       _cd_,
       create_alarm,
       delete_alarm,
       _cc_];
    caml_register_global(813,Stdlib_Gc,"Stdlib__Gc");
    function string(str)
     {return caml_md5_string(str,0,caml_ml_string_length(str))}
    function bytes(b){return string(caml_string_of_bytes(b))}
    function substring(str,ofs,len)
     {if
       (0
        <=
        ofs
        &&
        0
        <=
        len
        &&
        !
        ((caml_ml_string_length(str) - len | 0) < ofs))
       return caml_md5_string(str,ofs,len);
      return invalid_arg(cst_Digest_substring)}
    function subbytes(b,ofs,len)
     {return substring(caml_string_of_bytes(b),ofs,len)}
    function file(filename)
     {var ic=open_bin$0(filename);
      try
       {var d=runtime.caml_md5_chan(ic,-1)}
      catch(e){e = caml_wrap_exception(e);caml_ml_close_channel(ic);throw e}
      caml_ml_close_channel(ic);
      return d}
    function output$0(chan,digest){return output_string(chan,digest)}
    function input$0(chan){return really_input_string(chan,16)}
    function char_hex(n){var _oP_=10 <= n?87:48;return n + _oP_ | 0}
    function to_hex(d)
     {if(16 !== caml_ml_string_length(d))invalid_arg(cst_Digest_to_hex);
      var result=caml_create_bytes(32),i=0;
      for(;;)
       {var x=caml_string_get(d,i);
        caml_bytes_unsafe_set(result,i * 2 | 0,char_hex(x >>> 4 | 0));
        caml_bytes_unsafe_set(result,(i * 2 | 0) + 1 | 0,char_hex(x & 15));
        var _oO_=i + 1 | 0;
        if(15 !== i){var i=_oO_;continue}
        return caml_string_of_bytes(result)}}
    function from_hex(s)
     {if(32 !== caml_ml_string_length(s))invalid_arg(cst_Digest_from_hex);
      function digit(c)
       {if(65 <= c)
         {if(97 <= c)
           {if(! (103 <= c))return (c - 97 | 0) + 10 | 0}
          else
           if(! (71 <= c))return (c - 65 | 0) + 10 | 0}
        else
         if(! (9 < c - 48 >>> 0))return c - 48 | 0;
        throw [0,Invalid_argument,cst_Digest_from_hex$0]}
      var result=caml_create_bytes(16),i=0;
      for(;;)
       {var i$0=2 * i | 0,_oM_=digit(caml_string_get(s,i$0 + 1 | 0));
        caml_bytes_set
         (result,i,chr((digit(caml_string_get(s,i$0)) << 4) + _oM_ | 0));
        var _oN_=i + 1 | 0;
        if(15 !== i){var i=_oN_;continue}
        return caml_string_of_bytes(result)}}
    var
     Stdlib_Digest=
      [0,
       compare$9,
       equal$9,
       string,
       bytes,
       substring,
       subbytes,
       file,
       output$0,
       input$0,
       to_hex,
       from_hex];
    caml_register_global(814,Stdlib_Digest,"Stdlib__Digest");
    function new_state(param){return [0,caml_make_vect(55,0),0]}
    function assign(st1,st2)
     {blit$1(st2[1],0,st1[1],0,55);st1[2] = st2[2];return 0}
    function full_init(s,seed)
     {var seed$0=0 === seed.length - 1?[0,0]:seed,l=seed$0.length - 1,i$0=0;
      for(;;)
       {caml_check_bound(s[1],i$0)[1 + i$0] = i$0;
        var _oL_=i$0 + 1 | 0;
        if(54 !== i$0){var i$0=_oL_;continue}
        var accu=[0,cst_x$1],_oH_=54 + max$1(55,l) | 0,_oG_=0;
        if(! (_oH_ < 0))
         {var i=_oG_;
          for(;;)
           {var
             j=i % 55 | 0,
             k=caml_mod(i,l),
             x=caml_check_bound(seed$0,k)[1 + k];
            accu[1] = string(cat(accu[1],caml_string_of_jsbytes("" + x)));
            var
             _oI_=accu[1],
             _oC_=caml_string_get(_oI_,3) << 24,
             _oD_=caml_string_get(_oI_,2) << 16,
             _oE_=caml_string_get(_oI_,1) << 8,
             _oF_=((caml_string_get(_oI_,0) + _oE_ | 0) + _oD_ | 0) + _oC_ | 0,
             _oJ_=(caml_check_bound(s[1],j)[1 + j] ^ _oF_) & 1073741823;
            caml_check_bound(s[1],j)[1 + j] = _oJ_;
            var _oK_=i + 1 | 0;
            if(_oH_ !== i){var i=_oK_;continue}
            break}}
        s[2] = 0;
        return 0}}
    function make$3(seed)
     {var result=new_state(0);full_init(result,seed);return result}
    function make_self_init(param){return make$3(caml_sys_random_seed(0))}
    function copy$5(s){var result=new_state(0);assign(result,s);return result}
    function bits(s)
     {s[2] = (s[2] + 1 | 0) % 55 | 0;
      var
       _oz_=s[2],
       curval=caml_check_bound(s[1],_oz_)[1 + _oz_],
       _oA_=(s[2] + 24 | 0) % 55 | 0,
       newval=
        caml_check_bound(s[1],_oA_)[1 + _oA_]
        +
        (curval ^ (curval >>> 25 | 0) & 31)
        |
        0,
       newval30=newval & 1073741823,
       _oB_=s[2];
      caml_check_bound(s[1],_oB_)[1 + _oB_] = newval30;
      return newval30}
    function intaux(s,n)
     {for(;;)
       {var r=bits(s),v=caml_mod(r,n);
        if(((1073741823 - n | 0) + 1 | 0) < (r - v | 0))continue;
        return v}}
    function int$0(s,bound)
     {if(! (1073741823 < bound) && 0 < bound)return intaux(s,bound);
      return invalid_arg(cst_Random_int)}
    function full_int(s,bound)
     {if(0 < bound)
       {if(1073741823 < bound)
         for(;;)
          {var b1=bits(s),b2=bits(s);
           if(bound <= 2147483647)
            var bpos=(b2 & 1073725440) << 1 | b1 >>> 15 | 0,r=bpos;
           else
            var
             b3=bits(s),
             bpos$0=
              ((b3 & 1073741312) << 12 | b2 >>> 9 | 0)
              <<
              20
              |
              b1
              >>>
              10
              |
              0,
             r=bpos$0;
           var v=caml_mod(r,bound);
           if(((2147483647 - bound | 0) + 1 | 0) < (r - v | 0))continue;
           return v}
        return intaux(s,bound)}
      return invalid_arg(cst_Random_full_int)}
    function int32(s,bound)
     {if(caml_lessequal(bound,0))return invalid_arg(cst_Random_int32);
      for(;;)
       {var b1=bits(s),b2=(bits(s) & 1) << 30,r=b1 | b2,v=caml_mod(r,bound);
        if(caml_greaterthan(r - v | 0,(2147483647 - bound | 0) + 1 | 0))
         continue;
        return v}}
    function int64(s,bound)
     {if(caml_lessequal(bound,_cg_))return invalid_arg(cst_Random_int64);
      for(;;)
       {var
         b1=caml_int64_of_int32(bits(s)),
         b2=caml_int64_shift_left(caml_int64_of_int32(bits(s)),30),
         b3=caml_int64_shift_left(caml_int64_of_int32(bits(s) & 7),60),
         r=caml_int64_or(b1,caml_int64_or(b2,b3)),
         v=runtime.caml_int64_mod(r,bound);
        if
         (caml_greaterthan
           (caml_int64_sub(r,v),
            caml_int64_add(caml_int64_sub(max_int$2,bound),_cf_)))
         continue;
        return v}}
    function nativeint(s,bound){return int32(s,bound)}
    function float$0(s,bound)
     {var r1=bits(s),r2=bits(s);
      return (r1 / 1073741824. + r2) / 1073741824. * bound}
    function bool(s){return 0 === (bits(s) & 1)?1:0}
    function bits32(s)
     {var b1=bits(s) >>> 14 | 0,b2=bits(s) >>> 14 | 0;return b1 | b2 << 16}
    function bits64(s)
     {var
       b1=caml_int64_shift_right_unsigne(caml_int64_of_int32(bits(s)),9),
       b2=caml_int64_shift_right_unsigne(caml_int64_of_int32(bits(s)),9),
       b3=caml_int64_shift_right_unsigne(caml_int64_of_int32(bits(s)),8);
      return caml_int64_or
              (b1,
               caml_int64_or
                (caml_int64_shift_left(b2,21),caml_int64_shift_left(b3,42)))}
    function nativebits(s){return bits32(s)}
    var default$0=[0,_ch_.slice(),0];
    function bits$0(param){return bits(default$0)}
    function int$1(bound){return int$0(default$0,bound)}
    function full_int$0(bound){return full_int(default$0,bound)}
    function int32$0(bound){return int32(default$0,bound)}
    function nativeint$0(bound){return nativeint(default$0,bound)}
    function int64$0(bound){return int64(default$0,bound)}
    function float$1(scale){return float$0(default$0,scale)}
    function bool$0(param){return bool(default$0)}
    function bits32$0(param){return bits32(default$0)}
    function bits64$0(param){return bits64(default$0)}
    function nativebits$0(param){return nativebits(default$0)}
    function full_init$0(seed){return full_init(default$0,seed)}
    function init$5(seed){return full_init(default$0,[0,seed])}
    function self_init(param){return full_init$0(caml_sys_random_seed(0))}
    function get_state(param){return copy$5(default$0)}
    function set_state(s){return assign(default$0,s)}
    var
     _ci_=
      [0,
       make$3,
       make_self_init,
       copy$5,
       bits,
       int$0,
       full_int,
       int32,
       nativeint,
       int64,
       float$0,
       bool,
       bits32,
       bits64,
       nativebits],
     Stdlib_Random=
      [0,
       init$5,
       full_init$0,
       self_init,
       bits$0,
       int$1,
       full_int$0,
       int32$0,
       nativeint$0,
       int64$0,
       float$1,
       bool$0,
       bits32$0,
       bits64$0,
       nativebits$0,
       _ci_,
       get_state,
       set_state];
    caml_register_global(815,Stdlib_Random,"Stdlib__Random");
    function ongoing_traversal(h)
     {var _ox_=h.length - 1 < 4?1:0,_oy_=_ox_ || (h[4] < 0?1:0);return _oy_}
    function flip_ongoing_traversal(h){h[4] = - h[4] | 0;return 0}
    try
     {var _c5_=caml_sys_getenv(cst_OCAMLRUNPARAM),params=_c5_}
    catch(_ov_)
     {_ov_ = caml_wrap_exception(_ov_);
      if(_ov_ !== Not_found)throw _ov_;
      try
       {var _c4_=caml_sys_getenv(cst_CAMLRUNPARAM),_cj_=_c4_}
      catch(_ow_)
       {_ow_ = caml_wrap_exception(_ow_);
        if(_ow_ !== Not_found)throw _ow_;
        var _cj_=cst$66}
      var params=_cj_}
    var
     randomized_default=contains$0(params,82),
     randomized=[0,randomized_default];
    function randomize(param){randomized[1] = 1;return 0}
    function is_randomized(param){return randomized[1]}
    var prng=[246,function(_ou_){return caml_call1(_ci_[2],0)}];
    function power_2_above(x,n)
     {var x$0=x;
      for(;;)
       {if(n <= x$0)return x$0;
        if(max_array_length < (x$0 * 2 | 0))return x$0;
        var x$1=x$0 * 2 | 0,x$0=x$1;
        continue}}
    function create$3(opt,initial_size)
     {if(opt)var sth=opt[1],random=sth;else var random=randomized[1];
      var s=power_2_above(16,initial_size);
      if(random)
       var
        _os_=caml_obj_tag(prng),
        _ot_=250 === _os_?prng[1]:246 === _os_?force_lazy_block(prng):prng,
        seed=caml_call1(_ci_[4],_ot_);
      else
       var seed=0;
      return [0,0,caml_make_vect(s,0),seed,s]}
    function clear$2(h)
     {var _or_=0 < h[1]?1:0;
      return _or_?(h[1] = 0,fill$0(h[2],0,h[2].length - 1,0)):_or_}
    function reset$0(h)
     {var len=h[2].length - 1;
      if(4 <= h.length - 1 && len !== abs(h[4]))
       {h[1] = 0;h[2] = caml_make_vect(abs(h[4]),0);return 0}
      return clear$2(h)}
    function copy_bucketlist(param)
     {if(param)
       {var
         key=param[1],
         data=param[2],
         next=param[3],
         prec$0=[0,key,data,next],
         prec=prec$0,
         param$0=next;
        for(;;)
         {if(param$0)
           {var
             key$0=param$0[1],
             data$0=param$0[2],
             next$0=param$0[3],
             r=[0,key$0,data$0,next$0];
            prec[3] = r;
            var prec=r,param$0=next$0;
            continue}
          return prec$0}}
      return 0}
    function copy$6(init)
     {var _oo_=init[4],_op_=init[3],_oq_=map$7(copy_bucketlist,init[2]);
      return [0,init[1],_oq_,_op_,_oo_]}
    function length$5(h){return h[1]}
    function insert_all_buckets(indexfun,inplace,odata,ndata)
     {var
       nsize=ndata.length - 1,
       ndata_tail=caml_make_vect(nsize,0),
       _oi_=odata.length - 1 - 1 | 0,
       _oh_=0;
      if(! (_oi_ < 0))
       {var i$0=_oh_;
        a:
        for(;;)
         {var cell$1=caml_check_bound(odata,i$0)[1 + i$0],cell=cell$1;
          for(;;)
           {if(cell)
             {var
               key=cell[1],
               data=cell[2],
               next=cell[3],
               cell$0=inplace?cell:[0,key,data,0],
               nidx=caml_call1(indexfun,key),
               match=caml_check_bound(ndata_tail,nidx)[1 + nidx];
              if(match)
               match[3] = cell$0;
              else
               caml_check_bound(ndata,nidx)[1 + nidx] = cell$0;
              caml_check_bound(ndata_tail,nidx)[1 + nidx] = cell$0;
              var cell=next;
              continue}
            var _on_=i$0 + 1 | 0;
            if(_oi_ !== i$0){var i$0=_on_;continue a}
            break}
          break}}
      if(inplace)
       {var _ok_=nsize - 1 | 0,_oj_=0;
        if(! (_ok_ < 0))
         {var i=_oj_;
          for(;;)
           {var match$0=caml_check_bound(ndata_tail,i)[1 + i];
            if(match$0)match$0[3] = 0;
            var _om_=i + 1 | 0;
            if(_ok_ !== i){var i=_om_;continue}
            break}}
        var _ol_=0}
      else
       var _ol_=inplace;
      return _ol_}
    function resize$0(indexfun,h)
     {var
       odata=h[2],
       osize=odata.length - 1,
       nsize=osize * 2 | 0,
       _og_=nsize < max_array_length?1:0;
      if(_og_)
       {var ndata=caml_make_vect(nsize,0),inplace=1 - ongoing_traversal(h);
        h[2] = ndata;
        return insert_all_buckets(caml_call1(indexfun,h),inplace,odata,ndata)}
      return _og_}
    function iter$10(f,h)
     {function do_bucket(param)
       {var param$0=param;
        for(;;)
         {if(param$0)
           {var key=param$0[1],data=param$0[2],next=param$0[3];
            caml_call2(f,key,data);
            var param$0=next;
            continue}
          return 0}}
      var old_trav=ongoing_traversal(h);
      if(1 - old_trav)flip_ongoing_traversal(h);
      try
       {var d=h[2],_oc_=d.length - 1 - 1 | 0,_ob_=0;
        if(! (_oc_ < 0))
         {var i=_ob_;
          for(;;)
           {do_bucket(caml_check_bound(d,i)[1 + i]);
            var _of_=i + 1 | 0;
            if(_oc_ !== i){var i=_of_;continue}
            break}}
        var _od_=1 - old_trav,_oe_=_od_?flip_ongoing_traversal(h):_od_;
        return _oe_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(old_trav)throw exn;
        flip_ongoing_traversal(h);
        throw exn}}
    function filter_map_inplace_bucket(f,h,i,prec,slot)
     {var prec$0=prec,slot$0=slot;
      for(;;)
       {if(slot$0)
         {var
           key=slot$0[1],
           data=slot$0[2],
           next=slot$0[3],
           match=caml_call2(f,key,data);
          if(match)
           {var data$0=match[1];
            if(prec$0)
             prec$0[3] = slot$0;
            else
             caml_check_bound(h[2],i)[1 + i] = slot$0;
            slot$0[2] = data$0;
            var prec$0=slot$0,slot$0=next;
            continue}
          h[1] = h[1] - 1 | 0;
          var slot$0=next;
          continue}
        return prec$0
                ?(prec$0[3] = 0,0)
                :(caml_check_bound(h[2],i)[1 + i] = 0,0)}}
    function filter_map_inplace(f,h)
     {var d=h[2],old_trav=ongoing_traversal(h);
      if(1 - old_trav)flip_ongoing_traversal(h);
      try
       {var _n9_=d.length - 1 - 1 | 0,_n8_=0;
        if(! (_n9_ < 0))
         {var i=_n8_;
          for(;;)
           {filter_map_inplace_bucket(f,h,i,0,caml_check_bound(h[2],i)[1 + i]);
            var _oa_=i + 1 | 0;
            if(_n9_ !== i){var i=_oa_;continue}
            break}}
        var _n__=1 - old_trav,_n$_=_n__?flip_ongoing_traversal(h):_n__;
        return _n$_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(old_trav)throw exn;
        flip_ongoing_traversal(h);
        throw exn}}
    function fold$4(f,h,init)
     {function do_bucket(b,accu)
       {var b$0=b,accu$0=accu;
        for(;;)
         {if(b$0)
           {var
             key=b$0[1],
             data=b$0[2],
             next=b$0[3],
             accu$1=caml_call3(f,key,data,accu$0),
             b$0=next,
             accu$0=accu$1;
            continue}
          return accu$0}}
      var old_trav=ongoing_traversal(h);
      if(1 - old_trav)flip_ongoing_traversal(h);
      try
       {var d=h[2],accu=[0,init],_n4_=d.length - 1 - 1 | 0,_n3_=0;
        if(! (_n4_ < 0))
         {var i=_n3_;
          for(;;)
           {var _n6_=accu[1];
            accu[1] = do_bucket(caml_check_bound(d,i)[1 + i],_n6_);
            var _n7_=i + 1 | 0;
            if(_n4_ !== i){var i=_n7_;continue}
            break}}
        if(1 - old_trav)flip_ongoing_traversal(h);
        var _n5_=accu[1];
        return _n5_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(old_trav)throw exn;
        flip_ongoing_traversal(h);
        throw exn}}
    function bucket_length(accu,param)
     {var accu$0=accu,param$0=param;
      for(;;)
       {if(param$0)
         {var
           param$1=param$0[3],
           accu$1=accu$0 + 1 | 0,
           accu$0=accu$1,
           param$0=param$1;
          continue}
        return accu$0}}
    function stats(h)
     {var
       _nZ_=h[2],
       _n0_=0,
       mbl=
        fold_left$3
         (function(m,b){return max$1(m,bucket_length(0,b))},_n0_,_nZ_),
       histo=caml_make_vect(mbl + 1 | 0,0),
       _n1_=h[2];
      iter$5
       (function(b)
         {var
           l=bucket_length(0,b),
           _n2_=caml_check_bound(histo,l)[1 + l] + 1 | 0;
          caml_check_bound(histo,l)[1 + l] = _n2_;
          return 0},
        _n1_);
      return [0,h[1],h[2].length - 1,mbl,histo]}
    function to_seq$9(tbl)
     {var tbl_data=tbl[2];
      function aux(i,buck,param)
       {var i$0=i,buck$0=buck;
        for(;;)
         {if(buck$0)
           {var key=buck$0[1],data=buck$0[2],next=buck$0[3];
            return [0,[0,key,data],function(_nY_){return aux(i$0,next,_nY_)}]}
          if(i$0 === tbl_data.length - 1)return 0;
          var
           buck$1=caml_check_bound(tbl_data,i$0)[1 + i$0],
           i$1=i$0 + 1 | 0,
           i$0=i$1,
           buck$0=buck$1;
          continue}}
      var _nV_=0,_nW_=0;
      return function(_nX_){return aux(_nW_,_nV_,_nX_)}}
    function to_seq_keys(m)
     {var _nR_=to_seq$9(m);
      function _nS_(_nU_){return _nU_[1]}
      return function(_nT_){return map$1(_nS_,_nR_,_nT_)}}
    function to_seq_values(m)
     {var _nN_=to_seq$9(m);
      function _nO_(_nQ_){return _nQ_[2]}
      return function(_nP_){return map$1(_nO_,_nN_,_nP_)}}
    function MakeSeeded(H)
     {function key_index(h,key)
       {var _nM_=h[2].length - 1 - 1 | 0;
        return caml_call2(H[2],h[3],key) & _nM_}
      function add(h,key,data)
       {var
         i=key_index(h,key),
         bucket=[0,key,data,caml_check_bound(h[2],i)[1 + i]];
        caml_check_bound(h[2],i)[1 + i] = bucket;
        h[1] = h[1] + 1 | 0;
        var _nL_=h[2].length - 1 << 1 < h[1]?1:0;
        return _nL_?resize$0(key_index,h):_nL_}
      function remove(h,key)
       {var
         i=key_index(h,key),
         c$0=caml_check_bound(h[2],i)[1 + i],
         prec=0,
         c=c$0;
        for(;;)
         {if(c)
           {var k=c[1],next=c[3];
            if(caml_call2(H[1],k,key))
             {h[1] = h[1] - 1 | 0;
              return prec
                      ?(prec[3] = next,0)
                      :(caml_check_bound(h[2],i)[1 + i] = next,0)}
            var prec=c,c=next;
            continue}
          return 0}}
      function find(h,key)
       {var _nK_=key_index(h,key),match=caml_check_bound(h[2],_nK_)[1 + _nK_];
        if(match)
         {var k1=match[1],d1=match[2],next1=match[3];
          if(caml_call2(H[1],key,k1))return d1;
          if(next1)
           {var k2=next1[1],d2=next1[2],next2=next1[3];
            if(caml_call2(H[1],key,k2))return d2;
            if(next2)
             {var k3=next2[1],d3=next2[2],next3=next2[3];
              if(caml_call2(H[1],key,k3))return d3;
              var param=next3;
              for(;;)
               {if(param)
                 {var k=param[1],data=param[2],next=param[3];
                  if(caml_call2(H[1],key,k))return data;
                  var param=next;
                  continue}
                throw Not_found}}
            throw Not_found}
          throw Not_found}
        throw Not_found}
      function find_opt(h,key)
       {var _nJ_=key_index(h,key),match=caml_check_bound(h[2],_nJ_)[1 + _nJ_];
        if(match)
         {var k1=match[1],d1=match[2],next1=match[3];
          if(caml_call2(H[1],key,k1))return [0,d1];
          if(next1)
           {var k2=next1[1],d2=next1[2],next2=next1[3];
            if(caml_call2(H[1],key,k2))return [0,d2];
            if(next2)
             {var k3=next2[1],d3=next2[2],next3=next2[3];
              if(caml_call2(H[1],key,k3))return [0,d3];
              var param=next3;
              for(;;)
               {if(param)
                 {var k=param[1],data=param[2],next=param[3];
                  if(caml_call2(H[1],key,k))return [0,data];
                  var param=next;
                  continue}
                return 0}}
            return 0}
          return 0}
        return 0}
      function find_all(h,key)
       {function find_in_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var k=param$0[1],d=param$0[2],next=param$0[3];
              if(caml_call2(H[1],k,key))return [0,d,find_in_bucket(next)];
              var param$0=next;
              continue}
            return 0}}
        var _nI_=key_index(h,key);
        return find_in_bucket(caml_check_bound(h[2],_nI_)[1 + _nI_])}
      function replace(h,key,data)
       {var
         i=key_index(h,key),
         param$0=caml_check_bound(h[2],i)[1 + i],
         param=param$0;
        for(;;)
         {if(param)
           {var k=param[1],next=param[3];
            if(! caml_call2(H[1],k,key)){var param=next;continue}
            param[1] = key;
            param[2] = data;
            var _nF_=0}
          else
           var _nF_=1;
          if(_nF_)
           {caml_check_bound(h[2],i)[1 + i] = [0,key,data,param$0];
            h[1] = h[1] + 1 | 0;
            var _nG_=h[2].length - 1 << 1 < h[1]?1:0;
            if(_nG_)return resize$0(key_index,h);
            var _nH_=_nG_}
          else
           var _nH_=_nF_;
          return _nH_}}
      function mem(h,key)
       {var
         _nE_=key_index(h,key),
         param$0=caml_check_bound(h[2],_nE_)[1 + _nE_],
         param=param$0;
        for(;;)
         {if(param)
           {var k=param[1],next=param[3],_nD_=caml_call2(H[1],k,key);
            if(_nD_)return _nD_;
            var param=next;
            continue}
          return 0}}
      function add_seq(tbl,i)
       {return iter
                (function(param)
                  {var v=param[2],k=param[1];return add(tbl,k,v)},
                 i)}
      function replace_seq(tbl,i)
       {return iter
                (function(param)
                  {var v=param[2],k=param[1];return replace(tbl,k,v)},
                 i)}
      function of_seq(i){var tbl=create$3(0,16);replace_seq(tbl,i);return tbl}
      return [0,
              create$3,
              clear$2,
              reset$0,
              copy$6,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter$10,
              filter_map_inplace,
              fold$4,
              length$5,
              stats,
              to_seq$9,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq]}
    function Make$0(H)
     {var equal=H[1];
      function hash(seed,x){return caml_call1(H[2],x)}
      var
       include=MakeSeeded([0,equal,hash]),
       clear=include[2],
       reset=include[3],
       copy=include[4],
       add=include[5],
       remove=include[6],
       find=include[7],
       find_opt=include[8],
       find_all=include[9],
       replace=include[10],
       mem=include[11],
       iter=include[12],
       filter_map_inplace=include[13],
       fold=include[14],
       length=include[15],
       stats=include[16],
       to_seq=include[17],
       to_seq_keys=include[18],
       to_seq_values=include[19],
       add_seq=include[20],
       replace_seq=include[21],
       _nC_=include[1];
      function create(sz){return caml_call2(_nC_,_ck_,sz)}
      function of_seq(i)
       {var tbl=create(16);caml_call2(replace_seq,tbl,i);return tbl}
      return [0,
              create,
              clear,
              reset,
              copy,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter,
              filter_map_inplace,
              fold,
              length,
              stats,
              to_seq,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq]}
    function hash$1(x){return caml_hash(10,100,0,x)}
    function hash_param(n1,n2,x){return caml_hash(n1,n2,0,x)}
    function seeded_hash(seed,x){return caml_hash(10,100,seed,x)}
    function key_index(h,key)
     {return 4 <= h.length - 1
              ?caml_hash(10,100,h[3],key) & (h[2].length - 1 - 1 | 0)
              :invalid_arg(cst_Hashtbl_unsupported_hash_t)}
    function add$0(h,key,data)
     {var
       i=key_index(h,key),
       bucket=[0,key,data,caml_check_bound(h[2],i)[1 + i]];
      caml_check_bound(h[2],i)[1 + i] = bucket;
      h[1] = h[1] + 1 | 0;
      var _nB_=h[2].length - 1 << 1 < h[1]?1:0;
      return _nB_?resize$0(key_index,h):_nB_}
    function remove(h,key)
     {var i=key_index(h,key),c$0=caml_check_bound(h[2],i)[1 + i],prec=0,c=c$0;
      for(;;)
       {if(c)
         {var k=c[1],next=c[3];
          if(0 === caml_compare(k,key))
           {h[1] = h[1] - 1 | 0;
            return prec
                    ?(prec[3] = next,0)
                    :(caml_check_bound(h[2],i)[1 + i] = next,0)}
          var prec=c,c=next;
          continue}
        return 0}}
    function find$1(h,key)
     {var _nA_=key_index(h,key),match=caml_check_bound(h[2],_nA_)[1 + _nA_];
      if(match)
       {var k1=match[1],d1=match[2],next1=match[3];
        if(0 === caml_compare(key,k1))return d1;
        if(next1)
         {var k2=next1[1],d2=next1[2],next2=next1[3];
          if(0 === caml_compare(key,k2))return d2;
          if(next2)
           {var k3=next2[1],d3=next2[2],next3=next2[3];
            if(0 === caml_compare(key,k3))return d3;
            var param=next3;
            for(;;)
             {if(param)
               {var k=param[1],data=param[2],next=param[3];
                if(0 === caml_compare(key,k))return data;
                var param=next;
                continue}
              throw Not_found}}
          throw Not_found}
        throw Not_found}
      throw Not_found}
    function find_opt$1(h,key)
     {var _nz_=key_index(h,key),match=caml_check_bound(h[2],_nz_)[1 + _nz_];
      if(match)
       {var k1=match[1],d1=match[2],next1=match[3];
        if(0 === caml_compare(key,k1))return [0,d1];
        if(next1)
         {var k2=next1[1],d2=next1[2],next2=next1[3];
          if(0 === caml_compare(key,k2))return [0,d2];
          if(next2)
           {var k3=next2[1],d3=next2[2],next3=next2[3];
            if(0 === caml_compare(key,k3))return [0,d3];
            var param=next3;
            for(;;)
             {if(param)
               {var k=param[1],data=param[2],next=param[3];
                if(0 === caml_compare(key,k))return [0,data];
                var param=next;
                continue}
              return 0}}
          return 0}
        return 0}
      return 0}
    function find_all$0(h,key)
     {function find_in_bucket(param)
       {var param$0=param;
        for(;;)
         {if(param$0)
           {var k=param$0[1],data=param$0[2],next=param$0[3];
            if(0 === caml_compare(k,key))return [0,data,find_in_bucket(next)];
            var param$0=next;
            continue}
          return 0}}
      var _ny_=key_index(h,key);
      return find_in_bucket(caml_check_bound(h[2],_ny_)[1 + _ny_])}
    function replace(h,key,data)
     {var
       i=key_index(h,key),
       param$0=caml_check_bound(h[2],i)[1 + i],
       param=param$0;
      for(;;)
       {if(param)
         {var k=param[1],next=param[3];
          if(0 !== caml_compare(k,key)){var param=next;continue}
          param[1] = key;
          param[2] = data;
          var _nv_=0}
        else
         var _nv_=1;
        if(_nv_)
         {caml_check_bound(h[2],i)[1 + i] = [0,key,data,param$0];
          h[1] = h[1] + 1 | 0;
          var _nw_=h[2].length - 1 << 1 < h[1]?1:0;
          if(_nw_)return resize$0(key_index,h);
          var _nx_=_nw_}
        else
         var _nx_=_nv_;
        return _nx_}}
    function mem$2(h,key)
     {var
       _nu_=key_index(h,key),
       param$0=caml_check_bound(h[2],_nu_)[1 + _nu_],
       param=param$0;
      for(;;)
       {if(param)
         {var k=param[1],next=param[3],_nt_=0 === caml_compare(k,key)?1:0;
          if(_nt_)return _nt_;
          var param=next;
          continue}
        return 0}}
    function add_seq$2(tbl,i)
     {return iter
              (function(param)
                {var v=param[2],k=param[1];return add$0(tbl,k,v)},
               i)}
    function replace_seq(tbl,i)
     {return iter
              (function(param)
                {var v=param[2],k=param[1];return replace(tbl,k,v)},
               i)}
    function of_seq$7(i){var tbl=create$3(0,16);replace_seq(tbl,i);return tbl}
    function rebuild(opt,h)
     {if(opt)var sth=opt[1],random=sth;else var random=randomized[1];
      var s=power_2_above(16,h[2].length - 1);
      if(random)
       var
        _nm_=caml_obj_tag(prng),
        _nn_=250 === _nm_?prng[1]:246 === _nm_?force_lazy_block(prng):prng,
        seed=caml_call1(_ci_[4],_nn_);
      else
       var seed=4 <= h.length - 1?h[3]:0;
      var
       _no_=4 <= h.length - 1?h[4]:s,
       h$0=[0,h[1],caml_make_vect(s,0),seed,_no_],
       _np_=h$0[2],
       _nq_=h[2],
       _nr_=0;
      insert_all_buckets
       (function(_ns_){return key_index(h$0,_ns_)},_nr_,_nq_,_np_);
      return h$0}
    var
     Stdlib_Hashtbl=
      [0,
       create$3,
       clear$2,
       reset$0,
       copy$6,
       add$0,
       find$1,
       find_opt$1,
       find_all$0,
       mem$2,
       remove,
       replace,
       iter$10,
       filter_map_inplace,
       fold$4,
       length$5,
       randomize,
       is_randomized,
       rebuild,
       stats,
       to_seq$9,
       to_seq_keys,
       to_seq_values,
       add_seq$2,
       replace_seq,
       of_seq$7,
       Make$0,
       MakeSeeded,
       hash$1,
       seeded_hash,
       hash_param,
       caml_hash];
    caml_register_global(816,Stdlib_Hashtbl,"Stdlib__Hashtbl");
    function weak_create(l)
     {var _nk_=0 <= l?1:0,_nl_=_nk_?l <= _q_[15]?1:0:_nk_;
      if(1 - _nl_)invalid_arg(cst_Weak_create);
      return runtime.caml_weak_create(l)}
    function length$6(x){return x.length - 1 - 2 | 0}
    function raise_if_invalid_offset$0(e,o,msg)
     {var _nh_=0 <= o?1:0,_ni_=_nh_?o < length$6(e)?1:0:_nh_,_nj_=1 - _ni_;
      return _nj_?invalid_arg(msg):_nj_}
    function set$1(e,o,x)
     {raise_if_invalid_offset$0(e,o,cst_Weak_set);
      if(x){var x$0=x[1];return caml_ephe_set_key(e,o,x$0)}
      return caml_ephe_unset_key(e,o)}
    function get$2(e,o)
     {raise_if_invalid_offset$0(e,o,cst_Weak_get);
      return runtime.caml_weak_get(e,o)}
    function get_copy(e,o)
     {raise_if_invalid_offset$0(e,o,cst_Weak_get_copy);
      return runtime.caml_weak_get_copy(e,o)}
    function check$0(e,o)
     {raise_if_invalid_offset$0(e,o,cst_Weak_check);
      return runtime.caml_weak_check(e,o)}
    function blit$4(e1,o1,e2,o2,l)
     {if
       (0
        <=
        l
        &&
        0
        <=
        o1
        &&
        !
        ((length$6(e1) - l | 0) < o1)
        &&
        0
        <=
        o2
        &&
        !
        ((length$6(e2) - l | 0) < o2))
       {var
         _nf_=0 !== l?1:0,
         _ng_=_nf_?runtime.caml_weak_blit(e1,o1,e2,o2,l):_nf_;
        return _ng_}
      return invalid_arg(cst_Weak_blit)}
    function fill$2(ar,ofs,len,x)
     {if(0 <= ofs && 0 <= len && ! ((length$6(ar) - len | 0) < ofs))
       {var _nd_=(ofs + len | 0) - 1 | 0;
        if(! (_nd_ < ofs))
         {var i=ofs;
          for(;;)
           {set$1(ar,i,x);
            var _ne_=i + 1 | 0;
            if(_nd_ !== i){var i=_ne_;continue}
            break}}
        return 0}
      throw [0,Invalid_argument,cst_Weak_fill]}
    function Make$1(H)
     {var emptybucket=weak_create(0);
      function get_index(t,h){return caml_mod(h & 2147483647,t[1].length - 1)}
      var limit=7;
      function create(sz)
       {var
         sz$0=7 <= sz?sz:7,
         sz$1=max_array_length < sz$0?max_array_length:sz$0;
        return [0,
                caml_make_vect(sz$1,emptybucket),
                caml_make_vect(sz$1,[0]),
                limit,
                0,
                0]}
      function clear(t)
       {var _nb_=t[1].length - 1 - 1 | 0,_na_=0;
        if(! (_nb_ < 0))
         {var i=_na_;
          for(;;)
           {caml_check_bound(t[1],i)[1 + i] = emptybucket;
            caml_check_bound(t[2],i)[1 + i] = [0];
            var _nc_=i + 1 | 0;
            if(_nb_ !== i){var i=_nc_;continue}
            break}}
        t[3] = limit;
        t[4] = 0;
        return 0}
      function fold(f,t,init)
       {var _m$_=t[1],i=0;
        return fold_right$2
                (function(b,accu$1)
                  {var i$0=i,accu=accu$1;
                   for(;;)
                    {if(length$6(b) <= i$0)return accu;
                     var match=get$2(b,i$0);
                     if(match)
                      {var
                        v=match[1],
                        accu$0=caml_call2(f,v,accu),
                        i$1=i$0 + 1 | 0,
                        i$0=i$1,
                        accu=accu$0;
                       continue}
                     var i$2=i$0 + 1 | 0,i$0=i$2;
                     continue}},
                 _m$_,
                 init)}
      function iter(f,t)
       {var _m__=t[1],i=0;
        return iter$5
                (function(b)
                  {var i$0=i;
                   for(;;)
                    {if(length$6(b) <= i$0)return 0;
                     var match=get$2(b,i$0);
                     if(match)
                      {var v=match[1];
                       caml_call1(f,v);
                       var i$1=i$0 + 1 | 0,i$0=i$1;
                       continue}
                     var i$2=i$0 + 1 | 0,i$0=i$2;
                     continue}},
                 _m__)}
      function count_bucket(i,b,accu)
       {var i$0=i,accu$0=accu;
        for(;;)
         {if(length$6(b) <= i$0)return accu$0;
          var
           _m9_=check$0(b,i$0)?1:0,
           accu$1=accu$0 + _m9_ | 0,
           i$1=i$0 + 1 | 0,
           i$0=i$1,
           accu$0=accu$1;
          continue}}
      function count(t)
       {var _m4_=0,_m5_=t[1],_m6_=0;
        return fold_right$2
                (function(_m7_,_m8_){return count_bucket(_m6_,_m7_,_m8_)},
                 _m5_,
                 _m4_)}
      function add_aux(t,setter,d,h,index)
       {var
         bucket$0=caml_check_bound(t[1],index)[1 + index],
         hashes=caml_check_bound(t[2],index)[1 + index],
         sz=length$6(bucket$0),
         i$3=0;
        for(;;)
         {if(sz <= i$3)
           {var
             newsz=
              min$1(((3 * sz | 0) / 2 | 0) + 3 | 0,max_array_length - 2 | 0);
            if(newsz <= sz)failwith(cst_Weak_Make_hash_bucket_cann);
            var
             newbucket$0=weak_create(newsz),
             newhashes=caml_make_vect(newsz,0);
            blit$4(bucket$0,0,newbucket$0,0,sz);
            blit$1(hashes,0,newhashes,0,sz);
            caml_call3(setter,newbucket$0,sz,d);
            caml_check_bound(newhashes,sz)[1 + sz] = h;
            caml_check_bound(t[1],index)[1 + index] = newbucket$0;
            caml_check_bound(t[2],index)[1 + index] = newhashes;
            var _m0_=sz <= t[3]?1:0,_m1_=_m0_?t[3] < newsz?1:0:_m0_;
            if(_m1_)
             {t[4] = t[4] + 1 | 0;
              var i$4=0;
              for(;;)
               {var
                 _mQ_=t[5],
                 bucket=caml_check_bound(t[1],_mQ_)[1 + _mQ_],
                 _mR_=t[5],
                 hbucket=caml_check_bound(t[2],_mR_)[1 + _mR_],
                 n=length$6(bucket),
                 prev_len=(((n - 3 | 0) * 2 | 0) + 2 | 0) / 3 | 0,
                 live=count_bucket(0,bucket,0);
                if(live <= prev_len)
                 {var j$2=length$6(bucket) - 1 | 0,i$0=0,j=j$2;
                  for(;;)
                   {if(prev_len <= j)
                     {if(check$0(bucket,i$0))
                       {var i$1=i$0 + 1 | 0,i$0=i$1;continue}
                      if(check$0(bucket,j))
                       {blit$4(bucket,j,bucket,i$0,1);
                        var _mS_=caml_check_bound(hbucket,j)[1 + j];
                        caml_check_bound(hbucket,i$0)[1 + i$0] = _mS_;
                        var j$0=j - 1 | 0,i$2=i$0 + 1 | 0,i$0=i$2,j=j$0;
                        continue}
                      var j$1=j - 1 | 0,j=j$1;
                      continue}
                    if(0 === prev_len)
                     {var _mT_=t[5];
                      caml_check_bound(t[1],_mT_)[1 + _mT_] = emptybucket;
                      var _mU_=t[5];
                      caml_check_bound(t[2],_mU_)[1 + _mU_] = [0]}
                    else
                     {var newbucket=weak_create(prev_len);
                      blit$4(bucket,0,newbucket,0,prev_len);
                      var _mX_=t[5];
                      caml_check_bound(t[1],_mX_)[1 + _mX_] = newbucket;
                      var _mY_=sub$1(hbucket,0,prev_len),_mZ_=t[5];
                      caml_check_bound(t[2],_mZ_)[1 + _mZ_] = _mY_}
                    var _mV_=t[3] < n?1:0,_mW_=_mV_?prev_len <= t[3]?1:0:_mV_;
                    if(_mW_)t[4] = t[4] - 1 | 0;
                    break}}
                t[5] = caml_mod(t[5] + 1 | 0,t[1].length - 1);
                var _m3_=i$4 + 1 | 0;
                if(2 !== i$4){var i$4=_m3_;continue}
                break}}
            var _m2_=((t[1].length - 1) / 2 | 0) < t[4]?1:0;
            if(_m2_)
             {var
               n$0=t[1].length - 1,
               newlen=min$1(((3 * n$0 | 0) / 2 | 0) + 3 | 0,max_array_length);
              if(n$0 < newlen)
               {var newt=create(newlen),_mP_=t[1],i=0;
                iteri$3
                 (function(j,ob)
                   {var i$0=i;
                    for(;;)
                     {if(length$6(ob) <= i$0)return 0;
                      var match=check$0(ob,i$0);
                      if(match)
                       {var
                         oh=caml_check_bound(t[2],j)[1 + j],
                         setter$0=
                          function(i)
                           {function setter(nb,ni,param){return blit$4(ob,i,nb,ni,1)}
                            return setter},
                         setter=setter$0(i$0),
                         h=caml_check_bound(oh,i$0)[1 + i$0];
                        add_aux(newt,setter,0,h,get_index(newt,h));
                        var i$1=i$0 + 1 | 0,i$0=i$1;
                        continue}
                      var i$2=i$0 + 1 | 0,i$0=i$2;
                      continue}},
                  _mP_);
                t[1] = newt[1];
                t[2] = newt[2];
                t[3] = newt[3];
                t[4] = newt[4];
                t[5] = caml_mod(t[5],newt[1].length - 1);
                return 0}
              t[3] = max_int;
              t[4] = 0;
              return 0}
            return _m2_}
          if(check$0(bucket$0,i$3)){var i$5=i$3 + 1 | 0,i$3=i$5;continue}
          caml_call3(setter,bucket$0,i$3,d);
          caml_check_bound(hashes,i$3)[1 + i$3] = h;
          return 0}}
      function add(t,d)
       {var h=caml_call1(H[2],d);
        return add_aux(t,set$1,[0,d],h,get_index(t,h))}
      function find_or(t,d,ifnotfound)
       {var
         h=caml_call1(H[2],d),
         index=get_index(t,h),
         bucket=caml_check_bound(t[1],index)[1 + index],
         hashes=caml_check_bound(t[2],index)[1 + index],
         sz=length$6(bucket),
         i=0;
        for(;;)
         {if(sz <= i)return caml_call2(ifnotfound,h,index);
          if(h === caml_check_bound(hashes,i)[1 + i])
           {var match=get_copy(bucket,i);
            if(match)
             {var v=match[1];
              if(caml_call2(H[1],v,d))
               {var match$0=get$2(bucket,i);
                if(match$0){var v$0=match$0[1];return v$0}
                var i$0=i + 1 | 0,i=i$0;
                continue}}
            var i$1=i + 1 | 0,i=i$1;
            continue}
          var i$2=i + 1 | 0,i=i$2;
          continue}}
      function merge(t,d)
       {return find_or
                (t,
                 d,
                 function(h,index){add_aux(t,set$1,[0,d],h,index);return d})}
      function find(t,d)
       {return find_or(t,d,function(h,index){throw Not_found})}
      function find_opt(t,d)
       {var
         h=caml_call1(H[2],d),
         index=get_index(t,h),
         bucket=caml_check_bound(t[1],index)[1 + index],
         hashes=caml_check_bound(t[2],index)[1 + index],
         sz=length$6(bucket),
         i=0;
        for(;;)
         {if(sz <= i)return 0;
          if(h === caml_check_bound(hashes,i)[1 + i])
           {var match=get_copy(bucket,i);
            if(match)
             {var v=match[1];
              if(caml_call2(H[1],v,d))
               {var v$0=get$2(bucket,i);
                if(v$0)return v$0;
                var i$0=i + 1 | 0,i=i$0;
                continue}}
            var i$1=i + 1 | 0,i=i$1;
            continue}
          var i$2=i + 1 | 0,i=i$2;
          continue}}
      function find_shadow(t,d,iffound,ifnotfound)
       {var
         h=caml_call1(H[2],d),
         index=get_index(t,h),
         bucket=caml_check_bound(t[1],index)[1 + index],
         hashes=caml_check_bound(t[2],index)[1 + index],
         sz=length$6(bucket),
         i=0;
        for(;;)
         {if(sz <= i)return ifnotfound;
          if(h === caml_check_bound(hashes,i)[1 + i])
           {var match=get_copy(bucket,i);
            if(match)
             {var v=match[1];
              if(caml_call2(H[1],v,d))return caml_call2(iffound,bucket,i)}
            var i$0=i + 1 | 0,i=i$0;
            continue}
          var i$1=i + 1 | 0,i=i$1;
          continue}}
      function remove(t,d)
       {var _mO_=0;
        return find_shadow(t,d,function(w,i){return set$1(w,i,0)},_mO_)}
      function mem(t,d)
       {var _mN_=0;return find_shadow(t,d,function(w,i){return 1},_mN_)}
      function find_all(t,d)
       {var
         h=caml_call1(H[2],d),
         index=get_index(t,h),
         bucket=caml_check_bound(t[1],index)[1 + index],
         hashes=caml_check_bound(t[2],index)[1 + index],
         sz=length$6(bucket),
         i=0,
         accu=0;
        for(;;)
         {if(sz <= i)return accu;
          if(h === caml_check_bound(hashes,i)[1 + i])
           {var match=get_copy(bucket,i);
            if(match)
             {var v=match[1];
              if(caml_call2(H[1],v,d))
               {var match$0=get$2(bucket,i);
                if(match$0)
                 {var
                   v$0=match$0[1],
                   accu$0=[0,v$0,accu],
                   i$0=i + 1 | 0,
                   i=i$0,
                   accu=accu$0;
                  continue}
                var i$1=i + 1 | 0,i=i$1;
                continue}}
            var i$2=i + 1 | 0,i=i$2;
            continue}
          var i$3=i + 1 | 0,i=i$3;
          continue}}
      function stats(t)
       {var len=t[1].length - 1,lens=map$7(length$6,t[1]);
        sort(caml_int_compare,lens);
        var
         _mF_=0,
         totlen=
          fold_left$3(function(_mM_,_mL_){return _mM_ + _mL_ | 0},_mF_,lens),
         _mG_=len - 1 | 0,
         _mI_=len / 2 | 0,
         _mH_=caml_check_bound(lens,_mG_)[1 + _mG_],
         _mJ_=caml_check_bound(lens,_mI_)[1 + _mI_],
         _mK_=caml_check_bound(lens,0)[1];
        return [0,len,count(t),totlen,_mK_,_mJ_,_mH_]}
      return [0,
              create,
              clear,
              merge,
              add,
              remove,
              find,
              find_opt,
              find_all,
              mem,
              iter,
              fold,
              count,
              stats]}
    var
     Stdlib_Weak=
      [0,
       weak_create,
       length$6,
       set$1,
       get$2,
       get_copy,
       check$0,
       fill$2,
       blit$4,
       Make$1];
    caml_register_global(817,Stdlib_Weak,"Stdlib__Weak");
    function id$0(x){return x}
    var
     String_tag=[248,cst_Stdlib_Format_String_tag,caml_fresh_oo_id(0)],
     size=0,
     unknown=-1;
    function pp_enqueue(state,token)
     {state[13] = state[13] + token[3] | 0;return add(token,state[28])}
    var pp_infinity=1000000010;
    function pp_output_string(state,s)
     {return caml_call3(state[17],s,0,caml_ml_string_length(s))}
    function pp_output_newline(state){return caml_call1(state[19],0)}
    function format_pp_text(state,size,text)
     {state[9] = state[9] - size | 0;
      pp_output_string(state,text);
      state[11] = 0;
      return 0}
    function format_string(state,s)
     {var _mE_=caml_string_notequal(s,cst$67);
      return _mE_?format_pp_text(state,caml_ml_string_length(s),s):_mE_}
    function break_new_line(state,param,width)
     {var after=param[3],offset=param[2],before=param[1];
      format_string(state,before);
      pp_output_newline(state);
      state[11] = 1;
      var
       indent=(state[6] - width | 0) + offset | 0,
       real_indent=min$1(state[8],indent);
      state[10] = real_indent;
      state[9] = state[6] - state[10] | 0;
      caml_call1(state[21],state[10]);
      return format_string(state,after)}
    function break_line(state,width){return break_new_line(state,_cl_,width)}
    function break_same_line(state,param)
     {var after=param[3],width=param[2],before=param[1];
      format_string(state,before);
      state[9] = state[9] - width | 0;
      caml_call1(state[20],width);
      return format_string(state,after)}
    function format_pp_token(state,size$0,param)
     {if(typeof param === "number")
       switch(param)
        {case 0:
          var match$3=top_opt(state[3]);
          if(match$3)
           {var
             match$4=match$3[1],
             tabs=match$4[1],
             add_tab=
              function(n,ls)
               {if(ls)
                 {var l=ls[2],x=ls[1];
                  return caml_lessthan(n,x)?[0,n,ls]:[0,x,add_tab(n,l)]}
                return [0,n,0]};
            tabs[1] = add_tab(state[6] - state[9] | 0,tabs[1]);
            return 0}
          return 0;
         case 1:pop_opt(state[2]);return 0;
         case 2:pop_opt(state[3]);return 0;
         case 3:
          var match$5=top_opt(state[2]);
          if(match$5)
           {var match$6=match$5[1],width$0=match$6[2];
            return break_line(state,width$0)}
          return pp_output_newline(state);
         case 4:
          var _mB_=state[10] !== (state[6] - state[9] | 0)?1:0;
          if(_mB_)
           {var match$1=take_opt(state[28]);
            if(match$1)
             {var match$2=match$1[1],size=match$2[1],length=match$2[3];
              state[12] = state[12] - length | 0;
              state[9] = state[9] + size | 0;
              return 0}
            return 0}
          return _mB_;
         default:
          var match$7=pop_opt(state[5]);
          if(match$7)
           {var tag_name=match$7[1],marker=caml_call1(state[25],tag_name);
            return pp_output_string(state,marker)}
          return 0}
      else
       switch(param[0])
        {case 0:var s=param[1];return format_pp_text(state,size$0,s);
         case 1:
          var
           breaks=param[2],
           fits=param[1],
           off=breaks[2],
           before=breaks[1],
           match$8=top_opt(state[2]);
          if(match$8)
           {var match$9=match$8[1],width$1=match$9[2],box_type$0=match$9[1];
            switch(box_type$0)
             {case 0:return break_same_line(state,fits);
              case 1:return break_new_line(state,breaks,width$1);
              case 2:return break_new_line(state,breaks,width$1);
              case 3:
               return state[9] < (size$0 + caml_ml_string_length(before) | 0)
                       ?break_new_line(state,breaks,width$1)
                       :break_same_line(state,fits);
              case 4:
               return state[11]
                       ?break_same_line(state,fits)
                       :state[9] < (size$0 + caml_ml_string_length(before) | 0)
                         ?break_new_line(state,breaks,width$1)
                         :((state[6] - width$1 | 0) + off | 0) < state[10]
                           ?break_new_line(state,breaks,width$1)
                           :break_same_line(state,fits);
              default:return break_same_line(state,fits)}}
          return 0;
         case 2:
          var
           off$0=param[2],
           n=param[1],
           insertion_point=state[6] - state[9] | 0,
           match$10=top_opt(state[3]);
          if(match$10)
           {var match$11=match$10[1],tabs$0=match$11[1],_mC_=tabs$0[1];
            if(_mC_)
             {var first=_mC_[1],param$0=tabs$0[1];
              for(;;)
               {if(param$0)
                 {var tail=param$0[2],head=param$0[1];
                  if(! (insertion_point <= head)){var param$0=tail;continue}
                  var _mD_=head}
                else
                 var _mD_=first;
                var tab=_mD_;
                break}}
            else
             var tab=insertion_point;
            var offset=tab - insertion_point | 0;
            return 0 <= offset
                    ?break_same_line(state,[0,cst$69,offset + n | 0,cst$68])
                    :break_new_line
                      (state,[0,cst$71,tab + off$0 | 0,cst$70],state[6])}
          return 0;
         case 3:
          var
           ty=param[2],
           off$1=param[1],
           insertion_point$0=state[6] - state[9] | 0;
          if(state[8] < insertion_point$0)
           {var match=top_opt(state[2]);
            if(match)
             {var match$0=match[1],width=match$0[2],box_type=match$0[1];
              if(state[9] < width && ! (3 < box_type - 1 >>> 0))
               break_line(state,width)}
            else
             pp_output_newline(state)}
          var
           width$2=state[9] - off$1 | 0,
           box_type$1=1 === ty?1:state[9] < size$0?ty:5;
          return push([0,box_type$1,width$2],state[2]);
         case 4:var tbox=param[1];return push(tbox,state[3]);
         default:
          var tag_name$0=param[1],marker$0=caml_call1(state[24],tag_name$0);
          pp_output_string(state,marker$0);
          return push(tag_name$0,state[5])}}
    function advance_left(state)
     {for(;;)
       {var match=peek_opt(state[28]);
        if(match)
         {var
           match$0=match[1],
           size=match$0[1],
           length=match$0[3],
           token=match$0[2],
           pending_count=state[13] - state[12] | 0,
           _mz_=0 <= size?1:0,
           _mA_=_mz_ || (state[9] <= pending_count?1:0);
          if(_mA_)
           {take$0(state[28]);
            var size$0=0 <= size?size:pp_infinity;
            format_pp_token(state,size$0,token);
            state[12] = length + state[12] | 0;
            continue}
          return _mA_}
        return 0}}
    function enqueue_advance(state,tok)
     {pp_enqueue(state,tok);return advance_left(state)}
    function enqueue_string_as(state,size,s)
     {return enqueue_advance(state,[0,size,[0,s],size])}
    function initialize_scan_stack(stack)
     {clear(stack);
      var queue_elem=[0,unknown,_cm_,0];
      return push([0,-1,queue_elem],stack)}
    function set_size(state,ty)
     {var match=top_opt(state[1]);
      if(match)
       {var
         match$0=match[1],
         queue_elem=match$0[2],
         left_total=match$0[1],
         _mu_=queue_elem[1];
        if(left_total < state[12])return initialize_scan_stack(state[1]);
        var _mv_=queue_elem[2];
        if(typeof _mv_ !== "number")
         switch(_mv_[0])
          {case 3:
            var
             _mx_=1 - ty,
             _my_=
              _mx_
               ?(queue_elem[1] = state[13] + _mu_ | 0,pop_opt(state[1]),0)
               :_mx_;
            return _my_;
           case 1:
           case 2:
            var
             _mw_=
              ty?(queue_elem[1] = state[13] + _mu_ | 0,pop_opt(state[1]),0):ty;
            return _mw_
           }
        return 0}
      return 0}
    function scan_push(state,b,token)
     {pp_enqueue(state,token);
      if(b)set_size(state,1);
      var elem=[0,state[13],token];
      return push(elem,state[1])}
    function pp_open_box_gen(state,indent,br_ty)
     {state[14] = state[14] + 1 | 0;
      if(state[14] < state[15])
       {var size=- state[13] | 0,elem=[0,size,[3,indent,br_ty],0];
        return scan_push(state,0,elem)}
      var _ms_=state[14] === state[15]?1:0;
      if(_ms_)
       {var _mt_=state[16];
        return enqueue_string_as(state,caml_ml_string_length(_mt_),_mt_)}
      return _ms_}
    function pp_close_box(state,param)
     {var _mq_=1 < state[14]?1:0;
      if(_mq_)
       {if(state[14] < state[15])
         {pp_enqueue(state,[0,size,1,0]);set_size(state,1);set_size(state,0)}
        state[14] = state[14] - 1 | 0;
        var _mr_=0}
      else
       var _mr_=_mq_;
      return _mr_}
    function pp_open_stag(state,tag_name)
     {if(state[22]){push(tag_name,state[4]);caml_call1(state[26],tag_name)}
      var _mp_=state[23];
      if(_mp_)
       {var token=[5,tag_name];return pp_enqueue(state,[0,size,token,0])}
      return _mp_}
    function pp_close_stag(state,param)
     {if(state[23])pp_enqueue(state,[0,size,5,0]);
      var _mn_=state[22];
      if(_mn_)
       {var match=pop_opt(state[4]);
        if(match){var tag_name=match[1];return caml_call1(state[27],tag_name)}
        var _mo_=0}
      else
       var _mo_=_mn_;
      return _mo_}
    function pp_open_tag(state,s){return pp_open_stag(state,[0,String_tag,s])}
    function pp_close_tag(state,param){return pp_close_stag(state,0)}
    function pp_set_print_tags(state,b){state[22] = b;return 0}
    function pp_set_mark_tags(state,b){state[23] = b;return 0}
    function pp_get_print_tags(state,param){return state[22]}
    function pp_get_mark_tags(state,param){return state[23]}
    function pp_set_tags(state,b)
     {pp_set_print_tags(state,b);return pp_set_mark_tags(state,b)}
    function pp_get_formatter_stag_function(state,param)
     {return [0,state[24],state[25],state[26],state[27]]}
    function pp_set_formatter_stag_function(state,param)
     {var pct=param[4],pot=param[3],mct=param[2],mot=param[1];
      state[24] = mot;
      state[25] = mct;
      state[26] = pot;
      state[27] = pct;
      return 0}
    function pp_rinit(state)
     {state[12] = 1;
      state[13] = 1;
      clear$0(state[28]);
      initialize_scan_stack(state[1]);
      clear(state[2]);
      clear(state[3]);
      clear(state[4]);
      clear(state[5]);
      state[10] = 0;
      state[14] = 0;
      state[9] = state[6];
      return pp_open_box_gen(state,0,3)}
    function pp_flush_queue(state,b)
     {var _mm_=state[4];
      iter$7(function(param){return pp_close_tag(state,0)},_mm_);
      for(;;)
       {if(1 < state[14]){pp_close_box(state,0);continue}
        state[13] = pp_infinity;
        advance_left(state);
        if(b)pp_output_newline(state);
        return pp_rinit(state)}}
    function pp_print_as_size(state,size,s)
     {var _ml_=state[14] < state[15]?1:0;
      return _ml_?enqueue_string_as(state,size,s):_ml_}
    function pp_print_as(state,isize,s)
     {return pp_print_as_size(state,isize,s)}
    function pp_print_string(state,s)
     {return pp_print_as(state,caml_ml_string_length(s),s)}
    function pp_print_bytes(state,s)
     {return pp_print_as(state,caml_ml_bytes_length(s),of_bytes(s))}
    function pp_print_int(state,i)
     {return pp_print_string(state,caml_string_of_jsbytes("" + i))}
    function pp_print_float(state,f)
     {return pp_print_string(state,to_string(f))}
    function pp_print_bool(state,b)
     {return pp_print_string(state,string_of_bool(b))}
    function pp_print_char(state,c){return pp_print_as(state,1,make$1(1,c))}
    function pp_open_hbox(state,param){return pp_open_box_gen(state,0,0)}
    function pp_open_vbox(state,indent)
     {return pp_open_box_gen(state,indent,1)}
    function pp_open_hvbox(state,indent)
     {return pp_open_box_gen(state,indent,2)}
    function pp_open_hovbox(state,indent)
     {return pp_open_box_gen(state,indent,3)}
    function pp_open_box(state,indent){return pp_open_box_gen(state,indent,4)}
    function pp_print_newline(state,param)
     {pp_flush_queue(state,1);return caml_call1(state[18],0)}
    function pp_print_flush(state,param)
     {pp_flush_queue(state,0);return caml_call1(state[18],0)}
    function pp_force_newline(state,param)
     {var _mk_=state[14] < state[15]?1:0;
      return _mk_?enqueue_advance(state,[0,size,3,0]):_mk_}
    function pp_print_if_newline(state,param)
     {var _mj_=state[14] < state[15]?1:0;
      return _mj_?enqueue_advance(state,[0,size,4,0]):_mj_}
    function pp_print_custom_break(state,fits,breaks)
     {var
       after=fits[3],
       width=fits[2],
       before=fits[1],
       _mi_=state[14] < state[15]?1:0;
      if(_mi_)
       {var
         size=- state[13] | 0,
         token=[1,fits,breaks],
         length=
          (caml_ml_string_length(before) + width | 0)
          +
          caml_ml_string_length(after)
          |
          0,
         elem=[0,size,token,length];
        return scan_push(state,1,elem)}
      return _mi_}
    function pp_print_break(state,width,offset)
     {return pp_print_custom_break
              (state,[0,cst$75,width,cst$74],[0,cst$73,offset,cst$72])}
    function pp_print_space(state,param){return pp_print_break(state,1,0)}
    function pp_print_cut(state,param){return pp_print_break(state,0,0)}
    function pp_open_tbox(state,param)
     {state[14] = state[14] + 1 | 0;
      var _mh_=state[14] < state[15]?1:0;
      if(_mh_)
       {var elem=[0,size,[4,[0,[0,0]]],0];return enqueue_advance(state,elem)}
      return _mh_}
    function pp_close_tbox(state,param)
     {var _me_=1 < state[14]?1:0;
      if(_me_)
       {var _mf_=state[14] < state[15]?1:0;
        if(_mf_)
         {var elem=[0,size,2,0];
          enqueue_advance(state,elem);
          state[14] = state[14] - 1 | 0;
          var _mg_=0}
        else
         var _mg_=_mf_}
      else
       var _mg_=_me_;
      return _mg_}
    function pp_print_tbreak(state,width,offset)
     {var _md_=state[14] < state[15]?1:0;
      if(_md_)
       {var size=- state[13] | 0,elem=[0,size,[2,width,offset],width];
        return scan_push(state,1,elem)}
      return _md_}
    function pp_print_tab(state,param){return pp_print_tbreak(state,0,0)}
    function pp_set_tab(state,param)
     {var _mc_=state[14] < state[15]?1:0;
      if(_mc_){var elem=[0,size,0,0];return enqueue_advance(state,elem)}
      return _mc_}
    function pp_set_max_boxes(state,n)
     {var _ma_=1 < n?1:0,_mb_=_ma_?(state[15] = n,0):_ma_;return _mb_}
    function pp_get_max_boxes(state,param){return state[15]}
    function pp_over_max_boxes(state,param)
     {return state[14] === state[15]?1:0}
    function pp_set_ellipsis_text(state,s){state[16] = s;return 0}
    function pp_get_ellipsis_text(state,param){return state[16]}
    function pp_limit(n){return n < 1000000010?n:1000000009}
    function pp_set_max_indent(state,n$0)
     {var _l$_=1 < n$0?1:0;
      if(_l$_)
       {var n$1=state[6] - n$0 | 0,_l__=1 <= n$1?1:0;
        if(_l__)
         {var n=pp_limit(n$1);
          state[7] = n;
          state[8] = state[6] - state[7] | 0;
          return pp_rinit(state)}
        return _l__}
      return _l$_}
    function pp_get_max_indent(state,param){return state[8]}
    function pp_set_margin(state,n)
     {var _l9_=1 <= n?1:0;
      if(_l9_)
       {var n$0=pp_limit(n);
        state[6] = n$0;
        var
         new_max_indent=
          state[8] <= state[6]
           ?state[8]
           :max$1(max$1(state[6] - state[7] | 0,state[6] / 2 | 0),1);
        return pp_set_max_indent(state,new_max_indent)}
      return _l9_}
    function validate_geometry(param)
     {var margin=param[2],max_indent=param[1];
      return 2 <= max_indent?margin <= max_indent?_cn_:_co_:_cp_}
    function check_geometry(geometry)
     {var match=validate_geometry(geometry);return 0 === match[0]?1:0}
    function pp_get_margin(state,param){return state[6]}
    function pp_set_full_geometry(state,param)
     {var margin=param[2],max_indent=param[1];
      pp_set_margin(state,margin);
      pp_set_max_indent(state,max_indent);
      return 0}
    function pp_set_geometry(state,max_indent,margin)
     {var geometry=[0,max_indent,margin],match=validate_geometry(geometry);
      if(0 === match[0])return pp_set_full_geometry(state,geometry);
      var msg=match[1];
      throw [0,Invalid_argument,cat(cst_Format_pp_set_geometry,msg)]}
    function pp_safe_set_geometry(state,max_indent,margin)
     {var geometry=[0,max_indent,margin],match=validate_geometry(geometry);
      return 0 === match[0]?pp_set_full_geometry(state,geometry):0}
    function pp_get_geometry(state,param){return [0,state[8],state[6]]}
    function pp_update_geometry(state,update)
     {var geometry=pp_get_geometry(state,0);
      return pp_set_full_geometry(state,caml_call1(update,geometry))}
    function pp_set_formatter_out_functions(state,param)
     {var j=param[5],i=param[4],h=param[3],g=param[2],f=param[1];
      state[17] = f;
      state[18] = g;
      state[19] = h;
      state[20] = i;
      state[21] = j;
      return 0}
    function pp_get_formatter_out_functions(state,param)
     {return [0,state[17],state[18],state[19],state[20],state[21]]}
    function pp_set_formatter_output_functi(state,f,g)
     {state[17] = f;state[18] = g;return 0}
    function pp_get_formatter_output_functi(state,param)
     {return [0,state[17],state[18]]}
    function display_newline(state,param)
     {return caml_call3(state[17],cst$76,0,1)}
    var blank_line=make$1(80,32);
    function display_indent(state,n)
     {var n$0=n;
      for(;;)
       {var _l8_=0 < n$0?1:0;
        if(_l8_)
         {if(80 < n$0)
           {caml_call3(state[17],blank_line,0,80);
            var n$1=n$0 - 80 | 0,n$0=n$1;
            continue}
          return caml_call3(state[17],blank_line,0,n$0)}
        return _l8_}}
    function pp_set_formatter_out_channel(state,oc)
     {state[17]
      =
      function(_l5_,_l6_,_l7_){return output_substring(oc,_l5_,_l6_,_l7_)};
      state[18] = function(param){return caml_ml_flush(oc)};
      state[19] = function(_l4_){return display_newline(state,_l4_)};
      state[20] = function(_l3_){return display_indent(state,_l3_)};
      state[21] = function(_l2_){return display_indent(state,_l2_)};
      return 0}
    function default_pp_mark_open_tag(param)
     {if(param[1] === String_tag)
       {var s=param[2];return cat(cst$78,cat(s,cst$77))}
      return cst$79}
    function default_pp_mark_close_tag(param)
     {if(param[1] === String_tag)
       {var s=param[2];return cat(cst$81,cat(s,cst$80))}
      return cst$82}
    function default_pp_print_open_tag(_l1_){return 0}
    function default_pp_print_close_tag(_l0_){return 0}
    function pp_make_formatter(f,g,h,i,j)
     {var pp_queue=create$1(0),sys_tok=[0,unknown,_cq_,0];
      add(sys_tok,pp_queue);
      var scan_stack=create$0(0);
      initialize_scan_stack(scan_stack);
      push([0,1,sys_tok],scan_stack);
      var _lX_=create$0(0),_lY_=create$0(0),_lZ_=create$0(0);
      return [0,
              scan_stack,
              create$0(0),
              _lZ_,
              _lY_,
              _lX_,
              78,
              10,
              68,
              78,
              0,
              1,
              1,
              1,
              1,
              max_int,
              cst$83,
              f,
              g,
              h,
              i,
              j,
              0,
              0,
              default_pp_mark_open_tag,
              default_pp_mark_close_tag,
              default_pp_print_open_tag,
              default_pp_print_close_tag,
              pp_queue]}
    function formatter_of_out_functions(out_funs)
     {return pp_make_formatter
              (out_funs[1],out_funs[2],out_funs[3],out_funs[4],out_funs[5])}
    function make_formatter(output,flush)
     {function _lP_(_lW_){return 0}
      function _lQ_(_lV_){return 0}
      var
       ppf=
        pp_make_formatter(output,flush,function(_lU_){return 0},_lQ_,_lP_);
      ppf[19] = function(_lT_){return display_newline(ppf,_lT_)};
      ppf[20] = function(_lS_){return display_indent(ppf,_lS_)};
      ppf[21] = function(_lR_){return display_indent(ppf,_lR_)};
      return ppf}
    function formatter_of_out_channel(oc)
     {function _lL_(param){return caml_ml_flush(oc)}
      return make_formatter
              (function(_lM_,_lN_,_lO_)
                {return output_substring(oc,_lM_,_lN_,_lO_)},
               _lL_)}
    function formatter_of_buffer(b)
     {function _lG_(_lK_){return 0}
      return make_formatter
              (function(_lH_,_lI_,_lJ_)
                {return add_substring(b,_lH_,_lI_,_lJ_)},
               _lG_)}
    var pp_buffer_size=512;
    function pp_make_buffer(param){return create$2(pp_buffer_size)}
    var
     stdbuf=pp_make_buffer(0),
     std_formatter=formatter_of_out_channel(stdout),
     err_formatter=formatter_of_out_channel(stderr),
     str_formatter=formatter_of_buffer(stdbuf);
    function flush_buffer_formatter(buf,ppf)
     {pp_flush_queue(ppf,0);var s=contents(buf);reset(buf);return s}
    function flush_str_formatter(param)
     {return flush_buffer_formatter(stdbuf,str_formatter)}
    function make_symbolic_output_buffer(param){return [0,0]}
    function clear_symbolic_output_buffer(sob){sob[1] = 0;return 0}
    function get_symbolic_output_buffer(sob){return rev(sob[1])}
    function flush_symbolic_output_buffer(sob)
     {var items=get_symbolic_output_buffer(sob);
      clear_symbolic_output_buffer(sob);
      return items}
    function add_symbolic_output_item(sob,item)
     {sob[1] = [0,item,sob[1]];return 0}
    function formatter_of_symbolic_output_b(sob)
     {function f(s,i,n){return add_symbolic_output_item(sob,[0,sub$0(s,i,n)])}
      function g(_lF_){return add_symbolic_output_item(sob,0)}
      function h(_lE_){return add_symbolic_output_item(sob,1)}
      function i(n){return add_symbolic_output_item(sob,[1,n])}
      function j(n){return add_symbolic_output_item(sob,[2,n])}
      return pp_make_formatter(f,g,h,i,j)}
    function open_hbox(_lD_){return pp_open_hbox(std_formatter,_lD_)}
    function open_vbox(_lC_){return pp_open_vbox(std_formatter,_lC_)}
    function open_hvbox(_lB_){return pp_open_hvbox(std_formatter,_lB_)}
    function open_hovbox(_lA_){return pp_open_hovbox(std_formatter,_lA_)}
    function open_box(_lz_){return pp_open_box(std_formatter,_lz_)}
    function close_box(_ly_){return pp_close_box(std_formatter,_ly_)}
    function open_tag(_lx_){return pp_open_tag(std_formatter,_lx_)}
    function close_tag(_lw_){return pp_close_tag(std_formatter,_lw_)}
    function open_stag(_lv_){return pp_open_stag(std_formatter,_lv_)}
    function close_stag(_lu_){return pp_close_stag(std_formatter,_lu_)}
    function print_as(_ls_,_lt_){return pp_print_as(std_formatter,_ls_,_lt_)}
    function print_string$0(_lr_){return pp_print_string(std_formatter,_lr_)}
    function print_bytes$0(_lq_){return pp_print_bytes(std_formatter,_lq_)}
    function print_int$0(_lp_){return pp_print_int(std_formatter,_lp_)}
    function print_float$0(_lo_){return pp_print_float(std_formatter,_lo_)}
    function print_char$0(_ln_){return pp_print_char(std_formatter,_ln_)}
    function print_bool(_lm_){return pp_print_bool(std_formatter,_lm_)}
    function print_break(_lk_,_ll_)
     {return pp_print_break(std_formatter,_lk_,_ll_)}
    function print_cut(_lj_){return pp_print_cut(std_formatter,_lj_)}
    function print_space(_li_){return pp_print_space(std_formatter,_li_)}
    function force_newline(_lh_){return pp_force_newline(std_formatter,_lh_)}
    function print_flush(_lg_){return pp_print_flush(std_formatter,_lg_)}
    function print_newline$0(_lf_)
     {return pp_print_newline(std_formatter,_lf_)}
    function print_if_newline(_le_)
     {return pp_print_if_newline(std_formatter,_le_)}
    function open_tbox(_ld_){return pp_open_tbox(std_formatter,_ld_)}
    function close_tbox(_lc_){return pp_close_tbox(std_formatter,_lc_)}
    function print_tbreak(_la_,_lb_)
     {return pp_print_tbreak(std_formatter,_la_,_lb_)}
    function set_tab(_k$_){return pp_set_tab(std_formatter,_k$_)}
    function print_tab(_k__){return pp_print_tab(std_formatter,_k__)}
    function set_margin(_k9_){return pp_set_margin(std_formatter,_k9_)}
    function get_margin(_k8_){return std_formatter[6]}
    function set_max_indent(_k7_)
     {return pp_set_max_indent(std_formatter,_k7_)}
    function get_max_indent(_k6_){return std_formatter[8]}
    function set_geometry(_k4_,_k5_)
     {return pp_set_geometry(std_formatter,_k4_,_k5_)}
    function safe_set_geometry(_k2_,_k3_)
     {return pp_safe_set_geometry(std_formatter,_k2_,_k3_)}
    function get_geometry(_k1_){return pp_get_geometry(std_formatter,_k1_)}
    function update_geometry(_k0_)
     {return pp_update_geometry(std_formatter,_k0_)}
    function set_max_boxes(_kZ_){return pp_set_max_boxes(std_formatter,_kZ_)}
    function get_max_boxes(_kY_){return std_formatter[15]}
    function over_max_boxes(_kX_)
     {return pp_over_max_boxes(std_formatter,_kX_)}
    function set_ellipsis_text(_kW_)
     {return pp_set_ellipsis_text(std_formatter,_kW_)}
    function get_ellipsis_text(_kV_){return std_formatter[16]}
    function set_formatter_out_channel(_kU_)
     {return pp_set_formatter_out_channel(std_formatter,_kU_)}
    function set_formatter_out_functions(_kT_)
     {return pp_set_formatter_out_functions(std_formatter,_kT_)}
    function get_formatter_out_functions(_kS_)
     {return pp_get_formatter_out_functions(std_formatter,_kS_)}
    function set_formatter_output_functions(_kQ_,_kR_)
     {return pp_set_formatter_output_functi(std_formatter,_kQ_,_kR_)}
    function get_formatter_output_functions(_kP_)
     {return pp_get_formatter_output_functi(std_formatter,_kP_)}
    function set_formatter_stag_functions(_kO_)
     {return pp_set_formatter_stag_function(std_formatter,_kO_)}
    function get_formatter_stag_functions(_kN_)
     {return pp_get_formatter_stag_function(std_formatter,_kN_)}
    function set_print_tags(_kM_)
     {return pp_set_print_tags(std_formatter,_kM_)}
    function get_print_tags(_kL_){return std_formatter[22]}
    function set_mark_tags(_kK_){return pp_set_mark_tags(std_formatter,_kK_)}
    function get_mark_tags(_kJ_){return std_formatter[23]}
    function set_tags(_kI_){return pp_set_tags(std_formatter,_kI_)}
    function pp_print_list(opt,pp_v,ppf,param)
     {var opt$0=opt,param$0=param;
      for(;;)
       {if(opt$0)var sth=opt$0[1],pp_sep=sth;else var pp_sep=pp_print_cut;
        if(param$0)
         {var _kH_=param$0[1];
          if(param$0[2])
           {var vs=param$0[2];
            caml_call2(pp_v,ppf,_kH_);
            caml_call2(pp_sep,ppf,0);
            var opt$1=[0,pp_sep],opt$0=opt$1,param$0=vs;
            continue}
          return caml_call2(pp_v,ppf,_kH_)}
        return 0}}
    function pp_print_seq(opt,pp_v,ppf,seq$1)
     {if(opt)var sth=opt[1],pp_sep=sth;else var pp_sep=pp_print_cut;
      var match$0=caml_call1(seq$1,0);
      if(match$0)
       {var seq$2=match$0[2],v$0=match$0[1];
        caml_call2(pp_v,ppf,v$0);
        var seq=seq$2;
        for(;;)
         {var match=caml_call1(seq,0);
          if(match)
           {var seq$0=match[2],v=match[1];
            caml_call2(pp_sep,ppf,0);
            caml_call2(pp_v,ppf,v);
            var seq=seq$0;
            continue}
          return 0}}
      return 0}
    function pp_print_text(ppf,s)
     {var len=caml_ml_string_length(s),left=[0,0],right=[0,0];
      function flush(param)
       {pp_print_string(ppf,sub$0(s,left[1],right[1] - left[1] | 0));
        right[1]++;
        left[1] = right[1];
        return 0}
      for(;;)
       {if(right[1] !== len)
         {var match=caml_string_get(s,right[1]);
          if(10 === match)
           {flush(0);pp_force_newline(ppf,0)}
          else
           if(32 === match){flush(0);pp_print_space(ppf,0)}else right[1]++;
          continue}
        var _kG_=left[1] !== len?1:0;
        return _kG_?flush(0):_kG_}}
    function pp_print_option(opt,pp_v,ppf,param)
     {if(opt)
       var sth=opt[1],none=sth;
      else
       var none=function(param,_kF_){return 0};
      if(param){var v=param[1];return caml_call2(pp_v,ppf,v)}
      return caml_call2(none,ppf,0)}
    function pp_print_result(ok,error,ppf,param)
     {if(0 === param[0]){var v=param[1];return caml_call2(ok,ppf,v)}
      var e=param[1];
      return caml_call2(error,ppf,e)}
    function pp_print_either(left,right,ppf,param)
     {if(0 === param[0]){var l=param[1];return caml_call2(left,ppf,l)}
      var r=param[1];
      return caml_call2(right,ppf,r)}
    function compute_tag(output,tag_acc)
     {var buf=create$2(16),ppf=formatter_of_buffer(buf);
      caml_call2(output,ppf,tag_acc);
      pp_print_flush(ppf,0);
      var len=buf[2];
      return 2 <= len?sub$3(buf,1,len - 2 | 0):contents(buf)}
    function output_formatting_lit(ppf,fmting_lit)
     {if(typeof fmting_lit === "number")
       switch(fmting_lit)
        {case 0:return pp_close_box(ppf,0);
         case 1:return pp_close_tag(ppf,0);
         case 2:return pp_print_flush(ppf,0);
         case 3:return pp_force_newline(ppf,0);
         case 4:return pp_print_newline(ppf,0);
         case 5:return pp_print_char(ppf,64);
         default:return pp_print_char(ppf,37)}
      else
       switch(fmting_lit[0])
        {case 0:
          var offset=fmting_lit[3],width=fmting_lit[2];
          return pp_print_break(ppf,width,offset);
         case 1:return 0;
         default:
          var c=fmting_lit[1];
          pp_print_char(ppf,64);
          return pp_print_char(ppf,c)}}
    function output_acc$0(ppf,acc)
     {var switch$0=0;
      if(typeof acc === "number")
       return 0;
      else
       switch(acc[0])
        {case 0:
          var f=acc[2],p=acc[1];
          output_acc$0(ppf,p);
          return output_formatting_lit(ppf,f);
         case 1:
          var _kv_=acc[2],_kw_=acc[1];
          if(0 === _kv_[0])
           {var acc$0=_kv_[1];
            output_acc$0(ppf,_kw_);
            return pp_open_stag
                    (ppf,[0,String_tag,compute_tag(output_acc$0,acc$0)])}
          var acc$1=_kv_[1];
          output_acc$0(ppf,_kw_);
          var
           match=open_box_of_string(compute_tag(output_acc$0,acc$1)),
           bty=match[2],
           indent=match[1];
          return pp_open_box_gen(ppf,indent,bty);
         case 2:
          var _kx_=acc[1],switch$1=0;
          if(typeof _kx_ !== "number" && 0 === _kx_[0])
           {var _ky_=_kx_[2],switch$2=0;
            if(typeof _ky_ !== "number" && 1 === _ky_[0])
             {var s$0=acc[2],size=_ky_[2],p$1=_kx_[1];
              switch$1 = 1;
              switch$2 = 1}}
          if(! switch$1){var s=acc[2],p$0=_kx_;switch$0 = 2}
          break;
         case 3:
          var _kz_=acc[1],switch$3=0;
          if(typeof _kz_ !== "number" && 0 === _kz_[0])
           {var _kA_=_kz_[2],switch$4=0;
            if(typeof _kA_ !== "number" && 1 === _kA_[0])
             {var c$0=acc[2],size$0=_kA_[2],p$3=_kz_[1];
              switch$0 = 1;
              switch$3 = 1;
              switch$4 = 1}}
          if(! switch$3){var c=acc[2],p$2=_kz_;switch$0 = 3}
          break;
         case 4:
          var _kB_=acc[1],switch$5=0;
          if(typeof _kB_ !== "number" && 0 === _kB_[0])
           {var _kC_=_kB_[2],switch$6=0;
            if(typeof _kC_ !== "number" && 1 === _kC_[0])
             {var s$0=acc[2],size=_kC_[2],p$1=_kB_[1];
              switch$5 = 1;
              switch$6 = 1}}
          if(! switch$5){var s=acc[2],p$0=_kB_;switch$0 = 2}
          break;
         case 5:
          var _kD_=acc[1],switch$7=0;
          if(typeof _kD_ === "number" || ! (0 === _kD_[0]))
           switch$7 = 1;
          else
           {var _kE_=_kD_[2],switch$8=0;
            if(typeof _kE_ !== "number" && 1 === _kE_[0])
             {var c$0=acc[2],size$0=_kE_[2],p$3=_kD_[1];
              switch$0 = 1;
              switch$8 = 1}
            if(! switch$8)switch$7 = 1}
          if(switch$7){var c=acc[2],p$2=_kD_;switch$0 = 3}
          break;
         case 6:
          var f$0=acc[2],p$4=acc[1];
          output_acc$0(ppf,p$4);
          return caml_call1(f$0,ppf);
         case 7:
          var p$5=acc[1];output_acc$0(ppf,p$5);return pp_print_flush(ppf,0);
         default:
          var msg=acc[2],p$6=acc[1];
          output_acc$0(ppf,p$6);
          return invalid_arg(msg)}
      switch(switch$0)
       {case 0:output_acc$0(ppf,p$1);return pp_print_as_size(ppf,size,s$0);
        case 1:
         output_acc$0(ppf,p$3);
         return pp_print_as_size(ppf,size$0,make$1(1,c$0));
        case 2:output_acc$0(ppf,p$0);return pp_print_string(ppf,s);
        default:output_acc$0(ppf,p$2);return pp_print_char(ppf,c)}}
    function strput_acc$0(ppf,acc)
     {var switch$0=0;
      if(typeof acc === "number")
       return 0;
      else
       switch(acc[0])
        {case 0:
          var f=acc[2],p=acc[1];
          strput_acc$0(ppf,p);
          return output_formatting_lit(ppf,f);
         case 1:
          var _kj_=acc[2],_kk_=acc[1];
          if(0 === _kj_[0])
           {var acc$0=_kj_[1];
            strput_acc$0(ppf,_kk_);
            return pp_open_stag
                    (ppf,[0,String_tag,compute_tag(strput_acc$0,acc$0)])}
          var acc$1=_kj_[1];
          strput_acc$0(ppf,_kk_);
          var
           match=open_box_of_string(compute_tag(strput_acc$0,acc$1)),
           bty=match[2],
           indent=match[1];
          return pp_open_box_gen(ppf,indent,bty);
         case 2:
          var _kl_=acc[1],switch$1=0;
          if(typeof _kl_ !== "number" && 0 === _kl_[0])
           {var _km_=_kl_[2],switch$2=0;
            if(typeof _km_ !== "number" && 1 === _km_[0])
             {var s$0=acc[2],size=_km_[2],p$1=_kl_[1];
              switch$1 = 1;
              switch$2 = 1}}
          if(! switch$1){var s=acc[2],p$0=_kl_;switch$0 = 2}
          break;
         case 3:
          var _kn_=acc[1],switch$3=0;
          if(typeof _kn_ !== "number" && 0 === _kn_[0])
           {var _ko_=_kn_[2],switch$4=0;
            if(typeof _ko_ !== "number" && 1 === _ko_[0])
             {var c$0=acc[2],size$0=_ko_[2],p$3=_kn_[1];
              switch$0 = 1;
              switch$3 = 1;
              switch$4 = 1}}
          if(! switch$3){var c=acc[2],p$2=_kn_;switch$0 = 3}
          break;
         case 4:
          var _kp_=acc[1],switch$5=0;
          if(typeof _kp_ !== "number" && 0 === _kp_[0])
           {var _kq_=_kp_[2],switch$6=0;
            if(typeof _kq_ !== "number" && 1 === _kq_[0])
             {var s$0=acc[2],size=_kq_[2],p$1=_kp_[1];
              switch$5 = 1;
              switch$6 = 1}}
          if(! switch$5){var s=acc[2],p$0=_kp_;switch$0 = 2}
          break;
         case 5:
          var _kr_=acc[1],switch$7=0;
          if(typeof _kr_ === "number" || ! (0 === _kr_[0]))
           switch$7 = 1;
          else
           {var _ks_=_kr_[2],switch$8=0;
            if(typeof _ks_ !== "number" && 1 === _ks_[0])
             {var c$0=acc[2],size$0=_ks_[2],p$3=_kr_[1];
              switch$0 = 1;
              switch$8 = 1}
            if(! switch$8)switch$7 = 1}
          if(switch$7){var c=acc[2],p$2=_kr_;switch$0 = 3}
          break;
         case 6:
          var _kt_=acc[1];
          if(typeof _kt_ !== "number" && 0 === _kt_[0])
           {var _ku_=_kt_[2];
            if(typeof _ku_ !== "number" && 1 === _ku_[0])
             {var f$1=acc[2],size$1=_ku_[2],p$4=_kt_[1];
              strput_acc$0(ppf,p$4);
              return pp_print_as_size(ppf,size$1,caml_call1(f$1,0))}}
          var f$0=acc[2];
          strput_acc$0(ppf,_kt_);
          return pp_print_string(ppf,caml_call1(f$0,0));
         case 7:
          var p$5=acc[1];strput_acc$0(ppf,p$5);return pp_print_flush(ppf,0);
         default:
          var msg=acc[2],p$6=acc[1];
          strput_acc$0(ppf,p$6);
          return invalid_arg(msg)}
      switch(switch$0)
       {case 0:strput_acc$0(ppf,p$1);return pp_print_as_size(ppf,size,s$0);
        case 1:
         strput_acc$0(ppf,p$3);
         return pp_print_as_size(ppf,size$0,make$1(1,c$0));
        case 2:strput_acc$0(ppf,p$0);return pp_print_string(ppf,s);
        default:strput_acc$0(ppf,p$2);return pp_print_char(ppf,c)}}
    function kfprintf$0(k,ppf,param)
     {var fmt=param[1],_ki_=0;
      return make_printf
              (function(acc){output_acc$0(ppf,acc);return caml_call1(k,ppf)},
               _ki_,
               fmt)}
    function ikfprintf$0(k,ppf,param)
     {var fmt=param[1];return make_iprintf(k,ppf,fmt)}
    function ifprintf$0(ppf,param)
     {var fmt=param[1],_kg_=0;
      return make_iprintf(function(_kh_){return 0},_kg_,fmt)}
    function fprintf$0(ppf)
     {function _kd_(_kf_){return 0}
      return function(_ke_){return kfprintf$0(_kd_,ppf,_ke_)}}
    function printf$0(fmt){return caml_call1(fprintf$0(std_formatter),fmt)}
    function eprintf$0(fmt){return caml_call1(fprintf$0(err_formatter),fmt)}
    function kdprintf(k,param)
     {var fmt=param[1],_kc_=0;
      return make_printf
              (function(acc)
                {return caml_call1
                         (k,function(ppf){return output_acc$0(ppf,acc)})},
               _kc_,
               fmt)}
    function dprintf(fmt){return kdprintf(function(i){return i},fmt)}
    function kprintf(k,param)
     {var fmt=param[1],b=pp_make_buffer(0),ppf=formatter_of_buffer(b);
      function k$0(acc)
       {strput_acc$0(ppf,acc);
        return caml_call1(k,flush_buffer_formatter(b,ppf))}
      return make_printf(k$0,0,fmt)}
    function sprintf$0(fmt){return kprintf(id$0,fmt)}
    function kasprintf(k,param)
     {var fmt=param[1],b=pp_make_buffer(0),ppf=formatter_of_buffer(b);
      function k$0(acc)
       {output_acc$0(ppf,acc);
        return caml_call1(k,flush_buffer_formatter(b,ppf))}
      return make_printf(k$0,0,fmt)}
    function asprintf(fmt){return kasprintf(id$0,fmt)}
    function flush_standard_formatters(param)
     {pp_print_flush(std_formatter,0);return pp_print_flush(err_formatter,0)}
    at_exit(flush_standard_formatters);
    function pp_set_all_formatter_output_fu(state,f,g,h,i)
     {pp_set_formatter_output_functi(state,f,g);
      state[19] = h;
      state[20] = i;
      return 0}
    function pp_get_all_formatter_output_fu(state,param)
     {return [0,state[17],state[18],state[19],state[20]]}
    function set_all_formatter_output_funct(_j__,_j$_,_ka_,_kb_)
     {return pp_set_all_formatter_output_fu(std_formatter,_j__,_j$_,_ka_,_kb_)}
    function get_all_formatter_output_funct(_j9_)
     {return pp_get_all_formatter_output_fu(std_formatter,_j9_)}
    function bprintf$0(b,param)
     {var fmt=param[1],ppf=formatter_of_buffer(b);
      function k(acc){output_acc$0(ppf,acc);return pp_flush_queue(ppf,0)}
      return make_printf(k,0,fmt)}
    function pp_set_formatter_tag_functions(state,param)
     {var pct=param[4],pot=param[3],mct=param[2],mot=param[1];
      function stringify(f,e,param)
       {if(param[1] === String_tag){var s=param[2];return caml_call1(f,s)}
        return e}
      state[24] = function(_j8_){return stringify(mot,cst$84,_j8_)};
      state[25] = function(_j7_){return stringify(mct,cst$85,_j7_)};
      var _j3_=0;
      state[26] = function(_j6_){return stringify(pot,_j3_,_j6_)};
      var _j4_=0;
      state[27] = function(_j5_){return stringify(pct,_j4_,_j5_)};
      return 0}
    function pp_get_formatter_tag_functions(fmt,param)
     {var funs=pp_get_formatter_stag_function(fmt,0);
      function mark_open_tag(s){return caml_call1(funs[1],[0,String_tag,s])}
      function mark_close_tag(s){return caml_call1(funs[2],[0,String_tag,s])}
      function print_open_tag(s){return caml_call1(funs[3],[0,String_tag,s])}
      function print_close_tag(s){return caml_call1(funs[4],[0,String_tag,s])}
      return [0,mark_open_tag,mark_close_tag,print_open_tag,print_close_tag]}
    function set_formatter_tag_functions(_j2_)
     {return pp_set_formatter_tag_functions(std_formatter,_j2_)}
    function get_formatter_tag_functions(_j1_)
     {return pp_get_formatter_tag_functions(std_formatter,_j1_)}
    var
     Stdlib_Format=
      [0,
       pp_open_box,
       open_box,
       pp_close_box,
       close_box,
       pp_open_hbox,
       open_hbox,
       pp_open_vbox,
       open_vbox,
       pp_open_hvbox,
       open_hvbox,
       pp_open_hovbox,
       open_hovbox,
       pp_print_string,
       print_string$0,
       pp_print_bytes,
       print_bytes$0,
       pp_print_as,
       print_as,
       pp_print_int,
       print_int$0,
       pp_print_float,
       print_float$0,
       pp_print_char,
       print_char$0,
       pp_print_bool,
       print_bool,
       pp_print_space,
       print_space,
       pp_print_cut,
       print_cut,
       pp_print_break,
       print_break,
       pp_print_custom_break,
       pp_force_newline,
       force_newline,
       pp_print_if_newline,
       print_if_newline,
       pp_print_flush,
       print_flush,
       pp_print_newline,
       print_newline$0,
       pp_set_margin,
       set_margin,
       pp_get_margin,
       get_margin,
       pp_set_max_indent,
       set_max_indent,
       pp_get_max_indent,
       get_max_indent,
       check_geometry,
       pp_set_geometry,
       set_geometry,
       pp_safe_set_geometry,
       safe_set_geometry,
       pp_update_geometry,
       update_geometry,
       pp_get_geometry,
       get_geometry,
       pp_set_max_boxes,
       set_max_boxes,
       pp_get_max_boxes,
       get_max_boxes,
       pp_over_max_boxes,
       over_max_boxes,
       pp_open_tbox,
       open_tbox,
       pp_close_tbox,
       close_tbox,
       pp_set_tab,
       set_tab,
       pp_print_tab,
       print_tab,
       pp_print_tbreak,
       print_tbreak,
       pp_set_ellipsis_text,
       set_ellipsis_text,
       pp_get_ellipsis_text,
       get_ellipsis_text,
       String_tag,
       pp_open_stag,
       open_stag,
       pp_close_stag,
       close_stag,
       pp_set_tags,
       set_tags,
       pp_set_print_tags,
       set_print_tags,
       pp_set_mark_tags,
       set_mark_tags,
       pp_get_print_tags,
       get_print_tags,
       pp_get_mark_tags,
       get_mark_tags,
       pp_set_formatter_out_channel,
       set_formatter_out_channel,
       pp_set_formatter_output_functi,
       set_formatter_output_functions,
       pp_get_formatter_output_functi,
       get_formatter_output_functions,
       pp_set_formatter_out_functions,
       set_formatter_out_functions,
       pp_get_formatter_out_functions,
       get_formatter_out_functions,
       pp_set_formatter_stag_function,
       set_formatter_stag_functions,
       pp_get_formatter_stag_function,
       get_formatter_stag_functions,
       formatter_of_out_channel,
       std_formatter,
       err_formatter,
       formatter_of_buffer,
       stdbuf,
       str_formatter,
       flush_str_formatter,
       make_formatter,
       formatter_of_out_functions,
       make_symbolic_output_buffer,
       clear_symbolic_output_buffer,
       get_symbolic_output_buffer,
       flush_symbolic_output_buffer,
       add_symbolic_output_item,
       formatter_of_symbolic_output_b,
       pp_print_list,
       pp_print_seq,
       pp_print_text,
       pp_print_option,
       pp_print_result,
       pp_print_either,
       fprintf$0,
       printf$0,
       eprintf$0,
       sprintf$0,
       asprintf,
       dprintf,
       ifprintf$0,
       kfprintf$0,
       kdprintf,
       ikfprintf$0,
       kprintf,
       kasprintf,
       bprintf$0,
       kprintf,
       set_all_formatter_output_funct,
       get_all_formatter_output_funct,
       pp_set_all_formatter_output_fu,
       pp_get_all_formatter_output_fu,
       pp_open_tag,
       open_tag,
       pp_close_tag,
       close_tag,
       pp_set_formatter_tag_functions,
       set_formatter_tag_functions,
       pp_get_formatter_tag_functions,
       get_formatter_tag_functions];
    caml_register_global(818,Stdlib_Format,"Stdlib__Format");
    var null_char=0;
    function next_char(ib)
     {try
       {var c=caml_call1(ib[7],0);
        ib[2] = c;
        ib[3] = 1;
        ib[4] = ib[4] + 1 | 0;
        if(10 === c)ib[5] = ib[5] + 1 | 0;
        return c}
      catch(_j0_)
       {_j0_ = caml_wrap_exception(_j0_);
        if(_j0_ === End_of_file)
         {ib[2] = null_char;ib[3] = 0;ib[1] = 1;return null_char}
        throw _j0_}}
    function peek_char(ib){return ib[3]?ib[2]:next_char(ib)}
    function checked_peek_char(ib)
     {var c=peek_char(ib);if(ib[1])throw End_of_file;return c}
    function end_of_input(ib){peek_char(ib);return ib[1]}
    function beginning_of_input(ib){return 0 === ib[4]?1:0}
    function name_of_input(ib)
     {var _jZ_=ib[9];
      if(typeof _jZ_ === "number")
       return 0 === _jZ_?cst_unnamed_function:cst_unnamed_character_string;
      else
       {if(0 === _jZ_[0])return cst_unnamed_Stdlib_input_chann;
        var fname=_jZ_[1];
        return fname}}
    function char_count(ib){return ib[3]?ib[4] - 1 | 0:ib[4]}
    function reset_token(ib){return reset(ib[8])}
    function invalidate_current_char(ib){ib[3] = 0;return 0}
    function token_string(ib)
     {var token_buffer=ib[8],tok=contents(token_buffer);
      clear$1(token_buffer);
      ib[6] = ib[6] + 1 | 0;
      return tok}
    function skip_char(width,ib){invalidate_current_char(ib);return width}
    function ignore_char(width,ib){return skip_char(width - 1 | 0,ib)}
    function store_char(width,ib,c)
     {add_char(ib[8],c);return ignore_char(width,ib)}
    var default_token_buffer_size=1024;
    function create$4(iname,next)
     {return [0,
              0,
              null_char,
              0,
              0,
              0,
              0,
              next,
              create$2(default_token_buffer_size),
              iname]}
    function from_string$1(s)
     {var i=[0,0],len=caml_ml_string_length(s);
      function next(param)
       {if(len <= i[1])throw End_of_file;
        var c=caml_string_get(s,i[1]);
        i[1]++;
        return c}
      return create$4(1,next)}
    var _cr_=0;
    function from_function$0(_jY_){return create$4(_cr_,_jY_)}
    var len=1024;
    function scan_close_at_end(ic)
     {caml_ml_close_channel(ic);throw End_of_file}
    function scan_raise_at_end(ic){throw End_of_file}
    function from_ic(scan_close_ic,iname,ic)
     {var buf=caml_create_bytes(1024),i=[0,0],lim=[0,0],eof=[0,0];
      function next(param)
       {if(i[1] < lim[1]){var c=caml_bytes_get(buf,i[1]);i[1]++;return c}
        if(eof[1])throw End_of_file;
        lim[1] = input(ic,buf,0,len);
        return 0 === lim[1]
                ?(eof[1] = 1,caml_call1(scan_close_ic,ic))
                :(i[1] = 1,caml_bytes_get(buf,0))}
      return create$4(iname,next)}
    var stdib=from_ic(scan_raise_at_end,[1,cst$86,stdin],stdin);
    function open_in_file(open_in,fname)
     {if(caml_string_notequal(fname,cst$87))
       {var ic=caml_call1(open_in,fname);
        return from_ic(scan_close_at_end,[1,fname,ic],ic)}
      return stdib}
    function from_file(_jX_){return open_in_file(open_text$0,_jX_)}
    function from_file_bin(_jW_){return open_in_file(open_bin$0,_jW_)}
    function from_channel$0(ic){return from_ic(scan_raise_at_end,[0,ic],ic)}
    function close_in(ib)
     {var _jV_=ib[9];
      if(typeof _jV_ === "number")
       return 0;
      else
       {if(0 === _jV_[0]){var ic=_jV_[1];return caml_ml_close_channel(ic)}
        var ic$0=_jV_[2];
        return caml_ml_close_channel(ic$0)}}
    var memo=[0,0];
    function memo_from_ic(scan_close_ic,ic)
     {try
       {var _jT_=assq(ic,memo[1]);return _jT_}
      catch(_jU_)
       {_jU_ = caml_wrap_exception(_jU_);
        if(_jU_ === Not_found)
         {var ib=from_ic(scan_close_ic,[0,ic],ic);
          memo[1] = [0,[0,ic,ib],memo[1]];
          return ib}
        throw _jU_}}
    function memo_from_channel(_jS_)
     {return memo_from_ic(scan_raise_at_end,_jS_)}
    var Scan_failure=[248,cst_Stdlib_Scanf_Scan_failure,caml_fresh_oo_id(0)];
    function bad_input(s){throw [0,Scan_failure,s]}
    function bad_input_escape(c)
     {return bad_input(caml_call1(sprintf(_cs_),c))}
    function bad_token_length(message)
     {return bad_input(caml_call1(sprintf(_ct_),message))}
    function bad_float(param)
     {return bad_input(cst_no_dot_or_exponent_part_fo)}
    function bad_hex_float(param)
     {return bad_input(cst_not_a_valid_float_in_hexad)}
    function character_mismatch(c,ci)
     {return bad_input(caml_call2(sprintf(_cv_),c,ci))}
    function check_this_char(ib,c)
     {var ci=checked_peek_char(ib);
      return ci === c?invalidate_current_char(ib):character_mismatch(c,ci)}
    function check_char(ib,c$0)
     {if(10 === c$0)
       {var ci=checked_peek_char(ib);
        return 10 === ci
                ?invalidate_current_char(ib)
                :13 === ci
                  ?(invalidate_current_char(ib),check_this_char(ib,10))
                  :character_mismatch(10,ci)}
      if(32 === c$0)
       for(;;)
        {var c=peek_char(ib),_jQ_=1 - ib[1];
         if(_jQ_)
          {var _jR_=c - 9 | 0,switch$0=0;
           if(4 < _jR_ >>> 0)
            {if(23 === _jR_)switch$0 = 1}
           else
            if(1 < _jR_ - 2 >>> 0)switch$0 = 1;
           if(switch$0){invalidate_current_char(ib);continue}
           return 0}
         return _jQ_}
      return check_this_char(ib,c$0)}
    function token_char(ib){return caml_string_get(token_string(ib),0)}
    function token_bool(ib)
     {var s=token_string(ib);
      return caml_string_notequal(s,cst_false$3)
              ?caml_string_notequal(s,cst_true$3)
                ?bad_input(caml_call1(sprintf(_cw_),s))
                :1
              :0}
    function integer_conversion_of_char(param)
     {var switcher=param - 88 | 0;
      if(! (32 < switcher >>> 0))
       switch(switcher)
        {case 10:return 0;
         case 12:return 1;
         case 17:return 2;
         case 23:return 3;
         case 29:return 4;
         case 0:
         case 32:return 5
         }
      throw [0,Assert_failure,_cx_]}
    function token_int_literal(conv,ib)
     {switch(conv)
       {case 0:var tok=cat(cst_0b,token_string(ib));break;
        case 3:var tok=cat(cst_0o,token_string(ib));break;
        case 4:var tok=cat(cst_0u,token_string(ib));break;
        case 5:var tok=cat(cst_0x,token_string(ib));break;
        default:var tok=token_string(ib)}
      var l=caml_ml_string_length(tok);
      if(0 !== l && 43 === caml_string_get(tok,0))
       return sub$0(tok,1,l - 1 | 0);
      return tok}
    function token_float(ib){return caml_float_of_string(token_string(ib))}
    function scan_decimal_digit_star(width,ib)
     {var width$0=width;
      for(;;)
       {if(0 === width$0)return width$0;
        var c=peek_char(ib);
        if(ib[1])return width$0;
        if(58 <= c)
         {if(95 === c)
           {var width$1=ignore_char(width$0,ib),width$0=width$1;continue}}
        else
         if(48 <= c)
          {var width$2=store_char(width$0,ib,c),width$0=width$2;continue}
        return width$0}}
    function scan_unsigned_decimal_int(width,ib)
     {if(0 === width)return bad_token_length(cst_decimal_digits);
      var c=checked_peek_char(ib);
      if(9 < c - 48 >>> 0)return bad_input(caml_call1(sprintf(_cy_),c));
      var width$0=store_char(width,ib,c);
      return scan_decimal_digit_star(width$0,ib)}
    function scan_digit_plus(basis,digitp,width$2,ib)
     {if(0 === width$2)return bad_token_length(cst_digits);
      var c$0=checked_peek_char(ib);
      if(caml_call1(digitp,c$0))
       {var width$3=store_char(width$2,ib,c$0),width=width$3;
        for(;;)
         {if(0 === width)return width;
          var c=peek_char(ib);
          if(ib[1])return width;
          if(caml_call1(digitp,c))
           {var width$0=store_char(width,ib,c),width=width$0;continue}
          if(95 === c)
           {var width$1=ignore_char(width,ib),width=width$1;continue}
          return width}}
      return bad_input(caml_call2(sprintf(_cz_),c$0,basis))}
    function is_binary_digit(param){return 1 < param - 48 >>> 0?0:1}
    function scan_binary_int(_jO_,_jP_)
     {return scan_digit_plus(cst_binary,is_binary_digit,_jO_,_jP_)}
    function is_octal_digit(param){return 7 < param - 48 >>> 0?0:1}
    function scan_octal_int(_jM_,_jN_)
     {return scan_digit_plus(cst_octal,is_octal_digit,_jM_,_jN_)}
    function is_hexa_digit(param)
     {var _jL_=param - 48 | 0,switch$0=0;
      if(22 < _jL_ >>> 0)
       {if(! (5 < _jL_ - 49 >>> 0))switch$0 = 1}
      else
       if(6 < _jL_ - 10 >>> 0)switch$0 = 1;
      return switch$0?1:0}
    function scan_hexadecimal_int(_jJ_,_jK_)
     {return scan_digit_plus(cst_hexadecimal,is_hexa_digit,_jJ_,_jK_)}
    function scan_sign(width,ib)
     {var c=checked_peek_char(ib),switcher=c - 43 | 0;
      if(! (2 < switcher >>> 0))
       switch(switcher)
        {case 0:return store_char(width,ib,c);
         case 1:break;
         default:return store_char(width,ib,c)}
      return width}
    function scan_optionally_signed_decimal(width,ib)
     {var width$0=scan_sign(width,ib);
      return scan_unsigned_decimal_int(width$0,ib)}
    function scan_int_conversion(conv,width$1,ib)
     {switch(conv)
       {case 0:return scan_binary_int(width$1,ib);
        case 1:return scan_optionally_signed_decimal(width$1,ib);
        case 2:
         var width$0=scan_sign(width$1,ib),c=checked_peek_char(ib);
         if(48 === c)
          {var width=store_char(width$0,ib,c);
           if(0 === width)return width;
           var c$0=peek_char(ib);
           if(ib[1])return width;
           var switch$0=0;
           if(99 <= c$0)
            {if(111 === c$0)
              return scan_octal_int(store_char(width,ib,c$0),ib);
             if(120 === c$0)switch$0 = 1}
           else
            if(88 === c$0)
             switch$0 = 1;
            else
             if(98 <= c$0)return scan_binary_int(store_char(width,ib,c$0),ib);
           return switch$0
                   ?scan_hexadecimal_int(store_char(width,ib,c$0),ib)
                   :scan_decimal_digit_star(width,ib)}
         return scan_unsigned_decimal_int(width$0,ib);
        case 3:return scan_octal_int(width$1,ib);
        case 4:return scan_unsigned_decimal_int(width$1,ib);
        default:return scan_hexadecimal_int(width$1,ib)}}
    function scan_fractional_part(width,ib)
     {if(0 === width)return width;
      var c=peek_char(ib);
      return ib[1]
              ?width
              :9 < c - 48 >>> 0
                ?width
                :scan_decimal_digit_star(store_char(width,ib,c),ib)}
    function scan_exponent_part(width,ib)
     {if(0 === width)return width;
      var c=peek_char(ib);
      if(ib[1])return width;
      if(69 !== c && 101 !== c)return width;
      return scan_optionally_signed_decimal(store_char(width,ib,c),ib)}
    function scan_float(width$1,precision,ib)
     {var
       width=scan_sign(width$1,ib),
       width$0=scan_decimal_digit_star(width,ib);
      if(0 === width$0)return [0,width$0,precision];
      var c=peek_char(ib);
      if(ib[1])return [0,width$0,precision];
      if(46 === c)
       {var
         width$2=store_char(width$0,ib,c),
         precision$0=min$1(width$2,precision),
         width$3=
          width$2
          -
          (precision$0 - scan_fractional_part(precision$0,ib) | 0)
          |
          0;
        return [0,scan_exponent_part(width$3,ib),precision$0]}
      return [0,scan_exponent_part(width$0,ib),precision]}
    function check_case_insensitive_string(width,ib,error,str)
     {function lowercase(c)
       {return 25 < c - 65 >>> 0?c:char_of_int((c - 65 | 0) + 97 | 0)}
      var
       len=caml_ml_string_length(str),
       width$0=[0,width],
       _jG_=len - 1 | 0,
       _jF_=0;
      if(! (_jG_ < 0))
       {var i=_jF_;
        for(;;)
         {var c=peek_char(ib),_jH_=lowercase(caml_string_get(str,i));
          if(lowercase(c) !== _jH_)caml_call1(error,0);
          if(0 === width$0[1])caml_call1(error,0);
          width$0[1] = store_char(width$0[1],ib,c);
          var _jI_=i + 1 | 0;
          if(_jG_ !== i){var i=_jI_;continue}
          break}}
      return width$0[1]}
    function scan_hex_float(width,precision,ib)
     {var _js_=0 === width?1:0,_jt_=_js_ || end_of_input(ib);
      if(_jt_)bad_hex_float(0);
      var
       width$0=scan_sign(width,ib),
       _ju_=0 === width$0?1:0,
       _jv_=_ju_ || end_of_input(ib);
      if(_jv_)bad_hex_float(0);
      var c=peek_char(ib),switch$0=0;
      if(78 <= c)
       {var switcher=c - 79 | 0;
        if(30 < switcher >>> 0)
         {if(! (32 <= switcher))
           {var
             width$1=store_char(width$0,ib,c),
             _jw_=0 === width$1?1:0,
             _jx_=_jw_ || end_of_input(ib);
            if(_jx_)bad_hex_float(0);
            return check_case_insensitive_string
                    (width$1,ib,bad_hex_float,cst_an)}}
        else
         if(26 === switcher)switch$0 = 1}
      else
       {if(48 === c)
         {var
           width$3=store_char(width$0,ib,c),
           _jA_=0 === width$3?1:0,
           _jB_=_jA_ || end_of_input(ib);
          if(_jB_)bad_hex_float(0);
          var
           width$4=
            check_case_insensitive_string(width$3,ib,bad_hex_float,cst_x$2);
          if(0 !== width$4 && ! end_of_input(ib))
           {var match=peek_char(ib),_jC_=match - 46 | 0,switch$1=0;
            if(34 < _jC_ >>> 0)
             {if(66 === _jC_)switch$1 = 1}
            else
             if(32 < _jC_ - 1 >>> 0)switch$1 = 1;
            var width$5=switch$1?width$4:scan_hexadecimal_int(width$4,ib);
            if(0 !== width$5 && ! end_of_input(ib))
             {var c$0=peek_char(ib);
              if(46 === c$0)
               {var width$6=store_char(width$5,ib,c$0),switch$2=0;
                if(0 !== width$6 && ! end_of_input(ib))
                 {var match$0=peek_char(ib),switch$3=0;
                  if(80 !== match$0 && 112 !== match$0)
                   {var
                     precision$0=min$1(width$6,precision),
                     width$10=
                      width$6
                      -
                      (precision$0 - scan_hexadecimal_int(precision$0,ib) | 0)
                      |
                      0;
                    switch$3 = 1}
                  if(! switch$3)var width$10=width$6;
                  var width$7=width$10;
                  switch$2 = 1}
                if(! switch$2)var width$7=width$6;
                var width$8=width$7}
              else
               var width$8=width$5;
              if(0 !== width$8 && ! end_of_input(ib))
               {var c$1=peek_char(ib);
                if(80 !== c$1 && 112 !== c$1)return width$8;
                var
                 width$9=store_char(width$8,ib,c$1),
                 _jD_=0 === width$9?1:0,
                 _jE_=_jD_ || end_of_input(ib);
                if(_jE_)bad_hex_float(0);
                return scan_optionally_signed_decimal(width$9,ib)}
              return width$8}
            return width$5}
          return width$4}
        if(73 === c)switch$0 = 1}
      if(switch$0)
       {var
         width$2=store_char(width$0,ib,c),
         _jy_=0 === width$2?1:0,
         _jz_=_jy_ || end_of_input(ib);
        if(_jz_)bad_hex_float(0);
        return check_case_insensitive_string
                (width$2,ib,bad_hex_float,cst_nfinity)}
      return bad_hex_float(0)}
    function scan_caml_float_rest(width,precision,ib)
     {var _jo_=0 === width?1:0,_jp_=_jo_ || end_of_input(ib);
      if(_jp_)bad_float(0);
      var
       width$0=scan_decimal_digit_star(width,ib),
       _jq_=0 === width$0?1:0,
       _jr_=_jq_ || end_of_input(ib);
      if(_jr_)bad_float(0);
      var c=peek_char(ib),switcher=c - 69 | 0;
      if(32 < switcher >>> 0)
       {if(-23 === switcher)
         {var
           width$1=store_char(width$0,ib,c),
           precision$0=min$1(width$1,precision),
           width_precision=scan_fractional_part(precision$0,ib),
           frac_width=precision$0 - width_precision | 0,
           width$2=width$1 - frac_width | 0;
          return scan_exponent_part(width$2,ib)}}
      else
       if(30 < switcher - 1 >>> 0)return scan_exponent_part(width$0,ib);
      return bad_float(0)}
    function scan_caml_float(width,precision,ib)
     {var _ja_=0 === width?1:0,_jb_=_ja_ || end_of_input(ib);
      if(_jb_)bad_float(0);
      var
       width$0=scan_sign(width,ib),
       _jc_=0 === width$0?1:0,
       _jd_=_jc_ || end_of_input(ib);
      if(_jd_)bad_float(0);
      var c=peek_char(ib);
      if(49 <= c)
       {if(! (58 <= c))
         {var
           width$1=store_char(width$0,ib,c),
           _je_=0 === width$1?1:0,
           _jf_=_je_ || end_of_input(ib);
          if(_jf_)bad_float(0);
          return scan_caml_float_rest(width$1,precision,ib)}}
      else
       if(48 <= c)
        {var
          width$2=store_char(width$0,ib,c),
          _jg_=0 === width$2?1:0,
          _jh_=_jg_ || end_of_input(ib);
         if(_jh_)bad_float(0);
         var c$0=peek_char(ib);
         if(88 !== c$0 && 120 !== c$0)
          return scan_caml_float_rest(width$2,precision,ib);
         var
          width$3=store_char(width$2,ib,c$0),
          _ji_=0 === width$3?1:0,
          _jj_=_ji_ || end_of_input(ib);
         if(_jj_)bad_float(0);
         var
          width$4=scan_hexadecimal_int(width$3,ib),
          _jk_=0 === width$4?1:0,
          _jl_=_jk_ || end_of_input(ib);
         if(_jl_)bad_float(0);
         var c$1=peek_char(ib),switcher=c$1 - 80 | 0,switch$0=0;
         if(32 < switcher >>> 0)
          if(-34 === switcher)
           {var width$5=store_char(width$4,ib,c$1),switch$1=0;
            if(0 !== width$5 && ! end_of_input(ib))
             {var match=peek_char(ib),switch$2=0;
              if(80 !== match && 112 !== match)
               {var
                 precision$0=min$1(width$5,precision),
                 width$10=
                  width$5
                  -
                  (precision$0 - scan_hexadecimal_int(precision$0,ib) | 0)
                  |
                  0;
                switch$2 = 1}
              if(! switch$2)var width$10=width$5;
              var width$6=width$10;
              switch$1 = 1}
            if(! switch$1)var width$6=width$5;
            var width$7=width$6}
          else
           switch$0 = 1;
         else
          if(30 < switcher - 1 >>> 0)var width$7=width$4;else switch$0 = 1;
         var width$8=switch$0?bad_float(0):width$7;
         if(0 !== width$8 && ! end_of_input(ib))
          {var c$2=peek_char(ib);
           if(80 !== c$2 && 112 !== c$2)return width$8;
           var
            width$9=store_char(width$8,ib,c$2),
            _jm_=0 === width$9?1:0,
            _jn_=_jm_ || end_of_input(ib);
           if(_jn_)bad_hex_float(0);
           return scan_optionally_signed_decimal(width$9,ib)}
         return width$8}
      return bad_float(0)}
    function scan_string(stp,width,ib)
     {var width$0=width;
      for(;;)
       {if(0 === width$0)return width$0;
        var c=peek_char(ib);
        if(ib[1])return width$0;
        if(stp)
         {var c$0=stp[1];
          if(c === c$0)return skip_char(width$0,ib);
          var width$1=store_char(width$0,ib,c),width$0=width$1;
          continue}
        var _i$_=c - 9 | 0,switch$0=0;
        if(4 < _i$_ >>> 0)
         {if(23 === _i$_)switch$0 = 1}
        else
         if(1 < _i$_ - 2 >>> 0)switch$0 = 1;
        if(switch$0)return width$0;
        var width$2=store_char(width$0,ib,c),width$0=width$2;
        continue}}
    function scan_char(width,ib)
     {return store_char(width,ib,checked_peek_char(ib))}
    function hexadecimal_value_of_char(d)
     {return 97 <= d?d - 87 | 0:65 <= d?d - 55 | 0:d - 48 | 0}
    function check_next_char(message,width,ib)
     {if(0 === width)return bad_token_length(message);
      var c=peek_char(ib);
      return ib[1]?bad_input(caml_call1(sprintf(_cu_),message)):c}
    function check_next_char_for_char(_i9_,_i__)
     {return check_next_char(cst_a_Char,_i9_,_i__)}
    function check_next_char_for_string(_i7_,_i8_)
     {return check_next_char(cst_a_String,_i7_,_i8_)}
    function scan_backslash_char(width,ib)
     {var c0=check_next_char_for_char(width,ib),switch$0=0;
      if(40 <= c0)
       {if(58 <= c0)
         {var switcher=c0 - 92 | 0;
          if(! (28 < switcher >>> 0))
           switch(switcher)
            {case 28:
              var
               get_digit=
                function(param)
                 {var c=next_char(ib),_i6_=c - 48 | 0,switch$0=0;
                  if(22 < _i6_ >>> 0)
                   {if(! (5 < _i6_ - 49 >>> 0))switch$0 = 1}
                  else
                   if(6 < _i6_ - 10 >>> 0)switch$0 = 1;
                  return switch$0?c:bad_input_escape(c)},
               c1=get_digit(0),
               c2=get_digit(0),
               _i2_=hexadecimal_value_of_char(c2),
               c$0=(16 * hexadecimal_value_of_char(c1) | 0) + _i2_ | 0,
               switch$1=0;
              if(0 <= c$0 && ! (255 < c$0))
               {var _i4_=char_of_int(c$0);switch$1 = 1}
              if(! switch$1)
               var _i4_=bad_input(caml_call2(sprintf(_cB_),c1,c2));
              return store_char(width - 2 | 0,ib,_i4_);
             case 0:
             case 6:
             case 18:
             case 22:
             case 24:switch$0 = 1;break
             }}
        else
         if(48 <= c0)
          {var
            get_digit$0=
             function(param)
              {var c=next_char(ib);
               return 9 < c - 48 >>> 0?bad_input_escape(c):c},
            c1$0=get_digit$0(0),
            c2$0=get_digit$0(0),
            c=
             ((100 * (c0 - 48 | 0) | 0) + (10 * (c1$0 - 48 | 0) | 0) | 0)
             +
             (c2$0 - 48 | 0)
             |
             0,
            switch$2=0;
           if(0 <= c && ! (255 < c)){var _i5_=char_of_int(c);switch$2 = 1}
           if(! switch$2)
            var _i5_=bad_input(caml_call3(sprintf(_cA_),c0,c1$0,c2$0));
           return store_char(width - 2 | 0,ib,_i5_)}}
      else
       if(34 === c0 || 39 <= c0)switch$0 = 1;
      if(switch$0)
       {var switch$3=0;
        if(110 <= c0)
         if(117 <= c0)
          switch$3 = 1;
         else
          switch(c0 - 110 | 0)
           {case 0:var _i3_=10;break;
            case 4:var _i3_=13;break;
            case 6:var _i3_=9;break;
            default:switch$3 = 1}
        else
         if(98 === c0)var _i3_=8;else switch$3 = 1;
        if(switch$3)var _i3_=c0;
        return store_char(width,ib,_i3_)}
      return bad_input_escape(c0)}
    function scan_caml_char(width,ib)
     {function find_stop(width)
       {var c=check_next_char_for_char(width,ib);
        return 39 === c?ignore_char(width,ib):character_mismatch(39,c)}
      var c=checked_peek_char(ib);
      if(39 === c)
       {var
         width$0=ignore_char(width,ib),
         c$0=check_next_char_for_char(width$0,ib);
        return 92 === c$0
                ?find_stop(scan_backslash_char(ignore_char(width$0,ib),ib))
                :find_stop(store_char(width$0,ib,c$0))}
      return character_mismatch(39,c)}
    function scan_caml_string(width,ib)
     {function find_stop$0(counter,width)
       {var width$0=width;
        for(;;)
         {var c=check_next_char_for_string(width$0,ib);
          if(34 === c)return ignore_char(width$0,ib);
          if(92 === c)
           {var
             width$1=ignore_char(width$0,ib),
             match=check_next_char_for_string(width$1,ib);
            if(10 === match)
             {var _i0_=ignore_char(width$1,ib);
              if(counter < 50)
               {var counter$0=counter + 1 | 0;
                return skip_spaces(counter$0,_i0_)}
              return caml_trampoline_return(skip_spaces,[0,_i0_])}
            if(13 === match)
             {var
               width$3=ignore_char(width$1,ib),
               match$0=check_next_char_for_string(width$3,ib);
              if(10 === match$0)
               {var _i1_=ignore_char(width$3,ib);
                if(counter < 50)
                 {var counter$1=counter + 1 | 0;
                  return skip_spaces(counter$1,_i1_)}
                return caml_trampoline_return(skip_spaces,[0,_i1_])}
              var width$5=store_char(width$3,ib,13),width$0=width$5;
              continue}
            var width$4=scan_backslash_char(width$1,ib),width$0=width$4;
            continue}
          var width$2=store_char(width$0,ib,c),width$0=width$2;
          continue}}
      function skip_spaces(counter,width)
       {var width$0=width;
        for(;;)
         {var match=check_next_char_for_string(width$0,ib);
          if(32 === match)
           {var width$1=ignore_char(width$0,ib),width$0=width$1;continue}
          if(counter < 50)
           {var counter$0=counter + 1 | 0;
            return find_stop$0(counter$0,width$0)}
          return caml_trampoline_return(find_stop$0,[0,width$0])}}
      function find_stop(width){return caml_trampoline(find_stop$0(0,width))}
      var c=checked_peek_char(ib);
      return 34 === c
              ?find_stop(ignore_char(width,ib))
              :character_mismatch(34,c)}
    function scan_chars_in_char_set(char_set,scan_indic,width,ib)
     {function scan_chars(i,stp)
       {var i$0=i;
        for(;;)
         {var c=peek_char(ib),_iW_=0 < i$0?1:0;
          if(_iW_)
           {var _iX_=1 - ib[1];
            if(_iX_)
             var _iY_=is_in_char_set(char_set,c),_iZ_=_iY_?c !== stp?1:0:_iY_;
            else
             var _iZ_=_iX_}
          else
           var _iZ_=_iW_;
          if(_iZ_)
           {store_char(max_int,ib,c);var i$1=i$0 - 1 | 0,i$0=i$1;continue}
          return _iZ_}}
      if(scan_indic)
       {var c=scan_indic[1];
        scan_chars(width,c);
        var _iV_=1 - ib[1];
        if(_iV_)
         {var ci=peek_char(ib);
          return c === ci?invalidate_current_char(ib):character_mismatch(c,ci)}
        return _iV_}
      return scan_chars(width,-1)}
    function scanf_bad_input(ib,x)
     {if(x[1] === Scan_failure)
       var s=x[2];
      else
       {if(x[1] !== Failure)throw x;var s=x[2]}
      var i=char_count(ib);
      return bad_input(caml_call2(sprintf(_cD_),i,s))}
    function get_counter(ib,counter)
     {switch(counter)
       {case 0:return ib[5];case 1:return char_count(ib);default:return ib[6]}}
    function width_of_pad_opt(pad_opt)
     {if(pad_opt){var width=pad_opt[1];return width}return max_int}
    function stopper_of_formatting_lit(fmting)
     {if(6 === fmting)return _cE_;
      var
       str=string_of_formatting_lit(fmting),
       stp=caml_string_get(str,1),
       sub_str=sub$0(str,2,caml_ml_string_length(str) - 2 | 0);
      return [0,stp,sub_str]}
    function take_format_readers$0(counter,k,fmt)
     {var fmt$0=fmt;
      for(;;)
       if(typeof fmt$0 === "number")
        return caml_call1(k,0);
       else
        switch(fmt$0[0])
         {case 0:var fmt$1=fmt$0[1],fmt$0=fmt$1;continue;
          case 1:var fmt$2=fmt$0[1],fmt$0=fmt$2;continue;
          case 2:var fmt$3=fmt$0[2],fmt$0=fmt$3;continue;
          case 3:var fmt$4=fmt$0[2],fmt$0=fmt$4;continue;
          case 4:var fmt$5=fmt$0[4],fmt$0=fmt$5;continue;
          case 5:var fmt$6=fmt$0[4],fmt$0=fmt$6;continue;
          case 6:var fmt$7=fmt$0[4],fmt$0=fmt$7;continue;
          case 7:var fmt$8=fmt$0[4],fmt$0=fmt$8;continue;
          case 8:var fmt$9=fmt$0[4],fmt$0=fmt$9;continue;
          case 9:var fmt$10=fmt$0[2],fmt$0=fmt$10;continue;
          case 10:var fmt$11=fmt$0[1],fmt$0=fmt$11;continue;
          case 11:var fmt$12=fmt$0[2],fmt$0=fmt$12;continue;
          case 12:var fmt$13=fmt$0[2],fmt$0=fmt$13;continue;
          case 13:var fmt$14=fmt$0[3],fmt$0=fmt$14;continue;
          case 14:
           var rest=fmt$0[3],fmtty=fmt$0[2],_iT_=erase_rel(symm(fmtty));
           if(counter < 50)
            {var counter$0=counter + 1 | 0;
             return take_fmtty_format_readers$0(counter$0,k,_iT_,rest)}
           return caml_trampoline_return
                   (take_fmtty_format_readers$0,[0,k,_iT_,rest]);
          case 15:var fmt$15=fmt$0[1],fmt$0=fmt$15;continue;
          case 16:var fmt$16=fmt$0[1],fmt$0=fmt$16;continue;
          case 17:var fmt$17=fmt$0[2],fmt$0=fmt$17;continue;
          case 18:
           var _iU_=fmt$0[1];
           if(0 === _iU_[0])
            {var
              rest$0=fmt$0[2],
              match=_iU_[1],
              fmt$18=match[1],
              fmt$19=concat_fmt(fmt$18,rest$0),
              fmt$0=fmt$19;
             continue}
           var
            rest$1=fmt$0[2],
            match$0=_iU_[1],
            fmt$20=match$0[1],
            fmt$21=concat_fmt(fmt$20,rest$1),
            fmt$0=fmt$21;
           continue;
          case 19:
           var fmt_rest=fmt$0[1];
           return function(reader)
            {function new_k(readers_rest)
              {return caml_call1(k,[0,reader,readers_rest])}
             return take_format_readers(new_k,fmt_rest)};
          case 20:var fmt$22=fmt$0[3],fmt$0=fmt$22;continue;
          case 21:var fmt$23=fmt$0[2],fmt$0=fmt$23;continue;
          case 22:var fmt$24=fmt$0[1],fmt$0=fmt$24;continue;
          case 23:
           var rest$2=fmt$0[2],ign=fmt$0[1];
           if(typeof ign === "number")
            switch(ign)
             {case 0:var fmt$0=rest$2;continue;
              case 1:var fmt$0=rest$2;continue;
              case 2:
               return function(reader)
                {function new_k(readers_rest)
                  {return caml_call1(k,[0,reader,readers_rest])}
                 return take_format_readers(new_k,rest$2)};
              default:var fmt$0=rest$2;continue}
           else
            switch(ign[0])
             {case 0:var fmt$0=rest$2;continue;
              case 1:var fmt$0=rest$2;continue;
              case 2:var fmt$0=rest$2;continue;
              case 3:var fmt$0=rest$2;continue;
              case 4:var fmt$0=rest$2;continue;
              case 5:var fmt$0=rest$2;continue;
              case 6:var fmt$0=rest$2;continue;
              case 7:var fmt$0=rest$2;continue;
              case 8:var fmt$0=rest$2;continue;
              case 9:
               var fmtty$0=ign[2];
               if(counter < 50)
                {var counter$1=counter + 1 | 0;
                 return take_fmtty_format_readers$0
                         (counter$1,k,fmtty$0,rest$2)}
               return caml_trampoline_return
                       (take_fmtty_format_readers$0,[0,k,fmtty$0,rest$2]);
              case 10:var fmt$0=rest$2;continue;
              default:var fmt$0=rest$2;continue}
          default:var fmt$25=fmt$0[3],fmt$0=fmt$25;continue}}
    function take_fmtty_format_readers$0(counter,k,fmtty,fmt)
     {var fmtty$0=fmtty;
      for(;;)
       if(typeof fmtty$0 === "number")
        {if(counter < 50)
          {var counter$0=counter + 1 | 0;
           return take_format_readers$0(counter$0,k,fmt)}
         return caml_trampoline_return(take_format_readers$0,[0,k,fmt])}
       else
        switch(fmtty$0[0])
         {case 0:var fmtty$1=fmtty$0[1],fmtty$0=fmtty$1;continue;
          case 1:var fmtty$2=fmtty$0[1],fmtty$0=fmtty$2;continue;
          case 2:var fmtty$3=fmtty$0[1],fmtty$0=fmtty$3;continue;
          case 3:var fmtty$4=fmtty$0[1],fmtty$0=fmtty$4;continue;
          case 4:var fmtty$5=fmtty$0[1],fmtty$0=fmtty$5;continue;
          case 5:var fmtty$6=fmtty$0[1],fmtty$0=fmtty$6;continue;
          case 6:var fmtty$7=fmtty$0[1],fmtty$0=fmtty$7;continue;
          case 7:var fmtty$8=fmtty$0[1],fmtty$0=fmtty$8;continue;
          case 8:var fmtty$9=fmtty$0[2],fmtty$0=fmtty$9;continue;
          case 9:
           var
            rest=fmtty$0[3],
            ty2=fmtty$0[2],
            ty1=fmtty$0[1],
            ty=trans(symm(ty1),ty2),
            fmtty$10=concat_fmtty(ty,rest),
            fmtty$0=fmtty$10;
           continue;
          case 10:var fmtty$11=fmtty$0[1],fmtty$0=fmtty$11;continue;
          case 11:var fmtty$12=fmtty$0[1],fmtty$0=fmtty$12;continue;
          case 12:var fmtty$13=fmtty$0[1],fmtty$0=fmtty$13;continue;
          case 13:
           var fmt_rest=fmtty$0[1];
           return function(reader)
            {function new_k(readers_rest)
              {return caml_call1(k,[0,reader,readers_rest])}
             return take_fmtty_format_readers(new_k,fmt_rest,fmt)};
          default:
           var fmt_rest$0=fmtty$0[1];
           return function(reader)
            {function new_k(readers_rest)
              {return caml_call1(k,[0,reader,readers_rest])}
             return take_fmtty_format_readers(new_k,fmt_rest$0,fmt)}}}
    function take_format_readers(k,fmt)
     {return caml_trampoline(take_format_readers$0(0,k,fmt))}
    function take_fmtty_format_readers(k,fmtty,fmt)
     {return caml_trampoline(take_fmtty_format_readers$0(0,k,fmtty,fmt))}
    function make_scanf(ib,fmt,readers)
     {var fmt$0=fmt;
      for(;;)
       if(typeof fmt$0 === "number")
        return 0;
       else
        switch(fmt$0[0])
         {case 0:
           var rest=fmt$0[1];
           scan_char(0,ib);
           var c=token_char(ib);
           return [0,c,make_scanf(ib,rest,readers)];
          case 1:
           var rest$0=fmt$0[1];
           scan_caml_char(0,ib);
           var c$0=token_char(ib);
           return [0,c$0,make_scanf(ib,rest$0,readers)];
          case 2:
           var _iG_=fmt$0[1],_iH_=fmt$0[2];
           if(typeof _iH_ !== "number")
            switch(_iH_[0])
             {case 17:
               var
                rest$2=_iH_[2],
                fmting_lit=_iH_[1],
                match=stopper_of_formatting_lit(fmting_lit),
                str=match[2],
                stp=match[1],
                scan$0=
                 function(width,param,ib)
                  {return scan_string([0,stp],width,ib)},
                str_rest=[11,str,rest$2];
               return pad_prec_scanf
                       (ib,str_rest,readers,_iG_,0,scan$0,token_string);
              case 18:
               var _iI_=_iH_[1];
               if(0 === _iI_[0])
                {var
                  rest$3=_iH_[2],
                  match$0=_iI_[1],
                  fmt$1=match$0[1],
                  scan$1=
                   function(width,param,ib){return scan_string(_cF_,width,ib)};
                 return pad_prec_scanf
                         (ib,
                          concat_fmt(fmt$1,rest$3),
                          readers,
                          _iG_,
                          0,
                          scan$1,
                          token_string)}
               var
                rest$4=_iH_[2],
                match$1=_iI_[1],
                fmt$2=match$1[1],
                scan$2=
                 function(width,param,ib){return scan_string(_cG_,width,ib)};
               return pad_prec_scanf
                       (ib,
                        concat_fmt(fmt$2,rest$4),
                        readers,
                        _iG_,
                        0,
                        scan$2,
                        token_string)
              }
           var
            rest$1=fmt$0[2],
            scan=function(width,param,ib){return scan_string(0,width,ib)};
           return pad_prec_scanf(ib,rest$1,readers,_iG_,0,scan,token_string);
          case 3:
           var
            rest$5=fmt$0[2],
            pad=fmt$0[1],
            scan$3=function(width,param,ib){return scan_caml_string(width,ib)};
           return pad_prec_scanf(ib,rest$5,readers,pad,0,scan$3,token_string);
          case 4:
           var
            rest$6=fmt$0[4],
            prec=fmt$0[3],
            pad$0=fmt$0[2],
            iconv=fmt$0[1],
            conv=integer_conversion_of_char(char_of_iconv(iconv)),
            scan$4=
             function(width,param,ib)
              {return scan_int_conversion(conv,width,ib)};
           return pad_prec_scanf
                   (ib,
                    rest$6,
                    readers,
                    pad$0,
                    prec,
                    scan$4,
                    function(ib)
                     {return caml_int_of_string(token_int_literal(conv,ib))});
          case 5:
           var
            rest$7=fmt$0[4],
            prec$0=fmt$0[3],
            pad$1=fmt$0[2],
            iconv$0=fmt$0[1],
            conv$0=integer_conversion_of_char(char_of_iconv(iconv$0)),
            scan$5=
             function(width,param,ib)
              {return scan_int_conversion(conv$0,width,ib)};
           return pad_prec_scanf
                   (ib,
                    rest$7,
                    readers,
                    pad$1,
                    prec$0,
                    scan$5,
                    function(ib)
                     {return caml_int_of_string(token_int_literal(conv$0,ib))});
          case 6:
           var
            rest$8=fmt$0[4],
            prec$1=fmt$0[3],
            pad$2=fmt$0[2],
            iconv$1=fmt$0[1],
            conv$1=integer_conversion_of_char(char_of_iconv(iconv$1)),
            scan$6=
             function(width,param,ib)
              {return scan_int_conversion(conv$1,width,ib)};
           return pad_prec_scanf
                   (ib,
                    rest$8,
                    readers,
                    pad$2,
                    prec$1,
                    scan$6,
                    function(ib)
                     {return caml_int_of_string(token_int_literal(conv$1,ib))});
          case 7:
           var
            rest$9=fmt$0[4],
            prec$2=fmt$0[3],
            pad$3=fmt$0[2],
            iconv$2=fmt$0[1],
            conv$2=integer_conversion_of_char(char_of_iconv(iconv$2)),
            scan$7=
             function(width,param,ib)
              {return scan_int_conversion(conv$2,width,ib)};
           return pad_prec_scanf
                   (ib,
                    rest$9,
                    readers,
                    pad$3,
                    prec$2,
                    scan$7,
                    function(ib)
                     {return caml_int64_of_string(token_int_literal(conv$2,ib))});
          case 8:
           switch(fmt$0[1][2])
            {case 5:
             case 8:
              var rest$11=fmt$0[4],prec$4=fmt$0[3],pad$5=fmt$0[2];
              return pad_prec_scanf
                      (ib,
                       rest$11,
                       readers,
                       pad$5,
                       prec$4,
                       scan_caml_float,
                       token_float);
             case 6:
             case 7:
              var rest$12=fmt$0[4],prec$5=fmt$0[3],pad$6=fmt$0[2];
              return pad_prec_scanf
                      (ib,rest$12,readers,pad$6,prec$5,scan_hex_float,token_float);
             default:
              var rest$10=fmt$0[4],prec$3=fmt$0[3],pad$4=fmt$0[2];
              return pad_prec_scanf
                      (ib,rest$10,readers,pad$4,prec$3,scan_float,token_float)}
          case 9:
           var
            rest$13=fmt$0[2],
            pad$7=fmt$0[1],
            scan$8=
             function(param,_iS_,ib)
              {var
                c=checked_peek_char(ib),
                m=
                 102 === c
                  ?5
                  :116 === c?4:bad_input(caml_call1(sprintf(_cC_),c));
               return scan_string(0,m,ib)};
           return pad_prec_scanf(ib,rest$13,readers,pad$7,0,scan$8,token_bool);
          case 10:
           var rest$14=fmt$0[1];
           if(end_of_input(ib)){var fmt$0=rest$14;continue}
           return bad_input(cst_end_of_input_not_found);
          case 11:
           var rest$15=fmt$0[2],str$0=fmt$0[1];
           iter$4(function(_iR_){return check_char(ib,_iR_)},str$0);
           var fmt$0=rest$15;
           continue;
          case 12:
           var rest$16=fmt$0[2],chr=fmt$0[1];
           check_char(ib,chr);
           var fmt$0=rest$16;
           continue;
          case 13:
           var rest$17=fmt$0[3],fmtty=fmt$0[2],pad_opt=fmt$0[1];
           scan_caml_string(width_of_pad_opt(pad_opt),ib);
           var s=token_string(ib);
           try
            {var _iJ_=format_of_string_fmtty(s,fmtty),fmt$3=_iJ_}
           catch(exn)
            {exn = caml_wrap_exception(exn);
             if(exn[1] !== Failure)throw exn;
             var msg=exn[2],fmt$3=bad_input(msg)}
           return [0,fmt$3,make_scanf(ib,rest$17,readers)];
          case 14:
           var rest$18=fmt$0[3],fmtty$0=fmt$0[2],pad_opt$0=fmt$0[1];
           scan_caml_string(width_of_pad_opt(pad_opt$0),ib);
           var s$0=token_string(ib);
           try
            {var
              match$2=fmt_ebb_of_string(0,s$0),
              fmt$6=match$2[1],
              match$3=fmt_ebb_of_string(0,s$0),
              fmt$7=match$3[1],
              fmt$8=type_format(fmt$7,erase_rel(symm(fmtty$0))),
              _iL_=type_format(fmt$6,erase_rel(fmtty$0)),
              fmt$5=fmt$8,
              fmt$4=_iL_}
           catch(exn)
            {exn = caml_wrap_exception(exn);
             if(exn[1] !== Failure)throw exn;
             var
              msg$0=exn[2],
              _iK_=bad_input(msg$0),
              fmt$5=_iK_[2],
              fmt$4=_iK_[1]}
           return [0,
                   [0,fmt$4,s$0],
                   make_scanf(ib,concat_fmt(fmt$5,rest$18),readers)];
          case 15:return invalid_arg(cst_scanf_bad_conversion_a);
          case 16:return invalid_arg(cst_scanf_bad_conversion_t);
          case 17:
           var
            rest$19=fmt$0[2],
            formatting_lit=fmt$0[1],
            _iM_=string_of_formatting_lit(formatting_lit);
           iter$4(function(_iQ_){return check_char(ib,_iQ_)},_iM_);
           var fmt$0=rest$19;
           continue;
          case 18:
           var _iN_=fmt$0[1];
           if(0 === _iN_[0])
            {var rest$20=fmt$0[2],match$4=_iN_[1],fmt$9=match$4[1];
             check_char(ib,64);
             check_char(ib,123);
             var fmt$10=concat_fmt(fmt$9,rest$20),fmt$0=fmt$10;
             continue}
           var rest$21=fmt$0[2],match$5=_iN_[1],fmt$11=match$5[1];
           check_char(ib,64);
           check_char(ib,91);
           var fmt$12=concat_fmt(fmt$11,rest$21),fmt$0=fmt$12;
           continue;
          case 19:
           var fmt_rest=fmt$0[1];
           if(readers)
            {var
              readers_rest=readers[2],
              reader=readers[1],
              x=caml_call1(reader,ib);
             return [0,x,make_scanf(ib,fmt_rest,readers_rest)]}
           return invalid_arg(cst_scanf_missing_reader);
          case 20:
           var _iO_=fmt$0[1],_iP_=fmt$0[3];
           if(typeof _iP_ !== "number" && 17 === _iP_[0])
            {var
              rest$23=_iP_[2],
              fmting_lit$0=_iP_[1],
              char_set$0=fmt$0[2],
              match$6=stopper_of_formatting_lit(fmting_lit$0),
              str$1=match$6[2],
              stp$0=match$6[1],
              width$0=width_of_pad_opt(_iO_);
             scan_chars_in_char_set(char_set$0,[0,stp$0],width$0,ib);
             var s$2=token_string(ib),str_rest$0=[11,str$1,rest$23];
             return [0,s$2,make_scanf(ib,str_rest$0,readers)]}
           var
            rest$22=fmt$0[3],
            char_set=fmt$0[2],
            width=width_of_pad_opt(_iO_);
           scan_chars_in_char_set(char_set,0,width,ib);
           var s$1=token_string(ib);
           return [0,s$1,make_scanf(ib,rest$22,readers)];
          case 21:
           var
            rest$24=fmt$0[2],
            counter=fmt$0[1],
            count=get_counter(ib,counter);
           return [0,count,make_scanf(ib,rest$24,readers)];
          case 22:
           var rest$25=fmt$0[1],c$1=checked_peek_char(ib);
           return [0,c$1,make_scanf(ib,rest$25,readers)];
          case 23:
           var
            rest$26=fmt$0[2],
            ign=fmt$0[1],
            match$7=param_format_of_ignored_format(ign,rest$26),
            fmt$13=match$7[1],
            match$8=make_scanf(ib,fmt$13,readers);
           if(match$8){var arg_rest=match$8[2];return arg_rest}
           throw [0,Assert_failure,_cH_];
          default:return invalid_arg(cst_scanf_bad_conversion_custo)}}
    function pad_prec_scanf(ib,fmt,readers,pad,prec,scan,token)
     {if(typeof pad === "number")
       {if(typeof prec === "number")
         {if(prec)return invalid_arg(cst_scanf_bad_conversion);
          caml_call3(scan,max_int,max_int,ib);
          var x=caml_call1(token,ib);
          return [0,x,make_scanf(ib,fmt,readers)]}
        var p=prec[1];
        caml_call3(scan,max_int,p,ib);
        var x$0=caml_call1(token,ib);
        return [0,x$0,make_scanf(ib,fmt,readers)]}
      else
       {if(0 === pad[0])
         {if(pad[1])
           {var _iF_=pad[2];
            if(typeof prec === "number")
             {if(prec)return invalid_arg(cst_scanf_bad_conversion$0);
              caml_call3(scan,_iF_,max_int,ib);
              var x$1=caml_call1(token,ib);
              return [0,x$1,make_scanf(ib,fmt,readers)]}
            var p$0=prec[1];
            caml_call3(scan,_iF_,p$0,ib);
            var x$2=caml_call1(token,ib);
            return [0,x$2,make_scanf(ib,fmt,readers)]}
          return invalid_arg(cst_scanf_bad_conversion$1)}
        return invalid_arg(cst_scanf_bad_conversion$2)}}
    function kscanf(ib,ef,param)
     {var str=param[2],fmt=param[1];
      function apply(f,args)
       {var f$0=f,args$0=args;
        for(;;)
         {if(args$0)
           {var
             r=args$0[2],
             x=args$0[1],
             f$1=caml_call1(f$0,x),
             f$0=f$1,
             args$0=r;
            continue}
          return f$0}}
      function k(readers,f)
       {reset_token(ib);
        try
         {var _iE_=[0,make_scanf(ib,fmt,readers)],_iD_=_iE_}
        catch(exc)
         {exc = caml_wrap_exception(exc);
          var switch$0=0;
          if
           (exc[1]
            !==
            Scan_failure
            &&
            exc[1]
            !==
            Failure
            &&
            exc
            !==
            End_of_file)
           {if(exc[1] !== Invalid_argument)throw exc;
            var
             msg=exc[2],
             _iC_=
              invalid_arg
               (cat(msg,cat(cst_in_format,cat(escaped$1(str),cst$88))));
            switch$0 = 1}
          if(! switch$0)var _iC_=[1,exc];
          var _iD_=_iC_}
        if(0 === _iD_[0]){var args=_iD_[1];return apply(f,args)}
        var exc=_iD_[1];
        return caml_call2(ef,ib,exc)}
      return take_format_readers(k,fmt)}
    function bscanf(ib,fmt){return kscanf(ib,scanf_bad_input,fmt)}
    function ksscanf(s,ef,fmt){return kscanf(from_string$1(s),ef,fmt)}
    function sscanf(s,fmt)
     {return kscanf(from_string$1(s),scanf_bad_input,fmt)}
    function scanf(fmt){return kscanf(stdib,scanf_bad_input,fmt)}
    function bscanf_format(ib,format,f)
     {scan_caml_string(max_int,ib);
      var str=token_string(ib);
      try
       {var _iB_=format_of_string_format(str,format),fmt=_iB_}
      catch(exn)
       {exn = caml_wrap_exception(exn);
        if(exn[1] !== Failure)throw exn;
        var msg=exn[2],fmt=bad_input(msg)}
      return caml_call1(f,fmt)}
    function sscanf_format(s,format,f)
     {return bscanf_format(from_string$1(s),format,f)}
    function format_from_string(s,fmt)
     {function _iA_(x){return x}
      return sscanf_format(cat(cst$90,cat(escaped$1(s),cst$89)),fmt,_iA_)}
    function unescaped(s)
     {function _iz_(x){return x}
      return caml_call1(sscanf(cat(cst$92,cat(s,cst$91)),_cI_),_iz_)}
    function kfscanf(ic,ef,fmt){return kscanf(memo_from_channel(ic),ef,fmt)}
    function fscanf(ic,fmt)
     {return kscanf(memo_from_channel(ic),scanf_bad_input,fmt)}
    var
     Stdlib_Scanf=
      [0,
       [0,
        stdib,
        from_file,
        from_file_bin,
        close_in,
        from_file,
        from_file_bin,
        from_string$1,
        from_function$0,
        from_channel$0,
        end_of_input,
        beginning_of_input,
        name_of_input,
        stdib],
       Scan_failure,
       bscanf,
       sscanf,
       scanf,
       kscanf,
       ksscanf,
       bscanf_format,
       sscanf_format,
       format_from_string,
       unescaped,
       fscanf,
       kfscanf];
    caml_register_global(819,Stdlib_Scanf,"Stdlib__Scanf");
    function register(name,v){return caml_register_named_value(name,v)}
    function register_exception(name,exn)
     {var slot=caml_obj_tag(exn) === 248?exn:exn[1];
      return caml_register_named_value(name,slot)}
    var Stdlib_Callback=[0,register,register_exception];
    caml_register_global(820,Stdlib_Callback,"Stdlib__Callback");
    function copy$7(o){var o$0=o.slice();return caml_set_oo_id(o$0)}
    var params$0=[0,1,1,1,3,16],initial_object_size=2,dummy_item=0;
    function public_method_label(s)
     {var accu=[0,0],_iw_=caml_ml_string_length(s) - 1 | 0,_iv_=0;
      if(! (_iw_ < 0))
       {var i=_iv_;
        for(;;)
         {var _ix_=caml_string_get(s,i);
          accu[1] = (223 * accu[1] | 0) + _ix_ | 0;
          var _iy_=i + 1 | 0;
          if(_iw_ !== i){var i=_iy_;continue}
          break}}
      accu[1] = accu[1] & 2147483647;
      var tag=1073741823 < accu[1]?accu[1] + 2147483648 | 0:accu[1];
      return tag}
    function compare$14(x,y){return caml_string_compare(x,y)}
    var Vars=caml_call1(Stdlib_Map[1],[0,compare$14]);
    function compare$15(x,y){return caml_string_compare(x,y)}
    var
     Meths=caml_call1(Stdlib_Map[1],[0,compare$15]),
     compare$16=caml_int_compare,
     Labs=caml_call1(Stdlib_Map[1],[0,compare$16]),
     dummy_table=[0,0,[0,dummy_item],Meths[1],Labs[1],0,0,Vars[1],0],
     table_count=[0,0],
     dummy_met=caml_obj_block(0,0);
    function fit_size(n){return 2 < n?fit_size((n + 1 | 0) / 2 | 0) * 2 | 0:n}
    function new_table(pub_labels)
     {table_count[1]++;
      var
       len=pub_labels.length - 1,
       methods=caml_make_vect((len * 2 | 0) + 2 | 0,dummy_met);
      caml_check_bound(methods,0)[1] = len;
      var _ip_=((fit_size(len) * 32 | 0) / 8 | 0) - 1 | 0;
      caml_check_bound(methods,1)[2] = _ip_;
      var _ir_=len - 1 | 0,_iq_=0;
      if(! (_ir_ < 0))
       {var i=_iq_;
        for(;;)
         {var
           _it_=(i * 2 | 0) + 3 | 0,
           _is_=caml_check_bound(pub_labels,i)[1 + i];
          caml_check_bound(methods,_it_)[1 + _it_] = _is_;
          var _iu_=i + 1 | 0;
          if(_ir_ !== i){var i=_iu_;continue}
          break}}
      return [0,initial_object_size,methods,Meths[1],Labs[1],0,0,Vars[1],0]}
    function resize$1(array,new_size)
     {var old_size=array[2].length - 1,_in_=old_size < new_size?1:0;
      if(_in_)
       {var new_buck=caml_make_vect(new_size,dummy_met);
        blit$1(array[2],0,new_buck,0,old_size);
        array[2] = new_buck;
        var _io_=0}
      else
       var _io_=_in_;
      return _io_}
    var method_count=[0,0],inst_var_count=[0,0];
    function new_method(table)
     {var index=table[2].length - 1;
      resize$1(table,index + 1 | 0);
      return index}
    function get_method_label(table,name)
     {try
       {var _il_=caml_call2(Meths[28],name,table[3]);return _il_}
      catch(_im_)
       {_im_ = caml_wrap_exception(_im_);
        if(_im_ === Not_found)
         {var label=new_method(table);
          table[3] = caml_call3(Meths[4],name,label,table[3]);
          table[4] = caml_call3(Labs[4],label,1,table[4]);
          return label}
        throw _im_}}
    function get_method_labels(table,names)
     {return map$7(function(_ik_){return get_method_label(table,_ik_)},names)}
    function set_method(table,label,element)
     {method_count[1]++;
      return caml_call2(Labs[28],label,table[4])
              ?(resize$1(table,label + 1 | 0),
                caml_check_bound(table[2],label)[1 + label]
                =
                element,
                0)
              :(table[6] = [0,[0,label,element],table[6]],0)}
    function get_method(table,label)
     {try
       {var _ii_=assoc(label,table[6]);return _ii_}
      catch(_ij_)
       {_ij_ = caml_wrap_exception(_ij_);
        if(_ij_ === Not_found)
         return caml_check_bound(table[2],label)[1 + label];
        throw _ij_}}
    function to_list$3(arr){return 0 === arr?0:to_list$1(arr)}
    function narrow(table,vars,virt_meths,concr_meths)
     {var
       vars$0=to_list$3(vars),
       virt_meths$0=to_list$3(virt_meths),
       concr_meths$0=to_list$3(concr_meths),
       virt_meth_labs=
        map$4
         (function(_ih_){return get_method_label(table,_ih_)},virt_meths$0),
       concr_meth_labs=
        map$4
         (function(_ig_){return get_method_label(table,_ig_)},concr_meths$0);
      table[5]
      =
      [0,
       [0,table[3],table[4],table[6],table[7],virt_meth_labs,vars$0],
       table[5]];
      var _h9_=Vars[1],_h__=table[7];
      function _h$_(lab,info,tvars)
       {return mem(lab,vars$0)?caml_call3(Vars[4],lab,info,tvars):tvars}
      table[7] = caml_call3(Vars[13],_h$_,_h__,_h9_);
      var by_name=[0,Meths[1]],by_label=[0,Labs[1]];
      iter2$0
       (function(met,label)
         {by_name[1] = caml_call3(Meths[4],met,label,by_name[1]);
          var _ic_=by_label[1];
          try
           {var _ie_=caml_call2(Labs[28],label,table[4]),_id_=_ie_}
          catch(_if_)
           {_if_ = caml_wrap_exception(_if_);
            if(_if_ !== Not_found)throw _if_;
            var _id_=1}
          by_label[1] = caml_call3(Labs[4],label,_id_,_ic_);
          return 0},
        concr_meths$0,
        concr_meth_labs);
      iter2$0
       (function(met,label)
         {by_name[1] = caml_call3(Meths[4],met,label,by_name[1]);
          by_label[1] = caml_call3(Labs[4],label,0,by_label[1]);
          return 0},
        virt_meths$0,
        virt_meth_labs);
      table[3] = by_name[1];
      table[4] = by_label[1];
      var _ia_=0,_ib_=table[6];
      table[6]
      =
      fold_right
       (function(met,hm)
         {var lab=met[1];return mem(lab,virt_meth_labs)?hm:[0,met,hm]},
        _ib_,
        _ia_);
      return 0}
    function widen(table)
     {var
       match=hd(table[5]),
       vars=match[6],
       virt_meths=match[5],
       saved_vars=match[4],
       saved_hidden_meths=match[3],
       by_label=match[2],
       by_name=match[1];
      table[5] = tl(table[5]);
      table[7]
      =
      fold_left$0
       (function(s,v)
         {var _h8_=caml_call2(Vars[28],v,table[7]);
          return caml_call3(Vars[4],v,_h8_,s)},
        saved_vars,
        vars);
      table[3] = by_name;
      table[4] = by_label;
      var _h7_=table[6];
      table[6]
      =
      fold_right
       (function(met,hm)
         {var lab=met[1];return mem(lab,virt_meths)?hm:[0,met,hm]},
        _h7_,
        saved_hidden_meths);
      return 0}
    function new_slot(table)
     {var index=table[1];table[1] = index + 1 | 0;return index}
    function new_variable(table,name)
     {try
       {var _h5_=caml_call2(Vars[28],name,table[7]);return _h5_}
      catch(_h6_)
       {_h6_ = caml_wrap_exception(_h6_);
        if(_h6_ === Not_found)
         {var index=new_slot(table);
          if(caml_string_notequal(name,cst$93))
           table[7] = caml_call3(Vars[4],name,index,table[7]);
          return index}
        throw _h6_}}
    function to_array(arr){return caml_equal(arr,0)?[0]:arr}
    function new_methods_variables(table,meths,vals)
     {var
       meths$0=to_array(meths),
       nmeths=meths$0.length - 1,
       nvals=vals.length - 1,
       res=caml_make_vect(nmeths + nvals | 0,0),
       _hX_=nmeths - 1 | 0,
       _hW_=0;
      if(! (_hX_ < 0))
       {var i$0=_hW_;
        for(;;)
         {var
           _h3_=
            get_method_label(table,caml_check_bound(meths$0,i$0)[1 + i$0]);
          caml_check_bound(res,i$0)[1 + i$0] = _h3_;
          var _h4_=i$0 + 1 | 0;
          if(_hX_ !== i$0){var i$0=_h4_;continue}
          break}}
      var _hZ_=nvals - 1 | 0,_hY_=0;
      if(! (_hZ_ < 0))
       {var i=_hY_;
        for(;;)
         {var
           _h1_=i + nmeths | 0,
           _h0_=new_variable(table,caml_check_bound(vals,i)[1 + i]);
          caml_check_bound(res,_h1_)[1 + _h1_] = _h0_;
          var _h2_=i + 1 | 0;
          if(_hZ_ !== i){var i=_h2_;continue}
          break}}
      return res}
    function get_variable(table,name)
     {try
       {var _hU_=caml_call2(Vars[28],name,table[7]);return _hU_}
      catch(_hV_)
       {_hV_ = caml_wrap_exception(_hV_);
        if(_hV_ === Not_found)throw [0,Assert_failure,_cJ_];
        throw _hV_}}
    function get_variables(table,names)
     {return map$7(function(_hT_){return get_variable(table,_hT_)},names)}
    function add_initializer(table,f){table[8] = [0,f,table[8]];return 0}
    function create_table(public_methods)
     {if(0 === public_methods)return new_table([0]);
      var
       tags=map$7(public_method_label,public_methods),
       table=new_table(tags);
      iteri$3
       (function(i,met)
         {var lab=(i * 2 | 0) + 2 | 0;
          table[3] = caml_call3(Meths[4],met,lab,table[3]);
          table[4] = caml_call3(Labs[4],lab,1,table[4]);
          return 0},
        public_methods);
      return table}
    function init_class(table)
     {inst_var_count[1] = (inst_var_count[1] + table[1] | 0) - 1 | 0;
      table[8] = rev(table[8]);
      return resize$1
              (table,
               3 + ((caml_check_bound(table[2],1)[2] * 16 | 0) / 32 | 0) | 0)}
    function inherits(cla,vals,virt_meths,concr_meths,param,top)
     {var env=param[4],super$0=param[2];
      narrow(cla,vals,virt_meths,concr_meths);
      var init=top?caml_call2(super$0,cla,env):caml_call1(super$0,cla);
      widen(cla);
      var
       _hO_=0,
       _hP_=to_array(concr_meths),
       _hQ_=
        [0,
         map$7
          (function(nm){return get_method(cla,get_method_label(cla,nm))},_hP_),
         _hO_],
       _hR_=to_array(vals);
      return caml_array_concat
              ([0,
                [0,init],
                [0,
                 map$7(function(_hS_){return get_variable(cla,_hS_)},_hR_),
                 _hQ_]])}
    function make_class(pub_meths,class_init)
     {var table=create_table(pub_meths),env_init=caml_call1(class_init,table);
      init_class(table);
      return [0,caml_call1(env_init,0),class_init,env_init,0]}
    function make_class_store(pub_meths,class_init,init_table)
     {var table=create_table(pub_meths),env_init=caml_call1(class_init,table);
      init_class(table);
      init_table[2] = class_init;
      init_table[1] = env_init;
      return 0}
    function dummy_class(loc)
     {function undef(param){throw [0,Undefined_recursive_module,loc]}
      return [0,undef,undef,undef,0]}
    function create_object(table)
     {var obj=caml_obj_block(248,table[1]);
      obj[1] = table[2];
      return caml_set_oo_id(obj)}
    function create_object_opt(obj_0,table)
     {if(obj_0)return obj_0;
      var obj=caml_obj_block(248,table[1]);
      obj[1] = table[2];
      return caml_set_oo_id(obj)}
    function iter_f(obj,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var l=param$0[2],f=param$0[1];
          caml_call1(f,obj);
          var param$0=l;
          continue}
        return 0}}
    function run_initializers(obj,table)
     {var inits=table[8],_hN_=0 !== inits?1:0;
      return _hN_?iter_f(obj,inits):_hN_}
    function run_initializers_opt(obj_0,obj,table)
     {if(obj_0)return obj;
      var inits=table[8];
      if(0 !== inits)iter_f(obj,inits);
      return obj}
    function create_object_and_run_initiali(obj_0,table)
     {if(obj_0)return obj_0;
      var obj=create_object(table);
      run_initializers(obj,table);
      return obj}
    function get_data$0(param)
     {if(param)return param[2];throw [0,Assert_failure,_cN_]}
    function build_path(n,keys,tables)
     {var res=[0,0,0,0],r=[0,res],_hJ_=0;
      if(! (n < 0))
       {var i=_hJ_;
        for(;;)
         {var _hL_=r[1];
          r[1] = [0,caml_check_bound(keys,i)[1 + i],_hL_,0];
          var _hM_=i + 1 | 0;
          if(n !== i){var i=_hM_;continue}
          break}}
      var _hK_=r[1];
      if(tables){tables[2] = _hK_;return res}
      throw [0,Assert_failure,_cK_]}
    function lookup_tables(root,keys)
     {var tables$2=get_data$0(root);
      if(tables$2)
       {var i$1=keys.length - 1 - 1 | 0,i=i$1,tables=tables$2;
        a:
        for(;;)
         {if(0 <= i)
           {var key=caml_check_bound(keys,i)[1 + i],tables$0=tables;
            for(;;)
             {if(tables$0)
               {if(tables$0[1] === key)
                 {var tables$1=get_data$0(tables$0);
                  if(tables$1)
                   {var i$0=i - 1 | 0,i=i$0,tables=tables$1;continue a}
                  throw [0,Assert_failure,_cP_]}
                if(tables$0)
                 {var _hI_=tables$0[3];
                  if(_hI_){var tables$0=_hI_;continue}
                  var v=[0,key,0,0];
                  if(tables$0)
                   {tables$0[3] = v;return build_path(i - 1 | 0,keys,v)}
                  throw [0,Assert_failure,_cL_]}
                throw [0,Assert_failure,_cO_]}
              throw [0,Assert_failure,_cM_]}}
          return tables}}
      return build_path(keys.length - 1 - 1 | 0,keys,root)}
    function new_cache(table)
     {var n=new_method(table),switch$0=0;
      if
       (0
        !==
        (n % 2 | 0)
        &&
        !
        ((2 + ((caml_check_bound(table[2],1)[2] * 16 | 0) / 32 | 0) | 0) < n))
       {var n$0=new_method(table);switch$0 = 1}
      if(! switch$0)var n$0=n;
      caml_check_bound(table[2],n$0)[1 + n$0] = 0;
      return n$0}
    function set_methods(table,methods)
     {var len=methods.length - 1,i=[0,0];
      for(;;)
       {if(i[1] < len)
         {var
           _hC_=i[1],
           label=caml_check_bound(methods,_hC_)[1 + _hC_],
           next=
            function(param)
             {i[1]++;
              var _hH_=i[1];
              return caml_check_bound(methods,_hH_)[1 + _hH_]},
           clo=next(0);
          if(typeof clo === "number")
           switch(clo)
            {case 0:
              var
               x=next(0),
               clo$0=function(x){return function(obj){return x}}(x);
              break;
             case 1:
              var
               n=next(0),
               clo$0=function(n){return function(obj){return obj[1 + n]}}(n);
              break;
             case 2:
              var
               e=next(0),
               n$0=next(0),
               clo$0=
                function(e,n){return function(obj){return obj[1 + e][1 + n]}}
                 (e,n$0);
              break;
             case 3:
              var
               n$1=next(0),
               clo$0=
                function(n)
                  {return function(obj){return caml_call1(obj[1][1 + n],obj)}}
                 (n$1);
              break;
             case 4:
              var
               n$2=next(0),
               clo$0=
                function(n){return function(obj,x){obj[1 + n] = x;return 0}}
                 (n$2);
              break;
             case 5:
              var
               f=next(0),
               x$0=next(0),
               clo$0=
                function(f,x){return function(obj){return caml_call1(f,x)}}
                 (f,x$0);
              break;
             case 6:
              var
               f$0=next(0),
               n$3=next(0),
               clo$0=
                function(f,n)
                  {return function(obj){return caml_call1(f,obj[1 + n])}}
                 (f$0,n$3);
              break;
             case 7:
              var
               f$1=next(0),
               e$0=next(0),
               n$4=next(0),
               clo$0=
                function(f,e,n)
                  {return function(obj)
                    {return caml_call1(f,obj[1 + e][1 + n])}}
                 (f$1,e$0,n$4);
              break;
             case 8:
              var
               f$2=next(0),
               n$5=next(0),
               clo$0=
                function(f,n)
                  {return function(obj)
                    {return caml_call1(f,caml_call1(obj[1][1 + n],obj))}}
                 (f$2,n$5);
              break;
             case 9:
              var
               f$3=next(0),
               x$1=next(0),
               y=next(0),
               clo$0=
                function(f,x,y)
                  {return function(obj){return caml_call2(f,x,y)}}
                 (f$3,x$1,y);
              break;
             case 10:
              var
               f$4=next(0),
               x$2=next(0),
               n$6=next(0),
               clo$0=
                function(f,x,n)
                  {return function(obj){return caml_call2(f,x,obj[1 + n])}}
                 (f$4,x$2,n$6);
              break;
             case 11:
              var
               f$5=next(0),
               x$3=next(0),
               e$1=next(0),
               n$7=next(0),
               clo$0=
                function(f,x,e,n)
                  {return function(obj)
                    {return caml_call2(f,x,obj[1 + e][1 + n])}}
                 (f$5,x$3,e$1,n$7);
              break;
             case 12:
              var
               f$6=next(0),
               x$4=next(0),
               n$8=next(0),
               clo$0=
                function(f,x,n)
                  {return function(obj)
                    {return caml_call2(f,x,caml_call1(obj[1][1 + n],obj))}}
                 (f$6,x$4,n$8);
              break;
             case 13:
              var
               f$7=next(0),
               n$9=next(0),
               x$5=next(0),
               clo$0=
                function(f,n,x)
                  {return function(obj){return caml_call2(f,obj[1 + n],x)}}
                 (f$7,n$9,x$5);
              break;
             case 14:
              var
               f$8=next(0),
               e$2=next(0),
               n$10=next(0),
               x$6=next(0),
               clo$0=
                function(f,e,n,x)
                  {return function(obj)
                    {return caml_call2(f,obj[1 + e][1 + n],x)}}
                 (f$8,e$2,n$10,x$6);
              break;
             case 15:
              var
               f$9=next(0),
               n$11=next(0),
               x$7=next(0),
               clo$0=
                function(f,n,x)
                  {return function(obj)
                    {return caml_call2(f,caml_call1(obj[1][1 + n],obj),x)}}
                 (f$9,n$11,x$7);
              break;
             case 16:
              var
               n$12=next(0),
               x$8=next(0),
               clo$0=
                function(n,x)
                  {return function(obj)
                    {return caml_call2(obj[1][1 + n],obj,x)}}
                 (n$12,x$8);
              break;
             case 17:
              var
               n$13=next(0),
               m=next(0),
               clo$0=
                function(n,m)
                  {return function(obj)
                    {return caml_call2(obj[1][1 + n],obj,obj[1 + m])}}
                 (n$13,m);
              break;
             case 18:
              var
               n$14=next(0),
               e$3=next(0),
               m$0=next(0),
               clo$0=
                function(n,e,m)
                  {return function(obj)
                    {return caml_call2(obj[1][1 + n],obj,obj[1 + e][1 + m])}}
                 (n$14,e$3,m$0);
              break;
             case 19:
              var
               n$15=next(0),
               m$1=next(0),
               clo$0=
                function(n,m)
                  {return function(obj)
                    {var _hF_=caml_call1(obj[1][1 + m],obj);
                     return caml_call2(obj[1][1 + n],obj,_hF_)}}
                 (n$15,m$1);
              break;
             case 20:
              var m$2=next(0),x$9=next(0);
              new_cache(table);
              var
               clo$0=
                function(m,x)
                  {return function(obj)
                    {return caml_call1(caml_get_public_method(x,m,0),x)}}
                 (m$2,x$9);
              break;
             case 21:
              var m$3=next(0),n$16=next(0);
              new_cache(table);
              var
               clo$0=
                function(m,n)
                  {return function(obj)
                    {var _hE_=obj[1 + n];
                     return caml_call1(caml_get_public_method(_hE_,m,0),_hE_)}}
                 (m$3,n$16);
              break;
             case 22:
              var m$4=next(0),e$4=next(0),n$17=next(0);
              new_cache(table);
              var
               clo$0=
                function(m,e,n)
                  {return function(obj)
                    {var _hD_=obj[1 + e][1 + n];
                     return caml_call1(caml_get_public_method(_hD_,m,0),_hD_)}}
                 (m$4,e$4,n$17);
              break;
             default:
              var m$5=next(0),n$18=next(0);
              new_cache(table);
              var
               clo$0=
                function(m,n)
                  {return function(obj)
                    {var _hG_=caml_call1(obj[1][1 + n],obj);
                     return caml_call1(caml_get_public_method(_hG_,m,0),_hG_)}}
                 (m$5,n$18)}
          else
           var clo$0=clo;
          set_method(table,label,clo$0);
          i[1]++;
          continue}
        return 0}}
    function stats$0(param)
     {return [0,table_count[1],method_count[1],inst_var_count[1]]}
    var
     CamlinternalOO=
      [0,
       public_method_label,
       new_method,
       new_variable,
       new_methods_variables,
       get_variable,
       get_variables,
       get_method_label,
       get_method_labels,
       get_method,
       set_method,
       set_methods,
       narrow,
       widen,
       add_initializer,
       dummy_table,
       create_table,
       init_class,
       inherits,
       make_class,
       make_class_store,
       dummy_class,
       copy$7,
       create_object,
       create_object_opt,
       run_initializers,
       run_initializers_opt,
       create_object_and_run_initiali,
       lookup_tables,
       params$0,
       stats$0];
    caml_register_global(821,CamlinternalOO,"CamlinternalOO");
    var Stdlib_Oo=[0,copy$7,public_method_label,public_method_label];
    caml_register_global(822,Stdlib_Oo,"Stdlib__Oo");
    function init_mod_block(loc,comps$0)
     {var
       length=comps$0.length - 1,
       modu=caml_obj_block(0,length),
       _hy_=length - 1 | 0,
       _hx_=0;
      if(! (_hy_ < 0))
       {var i=_hx_;
        for(;;)
         {var shape=caml_check_bound(comps$0,i)[1 + i];
          if(typeof shape === "number")
           switch(shape)
            {case 0:
              var
               fn$0=
                function(i)
                 {function fn(x)
                   {var fn$0=modu[1 + i];
                    if(fn === fn$0)throw [0,Undefined_recursive_module,loc];
                    return caml_call1(fn$0,x)}
                  return fn},
               fn=fn$0(i),
               init=fn;
              break;
             case 1:
              var l=[];
              runtime.caml_update_dummy
               (l,
                [246,
                 function(l,i)
                   {return function(_hA_)
                     {var l$0=modu[1 + i];
                      if(l === l$0)throw [0,Undefined_recursive_module,loc];
                      var _hB_=caml_obj_tag(l$0);
                      return 250 === _hB_
                              ?l$0[1]
                              :246 === _hB_?force_lazy_block(l$0):l$0}}
                  (l,i)]);
              var init=l;
              break;
             default:var init=dummy_class(loc)}
          else
           if(0 === shape[0])
            var comps=shape[1],init=init_mod_block(loc,comps);
           else
            var v=shape[1],init=v;
          modu[1 + i] = init;
          var _hz_=i + 1 | 0;
          if(_hy_ !== i){var i=_hz_;continue}
          break}}
      return modu}
    function init_mod(loc,shape)
     {if(typeof shape !== "number" && 0 === shape[0])
       {var comps=shape[1];return init_mod_block(loc,comps)}
      return failwith(cst_CamlinternalMod_init_mod_n)}
    function update_mod_block(comps$0,o,n)
     {if(0 === caml_obj_tag(n) && comps$0.length - 1 <= n.length - 1)
       {var _hv_=comps$0.length - 1 - 1 | 0,_hu_=0;
        if(! (_hv_ < 0))
         {var i=_hu_;
          for(;;)
           {var n$0=n[1 + i],shape=caml_check_bound(comps$0,i)[1 + i];
            if(typeof shape === "number")
             if(2 === shape)
              {var switch$0=0;
               if(0 === caml_obj_tag(n$0) && 4 === n$0.length - 1)
                {var cl=o[1 + i],j=0;
                 for(;;)
                  {cl[1 + j] = n$0[1 + j];
                   var _ht_=j + 1 | 0;
                   if(3 !== j){var j=_ht_;continue}
                   break}}
               else
                switch$0 = 1;
               if(switch$0)throw [0,Assert_failure,_cQ_]}
             else
              o[1 + i] = n$0;
            else
             if(0 === shape[0])
              {var comps=shape[1];update_mod_block(comps,o[1 + i],n$0)}
            var _hw_=i + 1 | 0;
            if(_hv_ !== i){var i=_hw_;continue}
            break}}
        return 0}
      throw [0,Assert_failure,_cR_]}
    function update_mod(shape,o,n)
     {if(typeof shape !== "number" && 0 === shape[0])
       {var comps=shape[1];return update_mod_block(comps,o,n)}
      return failwith(cst_CamlinternalMod_update_mod)}
    var CamlinternalMod=[0,init_mod,update_mod];
    caml_register_global(823,CamlinternalMod,"CamlinternalMod");
    var
     initial_buffer=caml_create_bytes(32),
     buffer=[0,initial_buffer],
     bufpos=[0,0];
    function reset_buffer(param)
     {buffer[1] = initial_buffer;bufpos[1] = 0;return 0}
    function store(c)
     {if(caml_ml_bytes_length(buffer[1]) <= bufpos[1])
       {var newbuffer=caml_create_bytes(2 * bufpos[1] | 0);
        blit(buffer[1],0,newbuffer,0,bufpos[1]);
        buffer[1] = newbuffer}
      caml_bytes_set(buffer[1],bufpos[1],c);
      bufpos[1]++;
      return 0}
    function get_string(param)
     {var s=sub_string(buffer[1],0,bufpos[1]);
      buffer[1] = initial_buffer;
      return s}
    function make_lexer(keywords)
     {var kwd_table=caml_call2(Stdlib_Hashtbl[1],0,17);
      iter$2
       (function(s){return caml_call3(Stdlib_Hashtbl[5],kwd_table,s,[0,s])},
        keywords);
      function ident_or_keyword(id)
       {try
         {var _hr_=caml_call2(Stdlib_Hashtbl[6],kwd_table,id);return _hr_}
        catch(_hs_)
         {_hs_ = caml_wrap_exception(_hs_);
          if(_hs_ === Not_found)return [1,id];
          throw _hs_}}
      function keyword_or_error(c)
       {var s=make$1(1,c);
        try
         {var _hp_=caml_call2(Stdlib_Hashtbl[6],kwd_table,s);return _hp_}
        catch(_hq_)
         {_hq_ = caml_wrap_exception(_hq_);
          if(_hq_ === Not_found)throw [0,Error,cat(cst_Illegal_character,s)];
          throw _hq_}}
      function comment(strm)
       {a:
        for(;;)
         {var match=peek$0(strm);
          if(match)
           {var switcher=match[1] - 40 | 0;
            if(! (2 < switcher >>> 0))
             switch(switcher)
              {case 0:
                junk(strm);
                var match$0=peek$0(strm);
                if(match$0)
                 {if(42 === match$0[1]){junk(strm);comment(strm);continue}
                  junk(strm);
                  continue}
                throw Failure$0;
               case 1:break;
               default:
                junk(strm);
                for(;;)
                 {var match$1=peek$0(strm);
                  if(match$1)
                   {var _ho_=match$1[1];
                    if(41 === _ho_){junk(strm);return 0}
                    if(42 === _ho_){junk(strm);continue}
                    junk(strm);
                    continue a}
                  throw Failure$0}}
            junk(strm);
            continue}
          throw Failure$0}}
      function escape(strm)
       {var match=peek$0(strm);
        if(match)
         {var _hl_=match[1];
          if(58 <= _hl_)
           {var switcher=_hl_ - 110 | 0;
            if(! (6 < switcher >>> 0))
             switch(switcher)
              {case 0:junk(strm);return 10;
               case 4:junk(strm);return 13;
               case 6:junk(strm);return 9
               }}
          else
           if(48 <= _hl_)
            {junk(strm);
             var match$0=peek$0(strm);
             if(match$0)
              {var _hm_=match$0[1];
               if(! (9 < _hm_ - 48 >>> 0))
                {junk(strm);
                 var match$1=peek$0(strm);
                 if(match$1)
                  {var _hn_=match$1[1];
                   if(! (9 < _hn_ - 48 >>> 0))
                    {junk(strm);
                     return chr
                             ((((_hl_ - 48 | 0) * 100 | 0)
                               +
                               ((_hm_ - 48 | 0) * 10 | 0)
                               |
                               0)
                              +
                              (_hn_ - 48 | 0)
                              |
                              0)}}
                 throw [0,Error,cst$99]}}
             throw [0,Error,cst$98]}
          junk(strm);
          return _hl_}
        throw Failure$0}
      function end_exponent_part(strm)
       {for(;;)
         {var match=peek$0(strm);
          if(match)
           {var _hk_=match[1];
            if(! (9 < _hk_ - 48 >>> 0)){junk(strm);store(_hk_);continue}}
          return [0,[3,caml_float_of_string(get_string(0))]]}}
      function exponent_part(strm)
       {var match=peek$0(strm);
        if(match)
         {var _hj_=match[1],switch$0=0;
          if(43 !== _hj_ && 45 !== _hj_)switch$0 = 1;
          if(! switch$0)
           {junk(strm);store(_hj_);return end_exponent_part(strm)}}
        return end_exponent_part(strm)}
      function number(s)
       {for(;;)
         {var match=peek$0(s);
          if(match)
           {var _hg_=match[1];
            if(58 <= _hg_)
             {var switch$0=0;
              if(69 === _hg_ || 101 === _hg_)switch$0 = 1;
              if(switch$0){junk(s);store(69);return exponent_part(s)}}
            else
             {if(46 === _hg_)
               {junk(s);
                store(46);
                for(;;)
                 {var match$0=peek$0(s);
                  if(match$0)
                   {var _hh_=match$0[1],_hi_=_hh_ - 69 | 0;
                    if(32 < _hi_ >>> 0)
                     {if(! (9 < _hi_ + 21 >>> 0)){junk(s);store(_hh_);continue}}
                    else
                     if(30 < _hi_ - 1 >>> 0)
                      {junk(s);store(69);return exponent_part(s)}}
                  return [0,[3,caml_float_of_string(get_string(0))]]}}
              if(48 <= _hg_){junk(s);store(_hg_);continue}}}
          return [0,[2,caml_int_of_string(get_string(0))]]}}
      function ident2(strm)
       {for(;;)
         {var match=peek$0(strm);
          if(match)
           {var _he_=match[1],switch$0=0;
            if(94 <= _he_)
             {var _hf_=_he_ - 95 | 0;
              if(30 < _hf_ >>> 0)
               {if(! (32 <= _hf_))switch$0 = 1}
              else
               if(29 === _hf_)switch$0 = 1}
            else
             if(65 <= _he_)
              {if(92 === _he_)switch$0 = 1}
             else
              if(33 <= _he_)
               switch(_he_ - 33 | 0)
                {case 0:
                 case 2:
                 case 3:
                 case 4:
                 case 5:
                 case 9:
                 case 10:
                 case 12:
                 case 14:
                 case 25:
                 case 27:
                 case 28:
                 case 29:
                 case 30:
                 case 31:switch$0 = 1;break
                 }
            if(switch$0){junk(strm);store(_he_);continue}}
          return [0,ident_or_keyword(get_string(0))]}}
      function neg_number(s)
       {var match=peek$0(s);
        if(match)
         {var _hd_=match[1];
          if(! (9 < _hd_ - 48 >>> 0))
           {junk(s);reset_buffer(0);store(45);store(_hd_);return number(s)}}
        reset_buffer(0);
        store(45);
        return ident2(s)}
      function ident(strm)
       {for(;;)
         {var match=peek$0(strm);
          if(match)
           {var _hb_=match[1],switch$0=0;
            if(91 <= _hb_)
             {var _hc_=_hb_ - 95 | 0;
              if(27 < _hc_ >>> 0)
               {if(97 <= _hc_)switch$0 = 1}
              else
               if(1 !== _hc_)switch$0 = 1}
            else
             if(48 <= _hb_)
              {if(6 < _hb_ - 58 >>> 0)switch$0 = 1}
             else
              if(39 === _hb_)switch$0 = 1;
            if(switch$0){junk(strm);store(_hb_);continue}}
          return [0,ident_or_keyword(get_string(0))]}}
      function next_token$0(counter,strm)
       {for(;;)
         {var match=peek$0(strm);
          if(match)
           {var _g3_=match[1],switch$0=0;
            if(124 <= _g3_)
             {if(127 <= _g3_)
               {if(192 <= _g3_)switch$0 = 1}
              else
               if(125 !== _g3_)switch$0 = 2}
            else
             {var _g4_=_g3_ - 65 | 0;
              if(57 < _g4_ >>> 0)
               {if(! (58 <= _g4_))
                 switch(_g4_ + 65 | 0)
                  {case 34:
                    junk(strm);
                    reset_buffer(0);
                    for(;;)
                     {var match$1=peek$0(strm);
                      if(match$1)
                       {var _g6_=match$1[1];
                        if(34 === _g6_){junk(strm);return [0,[4,get_string(0)]]}
                        if(92 === _g6_)
                         {junk(strm);
                          try
                           {var c$0=escape(strm)}
                          catch(_ha_)
                           {_ha_ = caml_wrap_exception(_ha_);
                            if(_ha_ === Failure$0)throw [0,Error,cst$96];
                            throw _ha_;
                            var _g9_=_ha_}
                          store(c$0);
                          continue}
                        junk(strm);
                        store(_g6_);
                        continue}
                      throw Failure$0}
                   case 39:
                    junk(strm);
                    try
                     {var match$2=peek$0(strm);
                      if(! match$2)throw Failure$0;
                      var _g7_=match$2[1];
                      if(92 === _g7_)
                       {junk(strm);
                        try
                         {var _g8_=escape(strm)}
                        catch(_g$_)
                         {_g$_ = caml_wrap_exception(_g$_);
                          if(_g$_ === Failure$0)throw [0,Error,cst$97];
                          throw _g$_}
                        var c=_g8_}
                      else
                       {junk(strm);var c=_g7_}}
                    catch(_g__)
                     {_g__ = caml_wrap_exception(_g__);
                      if(_g__ === Failure$0)throw [0,Error,cst$94];
                      throw _g__}
                    var match$0=peek$0(strm);
                    if(match$0 && 39 === match$0[1])
                     {junk(strm);return [0,[5,c]]}
                    throw [0,Error,cst$95];
                   case 40:
                    junk(strm);
                    if(counter < 50)
                     {var counter$0=counter + 1 | 0;
                      return maybe_comment(counter$0,strm)}
                    return caml_trampoline_return(maybe_comment,[0,strm]);
                   case 45:junk(strm);return neg_number(strm);
                   case 9:
                   case 10:
                   case 12:
                   case 13:
                   case 26:
                   case 32:junk(strm);continue;
                   case 48:
                   case 49:
                   case 50:
                   case 51:
                   case 52:
                   case 53:
                   case 54:
                   case 55:
                   case 56:
                   case 57:
                    junk(strm);reset_buffer(0);store(_g3_);return number(strm);
                   case 33:
                   case 35:
                   case 36:
                   case 37:
                   case 38:
                   case 42:
                   case 43:
                   case 47:
                   case 58:
                   case 60:
                   case 61:
                   case 62:
                   case 63:
                   case 64:switch$0 = 2;break
                   }}
              else
               {var _g5_=_g4_ - 26 | 0;
                if(5 < _g5_ >>> 0)
                 switch$0 = 1;
                else
                 switch(_g5_)
                  {case 4:switch$0 = 1;break;case 1:case 3:switch$0 = 2;break}}}
            switch(switch$0)
             {case 0:junk(strm);return [0,keyword_or_error(_g3_)];
              case 1:
               junk(strm);reset_buffer(0);store(_g3_);return ident(strm);
              default:
               junk(strm);reset_buffer(0);store(_g3_);return ident2(strm)}}
          return 0}}
      function maybe_comment(counter,strm)
       {var match=peek$0(strm);
        if(match && 42 === match[1])
         {junk(strm);
          comment(strm);
          if(counter < 50)
           {var counter$0=counter + 1 | 0;return next_token$0(counter$0,strm)}
          return caml_trampoline_return(next_token$0,[0,strm])}
        return [0,keyword_or_error(40)]}
      function next_token(strm){return caml_trampoline(next_token$0(0,strm))}
      return function(input)
       {return from(function(count){return next_token(input)})}}
    var Stdlib_Genlex=[0,make_lexer];
    caml_register_global(824,Stdlib_Genlex,"Stdlib__Genlex");
    function MakeSeeded$0(H)
     {var prng=[246,function(_g2_){return caml_call1(_ci_[2],0)}];
      function create(opt,initial_size)
       {if(opt)
         var sth=opt[1],random=sth;
        else
         var random=caml_call1(Stdlib_Hashtbl[17],0);
        var x=16;
        for(;;)
         {if(! (initial_size <= x) && ! (max_array_length < (x * 2 | 0)))
           {var x$0=x * 2 | 0,x=x$0;continue}
          if(random)
           var
            _g0_=caml_obj_tag(prng),
            _g1_=250 === _g0_?prng[1]:246 === _g0_?force_lazy_block(prng):prng,
            seed=caml_call1(_ci_[4],_g1_);
          else
           var seed=0;
          return [0,0,caml_make_vect(x,0),seed,x]}}
      function clear(h)
       {h[1] = 0;
        var len=h[2].length - 1,_gY_=len - 1 | 0,_gX_=0;
        if(! (_gY_ < 0))
         {var i=_gX_;
          for(;;)
           {caml_check_bound(h[2],i)[1 + i] = 0;
            var _gZ_=i + 1 | 0;
            if(_gY_ !== i){var i=_gZ_;continue}
            break}}
        return 0}
      function reset(h)
       {var len=h[2].length - 1;
        return len === h[4]
                ?clear(h)
                :(h[1] = 0,h[2] = caml_make_vect(h[4],0),0)}
      function copy(init)
       {var _gU_=init[4],_gV_=init[3],_gW_=copy$1(init[2]);
        return [0,init[1],_gW_,_gV_,_gU_]}
      function key_index(h,hkey){return hkey & (h[2].length - 1 - 1 | 0)}
      function clean(h)
       {function do_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var hkey=param$0[1],rest=param$0[3],c=param$0[2];
              if(caml_call1(H[7],c))
               {var rest$0=param$0[3],c$0=param$0[2];
                return [0,hkey,c$0,do_bucket(rest$0)]}
              h[1] = h[1] - 1 | 0;
              var param$0=rest;
              continue}
            return 0}}
        var d=h[2],_gR_=d.length - 1 - 1 | 0,_gQ_=0;
        if(! (_gR_ < 0))
         {var i=_gQ_;
          for(;;)
           {var _gS_=do_bucket(caml_check_bound(d,i)[1 + i]);
            caml_check_bound(d,i)[1 + i] = _gS_;
            var _gT_=i + 1 | 0;
            if(_gR_ !== i){var i=_gT_;continue}
            break}}
        return 0}
      function resize(h)
       {var odata=h[2],osize=odata.length - 1,nsize=osize * 2 | 0;
        clean(h);
        var
         _gJ_=nsize < max_array_length?1:0,
         _gK_=_gJ_?(osize >>> 1 | 0) <= h[1]?1:0:_gJ_;
        if(_gK_)
         {var ndata=caml_make_vect(nsize,0);
          h[2] = ndata;
          var
           insert_bucket=
            function(param)
             {if(param)
               {var rest=param[3],data=param[2],hkey=param[1];
                insert_bucket(rest);
                var
                 nidx=key_index(h,hkey),
                 _gP_=[0,hkey,data,caml_check_bound(ndata,nidx)[1 + nidx]];
                caml_check_bound(ndata,nidx)[1 + nidx] = _gP_;
                return 0}
              return 0},
           _gM_=osize - 1 | 0,
           _gL_=0;
          if(! (_gM_ < 0))
           {var i=_gL_;
            for(;;)
             {insert_bucket(caml_check_bound(odata,i)[1 + i]);
              var _gO_=i + 1 | 0;
              if(_gM_ !== i){var i=_gO_;continue}
              break}}
          var _gN_=0}
        else
         var _gN_=_gK_;
        return _gN_}
      function add(h,key,info)
       {var
         hkey=caml_call2(H[2],h[3],key),
         i=key_index(h,hkey),
         container=caml_call2(H[1],key,info),
         bucket=[0,hkey,container,caml_check_bound(h[2],i)[1 + i]];
        caml_check_bound(h[2],i)[1 + i] = bucket;
        h[1] = h[1] + 1 | 0;
        var _gI_=h[2].length - 1 << 1 < h[1]?1:0;
        return _gI_?resize(h):_gI_}
      function remove(h,key)
       {var hkey=caml_call2(H[2],h[3],key);
        function remove_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var hk=param$0[1],next=param$0[3],c=param$0[2];
              if(hkey === hk)
               {var match=caml_call2(H[3],c,key);
                switch(match)
                 {case 0:h[1] = h[1] - 1 | 0;return next;
                  case 1:return [0,hk,c,remove_bucket(next)];
                  default:h[1] = h[1] - 1 | 0;var param$0=next;continue}}
              var next$0=param$0[3],c$0=param$0[2];
              return [0,hk,c$0,remove_bucket(next$0)]}
            return 0}}
        var
         i=key_index(h,hkey),
         _gH_=remove_bucket(caml_check_bound(h[2],i)[1 + i]);
        caml_check_bound(h[2],i)[1 + i] = _gH_;
        return 0}
      function find(h,key)
       {var
         hkey=caml_call2(H[2],h[3],key),
         _gG_=key_index(h,hkey),
         param$1=caml_check_bound(h[2],_gG_)[1 + _gG_],
         param=param$1;
        for(;;)
         {if(param)
           {var hk=param[1],rest=param[3],c=param[2];
            if(hkey === hk)
             {var match=caml_call2(H[3],c,key);
              switch(match)
               {case 0:
                 var match$0=caml_call1(H[4],c);
                 if(match$0){var d=match$0[1];return d}
                 var param=rest;
                 continue;
                case 1:var param=rest;continue;
                default:var param=rest;continue}}
            var param$0=param[3],param=param$0;
            continue}
          throw Not_found}}
      function find_opt(h,key)
       {var
         hkey=caml_call2(H[2],h[3],key),
         _gF_=key_index(h,hkey),
         param$1=caml_check_bound(h[2],_gF_)[1 + _gF_],
         param=param$1;
        for(;;)
         {if(param)
           {var hk=param[1],rest=param[3],c=param[2];
            if(hkey === hk)
             {var match=caml_call2(H[3],c,key);
              switch(match)
               {case 0:
                 var d=caml_call1(H[4],c);
                 if(d)return d;
                 var param=rest;
                 continue;
                case 1:var param=rest;continue;
                default:var param=rest;continue}}
            var param$0=param[3],param=param$0;
            continue}
          return 0}}
      function find_all(h,key)
       {var hkey=caml_call2(H[2],h[3],key);
        function find_in_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var hk=param$0[1],rest=param$0[3],c=param$0[2];
              if(hkey === hk)
               {var match=caml_call2(H[3],c,key);
                switch(match)
                 {case 0:
                   var match$0=caml_call1(H[4],c);
                   if(match$0)
                    {var d=match$0[1];return [0,d,find_in_bucket(rest)]}
                   var param$0=rest;
                   continue;
                  case 1:var param$0=rest;continue;
                  default:var param$0=rest;continue}}
              var param$1=param$0[3],param$0=param$1;
              continue}
            return 0}}
        var _gE_=key_index(h,hkey);
        return find_in_bucket(caml_check_bound(h[2],_gE_)[1 + _gE_])}
      function replace(h,key,info)
       {var hkey=caml_call2(H[2],h[3],key);
        function replace_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var hk=param$0[1],next=param$0[3],c=param$0[2];
              if(hkey === hk)
               {var match=caml_call2(H[3],c,key);
                if(match){var param$0=next;continue}
                return caml_call3(H[6],c,key,info)}
              var param$1=param$0[3],param$0=param$1;
              continue}
            throw Not_found}}
        var i=key_index(h,hkey),l=caml_check_bound(h[2],i)[1 + i];
        try
         {var _gC_=replace_bucket(l);return _gC_}
        catch(_gD_)
         {_gD_ = caml_wrap_exception(_gD_);
          if(_gD_ === Not_found)
           {var container=caml_call2(H[1],key,info);
            caml_check_bound(h[2],i)[1 + i] = [0,hkey,container,l];
            h[1] = h[1] + 1 | 0;
            var _gB_=h[2].length - 1 << 1 < h[1]?1:0;
            return _gB_?resize(h):_gB_}
          throw _gD_}}
      function mem(h,key)
       {var
         hkey=caml_call2(H[2],h[3],key),
         _gA_=key_index(h,hkey),
         param$1=caml_check_bound(h[2],_gA_)[1 + _gA_],
         param=param$1;
        for(;;)
         {if(param)
           {var hk=param[1],rest=param[3],c=param[2];
            if(hk === hkey)
             {var match=caml_call2(H[3],c,key);
              if(match){var param=rest;continue}
              return 1}
            var param$0=param[3],param=param$0;
            continue}
          return 0}}
      function iter$0(f,h)
       {var d$0=h[2],_gy_=d$0.length - 1 - 1 | 0,_gx_=0;
        if(! (_gy_ < 0))
         {var i=_gx_;
          a:
          for(;;)
           {var param$0=caml_check_bound(d$0,i)[1 + i],param=param$0;
            for(;;)
             {if(param)
               {var
                 rest=param[3],
                 c=param[2],
                 match=caml_call1(H[5],c),
                 match$0=caml_call1(H[4],c),
                 switch$0=0;
                if(match && match$0)
                 {var d=match$0[1],k=match[1];caml_call2(f,k,d);switch$0 = 1}
                var param=rest;
                continue}
              var _gz_=i + 1 | 0;
              if(_gy_ !== i){var i=_gz_;continue a}
              break}
            break}}
        return 0}
      function fold(f,h,init)
       {var d$0=h[2],accu$1=[0,init],_gu_=d$0.length - 1 - 1 | 0,_gt_=0;
        if(! (_gu_ < 0))
         {var i=_gt_;
          a:
          for(;;)
           {var
             _gv_=accu$1[1],
             b$0=caml_check_bound(d$0,i)[1 + i],
             b=b$0,
             accu=_gv_;
            for(;;)
             {if(b)
               {var
                 rest=b[3],
                 c=b[2],
                 match=caml_call1(H[5],c),
                 match$0=caml_call1(H[4],c),
                 switch$0=0;
                if(match && match$0)
                 {var d=match$0[1],k=match[1],accu$0=caml_call3(f,k,d,accu);
                  switch$0 = 1}
                if(! switch$0)var accu$0=accu;
                var b=rest,accu=accu$0;
                continue}
              accu$1[1] = accu;
              var _gw_=i + 1 | 0;
              if(_gu_ !== i){var i=_gw_;continue a}
              break}
            break}}
        return accu$1[1]}
      function filter_map_inplace(f,h)
       {function do_bucket(param)
         {var param$0=param;
          for(;;)
           {if(param$0)
             {var
               rest=param$0[3],
               c=param$0[2],
               hk=param$0[1],
               match=caml_call1(H[5],c),
               match$0=caml_call1(H[4],c);
              if(match && match$0)
               {var d=match$0[1],k=match[1],match$1=caml_call2(f,k,d);
                if(match$1)
                 {var new_d=match$1[1];
                  caml_call3(H[6],c,k,new_d);
                  return [0,hk,c,do_bucket(rest)]}
                var param$0=rest;
                continue}
              var param$0=rest;
              continue}
            return 0}}
        var d=h[2],_gq_=d.length - 1 - 1 | 0,_gp_=0;
        if(! (_gq_ < 0))
         {var i=_gp_;
          for(;;)
           {var _gr_=do_bucket(caml_check_bound(d,i)[1 + i]);
            caml_check_bound(d,i)[1 + i] = _gr_;
            var _gs_=i + 1 | 0;
            if(_gq_ !== i){var i=_gs_;continue}
            break}}
        return 0}
      function length(h){return h[1]}
      function bucket_length(accu,param)
       {var accu$0=accu,param$0=param;
        for(;;)
         {if(param$0)
           {var
             param$1=param$0[3],
             accu$1=accu$0 + 1 | 0,
             accu$0=accu$1,
             param$0=param$1;
            continue}
          return accu$0}}
      function stats(h)
       {var
         _gl_=h[2],
         _gm_=0,
         mbl=
          fold_left$3
           (function(m,b){return max$1(m,bucket_length(0,b))},_gm_,_gl_),
         histo=caml_make_vect(mbl + 1 | 0,0),
         _gn_=h[2];
        iter$5
         (function(b)
           {var
             l=bucket_length(0,b),
             _go_=caml_check_bound(histo,l)[1 + l] + 1 | 0;
            caml_check_bound(histo,l)[1 + l] = _go_;
            return 0},
          _gn_);
        return [0,h[1],h[2].length - 1,mbl,histo]}
      function bucket_length_alive(accu,param)
       {var accu$0=accu,param$0=param;
        for(;;)
         {if(param$0)
           {var rest=param$0[3],c=param$0[2];
            if(caml_call1(H[7],c))
             {var accu$1=accu$0 + 1 | 0,accu$0=accu$1,param$0=rest;continue}
            var param$1=param$0[3],param$0=param$1;
            continue}
          return accu$0}}
      function stats_alive(h)
       {var
         size=[0,0],
         _gh_=h[2],
         _gi_=0,
         mbl=
          fold_left$3
           (function(m,b){return max$1(m,bucket_length_alive(0,b))},_gi_,_gh_),
         histo=caml_make_vect(mbl + 1 | 0,0),
         _gj_=h[2];
        iter$5
         (function(b)
           {var l=bucket_length_alive(0,b);
            size[1] = size[1] + l | 0;
            var _gk_=caml_check_bound(histo,l)[1 + l] + 1 | 0;
            caml_check_bound(histo,l)[1 + l] = _gk_;
            return 0},
          _gj_);
        return [0,size[1],h[2].length - 1,mbl,histo]}
      function to_seq(tbl)
       {var tbl_data=tbl[2];
        function aux(i,buck,param)
         {var i$0=i,buck$0=buck;
          for(;;)
           {if(buck$0)
             {var
               next=buck$0[3],
               c=buck$0[2],
               match=caml_call1(H[5],c),
               match$0=caml_call1(H[4],c);
              if(match && match$0)
               {var data=match$0[1],key=match[1];
                return [0,
                        [0,key,data],
                        function(_gg_){return aux(i$0,next,_gg_)}]}
              var buck$0=next;
              continue}
            if(i$0 === tbl_data.length - 1)return 0;
            var
             buck$1=caml_check_bound(tbl_data,i$0)[1 + i$0],
             i$1=i$0 + 1 | 0,
             i$0=i$1,
             buck$0=buck$1;
            continue}}
        var _gd_=0,_ge_=0;
        return function(_gf_){return aux(_ge_,_gd_,_gf_)}}
      function to_seq_keys(m)
       {var _f$_=to_seq(m);
        function _ga_(_gc_){return _gc_[1]}
        return function(_gb_){return map$1(_ga_,_f$_,_gb_)}}
      function to_seq_values(m)
       {var _f7_=to_seq(m);
        function _f8_(_f__){return _f__[2]}
        return function(_f9_){return map$1(_f8_,_f7_,_f9_)}}
      function add_seq(tbl,i)
       {return iter
                (function(param)
                  {var v=param[2],k=param[1];return add(tbl,k,v)},
                 i)}
      function replace_seq(tbl,i)
       {return iter
                (function(param)
                  {var v=param[2],k=param[1];return replace(tbl,k,v)},
                 i)}
      function of_seq(i){var tbl=create(0,16);replace_seq(tbl,i);return tbl}
      return [0,
              create,
              clear,
              reset,
              copy,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter$0,
              filter_map_inplace,
              fold,
              length,
              stats,
              to_seq,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq,
              clean,
              stats_alive]}
    function create$5(param){return caml_call1(_q_[1],1)}
    function get_key$0(t){return caml_call2(_q_[3],t,0)}
    function get_key_copy$0(t){return caml_call2(_q_[4],t,0)}
    function set_key$0(t,k){return caml_call3(_q_[5],t,0,k)}
    function unset_key$0(t){return caml_call2(_q_[6],t,0)}
    function check_key$0(t){return caml_call2(_q_[7],t,0)}
    function blit_key$0(t1,t2){return caml_call5(_q_[8],t1,0,t2,0,1)}
    function get_data$1(t){return caml_call1(_q_[9],t)}
    function get_data_copy(t){return caml_call1(_q_[10],t)}
    function set_data(t,d){return caml_call2(_q_[11],t,d)}
    function unset_data(t){return caml_call1(_q_[12],t)}
    function check_data(t){return caml_call1(_q_[13],t)}
    function blit_data(t1,t2){return caml_call2(_q_[14],t1,t2)}
    function make$4(key,data)
     {var eph=create$5(0);set_data(eph,data);set_key$0(eph,key);return eph}
    function query(eph,key)
     {var match=get_key$0(eph);
      if(match){var k=match[1];return k === key?get_data$1(eph):0}
      return 0}
    function MakeSeeded$1(H)
     {function create(k,d)
       {var c=create$5(0);set_data(c,d);set_key$0(c,k);return c}
      var hash=H[2];
      function equal(c,k)
       {var match=get_key$0(c);
        if(match){var k$0=match[1];return caml_call2(H[1],k,k$0)?0:1}
        return 2}
      function set_key_data(c,k,d)
       {unset_data(c);set_key$0(c,k);return set_data(c,d)}
      return MakeSeeded$0
              ([0,
                create,
                hash,
                equal,
                get_data$1,
                get_key$0,
                set_key_data,
                check_key$0])}
    function Make$2(H)
     {var equal=H[1];
      function hash(seed,x){return caml_call1(H[2],x)}
      var
       include=MakeSeeded$1([0,equal,hash]),
       clear=include[2],
       reset=include[3],
       copy=include[4],
       add=include[5],
       remove=include[6],
       find=include[7],
       find_opt=include[8],
       find_all=include[9],
       replace=include[10],
       mem=include[11],
       iter=include[12],
       filter_map_inplace=include[13],
       fold=include[14],
       length=include[15],
       stats=include[16],
       to_seq=include[17],
       to_seq_keys=include[18],
       to_seq_values=include[19],
       add_seq=include[20],
       replace_seq=include[21],
       clean=include[23],
       stats_alive=include[24],
       _f6_=include[1];
      function create(sz){return caml_call2(_f6_,_cS_,sz)}
      function of_seq(i)
       {var tbl=create(16);caml_call2(replace_seq,tbl,i);return tbl}
      return [0,
              create,
              clear,
              reset,
              copy,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter,
              filter_map_inplace,
              fold,
              length,
              stats,
              to_seq,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq,
              clean,
              stats_alive]}
    function make$5(param){return [0,0]}
    function add$1(b,k,d){var _f5_=b[1];b[1] = [0,make$4(k,d),_f5_];return 0}
    function test_key(k,e)
     {var match=get_key$0(e);
      if(match){var x=match[1];if(x === k)return 1}
      return 0}
    function remove$0(b,k)
     {var l=b[1],acc=0;
      for(;;)
       {if(l)
         {var h=l[1],t=l[2];
          if(test_key(k,h)){b[1] = rev_append(acc,t);return 0}
          var l$0=l[2],acc$0=[0,h,acc],l=l$0,acc=acc$0;
          continue}
        return 0}}
    function find$2(b,k)
     {var
       _f3_=b[1],
       match=find_opt(function(_f4_){return test_key(k,_f4_)},_f3_);
      if(match){var e=match[1];return get_data$1(e)}
      return 0}
    function length$7(b){return length$1(b[1])}
    function clear$3(b){b[1] = 0;return 0}
    function create$6(param){return caml_call1(_q_[1],2)}
    function get_key1(t){return caml_call2(_q_[3],t,0)}
    function get_key1_copy(t){return caml_call2(_q_[4],t,0)}
    function set_key1(t,k){return caml_call3(_q_[5],t,0,k)}
    function unset_key1(t){return caml_call2(_q_[6],t,0)}
    function check_key1(t){return caml_call2(_q_[7],t,0)}
    function get_key2(t){return caml_call2(_q_[3],t,1)}
    function get_key2_copy(t){return caml_call2(_q_[4],t,1)}
    function set_key2(t,k){return caml_call3(_q_[5],t,1,k)}
    function unset_key2(t){return caml_call2(_q_[6],t,1)}
    function check_key2(t){return caml_call2(_q_[7],t,1)}
    function blit_key1(t1,t2){return caml_call5(_q_[8],t1,0,t2,0,1)}
    function blit_key2(t1,t2){return caml_call5(_q_[8],t1,1,t2,1,1)}
    function blit_key12(t1,t2){return caml_call5(_q_[8],t1,0,t2,0,2)}
    function get_data$2(t){return caml_call1(_q_[9],t)}
    function get_data_copy$0(t){return caml_call1(_q_[10],t)}
    function set_data$0(t,d){return caml_call2(_q_[11],t,d)}
    function unset_data$0(t){return caml_call1(_q_[12],t)}
    function check_data$0(t){return caml_call1(_q_[13],t)}
    function blit_data$0(t1,t2){return caml_call2(_q_[14],t1,t2)}
    function make$6(key1,key2,data)
     {var eph=create$6(0);
      set_data$0(eph,data);
      set_key1(eph,key1);
      set_key2(eph,key2);
      return eph}
    function query$0(eph,key1,key2)
     {var match=get_key1(eph);
      if(match)
       {var k=match[1];
        if(k === key1)
         {var match$0=get_key2(eph);
          if(match$0)
           {var k$0=match$0[1];return k$0 === key2?get_data$2(eph):0}
          return 0}
        return 0}
      return 0}
    function MakeSeeded$2(H1,H2)
     {function create(param,d)
       {var k2=param[2],k1=param[1],c=create$6(0);
        set_data$0(c,d);
        set_key1(c,k1);
        set_key2(c,k2);
        return c}
      function hash(seed,param)
       {var
         k2=param[2],
         k1=param[1],
         _f2_=caml_call2(H2[2],seed,k2) * 65599 | 0;
        return caml_call2(H1[2],seed,k1) + _f2_ | 0}
      function equal(c,param)
       {var k2=param[2],k1=param[1],match=get_key1(c),match$0=get_key2(c);
        if(match && match$0)
         {var k2$0=match$0[1],k1$0=match[1];
          if(caml_call2(H1[1],k1,k1$0) && caml_call2(H2[1],k2,k2$0))return 0;
          return 1}
        return 2}
      function get_key(c)
       {var match=get_key1(c),match$0=get_key2(c);
        if(match && match$0)
         {var k2=match$0[1],k1=match[1];return [0,[0,k1,k2]]}
        return 0}
      function set_key_data(c,param,d)
       {var k2=param[2],k1=param[1];
        unset_data$0(c);
        set_key1(c,k1);
        set_key2(c,k2);
        return set_data$0(c,d)}
      function check_key(c)
       {var _f1_=check_key1(c);return _f1_?check_key2(c):_f1_}
      return MakeSeeded$0
              ([0,create,hash,equal,get_data$2,get_key,set_key_data,check_key])}
    function Make$3(H1,H2)
     {var equal=H2[1];
      function hash(seed,x){return caml_call1(H2[2],x)}
      var equal$0=H1[1],_fZ_=[0,equal,hash];
      function hash$0(seed,x){return caml_call1(H1[2],x)}
      var
       include=MakeSeeded$2([0,equal$0,hash$0],_fZ_),
       clear=include[2],
       reset=include[3],
       copy=include[4],
       add=include[5],
       remove=include[6],
       find=include[7],
       find_opt=include[8],
       find_all=include[9],
       replace=include[10],
       mem=include[11],
       iter=include[12],
       filter_map_inplace=include[13],
       fold=include[14],
       length=include[15],
       stats=include[16],
       to_seq=include[17],
       to_seq_keys=include[18],
       to_seq_values=include[19],
       add_seq=include[20],
       replace_seq=include[21],
       clean=include[23],
       stats_alive=include[24],
       _f0_=include[1];
      function create(sz){return caml_call2(_f0_,_cT_,sz)}
      function of_seq(i)
       {var tbl=create(16);caml_call2(replace_seq,tbl,i);return tbl}
      return [0,
              create,
              clear,
              reset,
              copy,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter,
              filter_map_inplace,
              fold,
              length,
              stats,
              to_seq,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq,
              clean,
              stats_alive]}
    function make$7(param){return [0,0]}
    function add$2(b,k1,k2,d)
     {var _fY_=b[1];b[1] = [0,make$6(k1,k2,d),_fY_];return 0}
    function test_keys(k1,k2,e)
     {var match=get_key1(e),match$0=get_key2(e);
      if(match && match$0)
       {var x2=match$0[1],x1=match[1];if(x1 === k1 && x2 === k2)return 1}
      return 0}
    function remove$1(b,k1,k2)
     {var l=b[1],acc=0;
      for(;;)
       {if(l)
         {var h=l[1],t=l[2];
          if(test_keys(k1,k2,h)){b[1] = rev_append(acc,t);return 0}
          var l$0=l[2],acc$0=[0,h,acc],l=l$0,acc=acc$0;
          continue}
        return 0}}
    function find$3(b,k1,k2)
     {var
       _fW_=b[1],
       match=find_opt(function(_fX_){return test_keys(k1,k2,_fX_)},_fW_);
      if(match){var e=match[1];return get_data$2(e)}
      return 0}
    function length$8(b){return length$1(b[1])}
    function clear$4(b){b[1] = 0;return 0}
    function create$7(n){return caml_call1(_q_[1],n)}
    function length$9(k){return caml_call1(_q_[2],k)}
    function get_key$1(t,n){return caml_call2(_q_[3],t,n)}
    function get_key_copy$1(t,n){return caml_call2(_q_[4],t,n)}
    function set_key$1(t,n,k){return caml_call3(_q_[5],t,n,k)}
    function unset_key$1(t,n){return caml_call2(_q_[6],t,n)}
    function check_key$1(t,n){return caml_call2(_q_[7],t,n)}
    function blit_key$1(t1,o1,t2,o2,l)
     {return caml_call5(_q_[8],t1,o1,t2,o2,l)}
    function get_data$3(t){return caml_call1(_q_[9],t)}
    function get_data_copy$1(t){return caml_call1(_q_[10],t)}
    function set_data$1(t,d){return caml_call2(_q_[11],t,d)}
    function unset_data$1(t){return caml_call1(_q_[12],t)}
    function check_data$1(t){return caml_call1(_q_[13],t)}
    function blit_data$1(t1,t2){return caml_call2(_q_[14],t1,t2)}
    function make$8(keys,data)
     {var l=keys.length - 1,eph=create$7(l);
      set_data$1(eph,data);
      var _fU_=l - 1 | 0,_fT_=0;
      if(! (_fU_ < 0))
       {var i=_fT_;
        for(;;)
         {set_key$1(eph,i,caml_check_bound(keys,i)[1 + i]);
          var _fV_=i + 1 | 0;
          if(_fU_ !== i){var i=_fV_;continue}
          break}}
      return eph}
    function query$1(eph,keys)
     {var l=length$9(eph);
      try
       {if(l !== keys.length - 1)throw Exit;
        var _fP_=l - 1 | 0,_fO_=0;
        if(! (_fP_ < 0))
         {var i=_fO_;
          for(;;)
           {var match=get_key$1(eph,i);
            if(! match)throw Exit;
            var k=match[1];
            if(k !== caml_check_bound(keys,i)[1 + i])throw Exit;
            var _fR_=i + 1 | 0;
            if(_fP_ !== i){var i=_fR_;continue}
            break}}
        var _fQ_=get_data$3(eph);
        return _fQ_}
      catch(_fS_)
       {_fS_ = caml_wrap_exception(_fS_);if(_fS_ === Exit)return 0;throw _fS_}}
    function MakeSeeded$3(H)
     {function create(k,d)
       {var c=create$7(k.length - 1);
        set_data$1(c,d);
        var _fM_=k.length - 1 - 1 | 0,_fL_=0;
        if(! (_fM_ < 0))
         {var i=_fL_;
          for(;;)
           {set_key$1(c,i,caml_check_bound(k,i)[1 + i]);
            var _fN_=i + 1 | 0;
            if(_fM_ !== i){var i=_fN_;continue}
            break}}
        return c}
      function hash(seed,k)
       {var h=[0,0],_fH_=k.length - 1 - 1 | 0,_fG_=0;
        if(! (_fH_ < 0))
         {var i=_fG_;
          for(;;)
           {var _fI_=h[1],_fJ_=caml_check_bound(k,i)[1 + i];
            h[1] = (caml_call2(H[2],seed,_fJ_) * 65599 | 0) + _fI_ | 0;
            var _fK_=i + 1 | 0;
            if(_fH_ !== i){var i=_fK_;continue}
            break}}
        return h[1]}
      function equal(c,k)
       {var len=k.length - 1,len$0=length$9(c);
        if(len !== len$0)return 1;
        var i$1=len - 1 | 0,i=i$1;
        for(;;)
         {if(0 <= i)
           {var match=get_key$1(c,i);
            if(match)
             {var ki=match[1],_fF_=caml_check_bound(k,i)[1 + i];
              if(caml_call2(H[1],_fF_,ki)){var i$0=i - 1 | 0,i=i$0;continue}
              return 1}
            return 2}
          return 0}}
      function get_key(c)
       {var len=length$9(c);
        if(0 === len)return [0,[0]];
        var match=get_key$1(c,0);
        if(match)
         {var k0=match[1],a=caml_make_vect(len,k0),i$1=len - 1 | 0,i=i$1;
          for(;;)
           {if(1 <= i)
             {var match$0=get_key$1(c,i);
              if(match$0)
               {var ki=match$0[1];
                caml_check_bound(a,i)[1 + i] = ki;
                var i$0=i - 1 | 0,i=i$0;
                continue}
              return 0}
            return [0,a]}}
        return 0}
      function set_key_data(c,k,d)
       {unset_data$1(c);
        var _fD_=k.length - 1 - 1 | 0,_fC_=0;
        if(! (_fD_ < 0))
         {var i=_fC_;
          for(;;)
           {set_key$1(c,i,caml_check_bound(k,i)[1 + i]);
            var _fE_=i + 1 | 0;
            if(_fD_ !== i){var i=_fE_;continue}
            break}}
        return set_data$1(c,d)}
      function check_key(c)
       {var i$1=length$9(c) - 1 | 0,i=i$1;
        for(;;)
         {var _fz_=i < 0?1:0;
          if(_fz_)
           var _fA_=_fz_;
          else
           {var _fB_=check_key$1(c,i);
            if(_fB_){var i$0=i - 1 | 0,i=i$0;continue}
            var _fA_=_fB_}
          return _fA_}}
      return MakeSeeded$0
              ([0,create,hash,equal,get_data$3,get_key,set_key_data,check_key])}
    function Make$4(H)
     {var equal=H[1];
      function hash(seed,x){return caml_call1(H[2],x)}
      var
       include=MakeSeeded$3([0,equal,hash]),
       clear=include[2],
       reset=include[3],
       copy=include[4],
       add=include[5],
       remove=include[6],
       find=include[7],
       find_opt=include[8],
       find_all=include[9],
       replace=include[10],
       mem=include[11],
       iter=include[12],
       filter_map_inplace=include[13],
       fold=include[14],
       length=include[15],
       stats=include[16],
       to_seq=include[17],
       to_seq_keys=include[18],
       to_seq_values=include[19],
       add_seq=include[20],
       replace_seq=include[21],
       clean=include[23],
       stats_alive=include[24],
       _fy_=include[1];
      function create(sz){return caml_call2(_fy_,_cU_,sz)}
      function of_seq(i)
       {var tbl=create(16);caml_call2(replace_seq,tbl,i);return tbl}
      return [0,
              create,
              clear,
              reset,
              copy,
              add,
              remove,
              find,
              find_opt,
              find_all,
              replace,
              mem,
              iter,
              filter_map_inplace,
              fold,
              length,
              stats,
              to_seq,
              to_seq_keys,
              to_seq_values,
              add_seq,
              replace_seq,
              of_seq,
              clean,
              stats_alive]}
    function make$9(param){return [0,0]}
    function add$3(b,k,d){var _fx_=b[1];b[1] = [0,make$8(k,d),_fx_];return 0}
    function test_keys$0(k,e)
     {try
       {if(length$9(e) !== k.length - 1)throw Exit;
        var _ft_=k.length - 1 - 1 | 0,_fs_=0;
        if(! (_ft_ < 0))
         {var i=_fs_;
          for(;;)
           {var match=get_key$1(e,i),switch$0=0;
            if(match)
             {var x=match[1];
              if(x === caml_check_bound(k,i)[1 + i])
               {var _fv_=i + 1 | 0;
                if(_ft_ !== i){var i=_fv_;continue}
                switch$0 = 1}}
            if(! switch$0)throw Exit;
            break}}
        var _fu_=1;
        return _fu_}
      catch(_fw_)
       {_fw_ = caml_wrap_exception(_fw_);if(_fw_ === Exit)return 0;throw _fw_}}
    function remove$2(b,k)
     {var l=b[1],acc=0;
      for(;;)
       {if(l)
         {var h=l[1],t=l[2];
          if(test_keys$0(k,h)){b[1] = rev_append(acc,t);return 0}
          var l$0=l[2],acc$0=[0,h,acc],l=l$0,acc=acc$0;
          continue}
        return 0}}
    function find$4(b,k)
     {var
       _fq_=b[1],
       match=find_opt(function(_fr_){return test_keys$0(k,_fr_)},_fq_);
      if(match){var e=match[1];return get_data$3(e)}
      return 0}
    function length$10(b){return length$1(b[1])}
    function clear$5(b){b[1] = 0;return 0}
    var
     Stdlib_Ephemeron=
      [0,
       [0,
        create$5,
        get_key$0,
        get_key_copy$0,
        set_key$0,
        unset_key$0,
        check_key$0,
        blit_key$0,
        get_data$1,
        get_data_copy,
        set_data,
        unset_data,
        check_data,
        blit_data,
        make$4,
        query,
        Make$2,
        MakeSeeded$1,
        [0,make$5,add$1,remove$0,find$2,length$7,clear$3]],
       [0,
        create$6,
        get_key1,
        get_key1_copy,
        set_key1,
        unset_key1,
        check_key1,
        get_key2,
        get_key2_copy,
        set_key2,
        unset_key2,
        check_key2,
        blit_key1,
        blit_key2,
        blit_key12,
        get_data$2,
        get_data_copy$0,
        set_data$0,
        unset_data$0,
        check_data$0,
        blit_data$0,
        make$6,
        query$0,
        Make$3,
        MakeSeeded$2,
        [0,make$7,add$2,remove$1,find$3,length$8,clear$4]],
       [0,
        create$7,
        get_key$1,
        get_key_copy$1,
        set_key$1,
        unset_key$1,
        check_key$1,
        blit_key$1,
        get_data$3,
        get_data_copy$1,
        set_data$1,
        unset_data$1,
        check_data$1,
        blit_data$1,
        make$8,
        query$1,
        Make$4,
        MakeSeeded$3,
        [0,make$9,add$3,remove$2,find$4,length$10,clear$5]],
       [0,
        function(_fp_)
         {return MakeSeeded$0
                  ([0,_fp_[3],_fp_[1],_fp_[2],_fp_[5],_fp_[4],_fp_[6],_fp_[7]])}]];
    caml_register_global(825,Stdlib_Ephemeron,"Stdlib__Ephemeron");
    function generic_basename(is_dir_sep,current_dir_name,name)
     {if(caml_string_equal(name,cst$100))return current_dir_name;
      var n$3=caml_ml_string_length(name) - 1 | 0,n=n$3;
      for(;;)
       {if(0 <= n)
         {if(caml_call2(is_dir_sep,name,n)){var n$0=n - 1 | 0,n=n$0;continue}
          var p=n + 1 | 0,n$1=n;
          for(;;)
           {if(0 <= n$1)
             {if(caml_call2(is_dir_sep,name,n$1))
               return sub$0(name,n$1 + 1 | 0,(p - n$1 | 0) - 1 | 0);
              var n$2=n$1 - 1 | 0,n$1=n$2;
              continue}
            return sub$0(name,0,p)}}
        return sub$0(name,0,1)}}
    function generic_dirname(is_dir_sep,current_dir_name,name)
     {if(caml_string_equal(name,cst$101))return current_dir_name;
      var n$5=caml_ml_string_length(name) - 1 | 0,n=n$5;
      for(;;)
       {if(0 <= n)
         {if(caml_call2(is_dir_sep,name,n)){var n$0=n - 1 | 0,n=n$0;continue}
          var n$1=n;
          for(;;)
           {if(0 <= n$1)
             {if(caml_call2(is_dir_sep,name,n$1))
               {var n$3=n$1;
                for(;;)
                 {if(0 <= n$3)
                   {if(caml_call2(is_dir_sep,name,n$3))
                     {var n$4=n$3 - 1 | 0,n$3=n$4;continue}
                    return sub$0(name,0,n$3 + 1 | 0)}
                  return sub$0(name,0,1)}}
              var n$2=n$1 - 1 | 0,n$1=n$2;
              continue}
            return current_dir_name}}
        return sub$0(name,0,1)}}
    function is_dir_sep(s,i){return 47 === caml_string_get(s,i)?1:0}
    function is_relative(n)
     {var
       _fn_=caml_ml_string_length(n) < 1?1:0,
       _fo_=_fn_ || (47 !== caml_string_get(n,0)?1:0);
      return _fo_}
    function is_implicit(n)
     {var _fi_=is_relative(n);
      if(_fi_)
       {var
         _fj_=caml_ml_string_length(n) < 2?1:0,
         _fk_=_fj_ || caml_string_notequal(sub$0(n,0,2),cst$103);
        if(_fk_)
         var
          _fl_=caml_ml_string_length(n) < 3?1:0,
          _fm_=_fl_ || caml_string_notequal(sub$0(n,0,3),cst$102);
        else
         var _fm_=_fk_}
      else
       var _fm_=_fi_;
      return _fm_}
    function check_suffix(name,suff){return ends_with$0(suff,name)}
    function chop_suffix_opt(suffix,filename)
     {var
       len_s=caml_ml_string_length(suffix),
       len_f=caml_ml_string_length(filename);
      if(len_s <= len_f)
       {var r=sub$0(filename,len_f - len_s | 0,len_s);
        return caml_string_equal(r,suffix)
                ?[0,sub$0(filename,0,len_f - len_s | 0)]
                :0}
      return 0}
    try
     {var _c3_=caml_sys_getenv(cst_TMPDIR),_cV_=_c3_}
    catch(_fh_)
     {_fh_ = caml_wrap_exception(_fh_);
      if(_fh_ !== Not_found)throw _fh_;
      var _cV_=cst_tmp}
    function quote(s)
     {var l=caml_ml_string_length(s),b=create$2(l + 20 | 0);
      add_char(b,39);
      var _ff_=l - 1 | 0,_fe_=0;
      if(! (_ff_ < 0))
       {var i=_fe_;
        for(;;)
         {if(39 === caml_string_get(s,i))
           add_string(b,quotequote);
          else
           add_char(b,caml_string_get(s,i));
          var _fg_=i + 1 | 0;
          if(_ff_ !== i){var i=_fg_;continue}
          break}}
      add_char(b,39);
      return contents(b)}
    function quote_command(cmd,stdin,stdout,stderr,args)
     {if(stderr)
       var
        f=stderr[1],
        _e__=caml_equal(stderr,stdout)?cst_2_1:cat(cst_2,quote(f)),
        _e$_=_e__;
      else
       var _e$_=cst$109;
      if(stdout)
       var f$0=stdout[1],_fa_=cat(cst$104,quote(f$0));
      else
       var _fa_=cst$108;
      var _fb_=cat(_fa_,_e$_);
      if(stdin)
       var f$1=stdin[1],_fc_=cat(cst$105,quote(f$1));
      else
       var _fc_=cst$107;
      var _fd_=cat(_fc_,_fb_);
      return cat(concat$1(cst$106,map$4(quote,[0,cmd,args])),_fd_)}
    function basename(_e9_)
     {return generic_basename(is_dir_sep,current_dir_name,_e9_)}
    function dirname(_e8_)
     {return generic_dirname(is_dir_sep,current_dir_name,_e8_)}
    var
     Unix=
      [0,
       null$0,
       current_dir_name,
       parent_dir_name,
       dir_sep,
       is_dir_sep,
       is_relative,
       is_implicit,
       check_suffix,
       chop_suffix_opt,
       _cV_,
       quote,
       quote_command,
       basename,
       dirname];
    function is_dir_sep$0(s,i)
     {var c=caml_string_get(s,i),_e5_=47 === c?1:0;
      if(_e5_)
       var _e6_=_e5_;
      else
       var _e7_=92 === c?1:0,_e6_=_e7_ || (58 === c?1:0);
      return _e6_}
    function is_relative$0(n)
     {var
       _eZ_=caml_ml_string_length(n) < 1?1:0,
       _e0_=_eZ_ || (47 !== caml_string_get(n,0)?1:0);
      if(_e0_)
       {var
         _e1_=caml_ml_string_length(n) < 1?1:0,
         _e2_=_e1_ || (92 !== caml_string_get(n,0)?1:0);
        if(_e2_)
         var
          _e3_=caml_ml_string_length(n) < 2?1:0,
          _e4_=_e3_ || (58 !== caml_string_get(n,1)?1:0);
        else
         var _e4_=_e2_}
      else
       var _e4_=_e0_;
      return _e4_}
    function is_implicit$0(n)
     {var _eQ_=is_relative$0(n);
      if(_eQ_)
       {var
         _eR_=caml_ml_string_length(n) < 2?1:0,
         _eS_=_eR_ || caml_string_notequal(sub$0(n,0,2),cst$113);
        if(_eS_)
         {var
           _eT_=caml_ml_string_length(n) < 2?1:0,
           _eU_=_eT_ || caml_string_notequal(sub$0(n,0,2),cst$112);
          if(_eU_)
           {var
             _eV_=caml_ml_string_length(n) < 3?1:0,
             _eW_=_eV_ || caml_string_notequal(sub$0(n,0,3),cst$111);
            if(_eW_)
             var
              _eX_=caml_ml_string_length(n) < 3?1:0,
              _eY_=_eX_ || caml_string_notequal(sub$0(n,0,3),cst$110);
            else
             var _eY_=_eW_}
          else
           var _eY_=_eU_}
        else
         var _eY_=_eS_}
      else
       var _eY_=_eQ_;
      return _eY_}
    function check_suffix$0(name,suff)
     {var _eN_=caml_ml_string_length(suff) <= caml_ml_string_length(name)?1:0;
      if(_eN_)
       var
        s=
         sub$0
          (name,
           caml_ml_string_length(name) - caml_ml_string_length(suff) | 0,
           caml_ml_string_length(suff)),
        _eO_=lowercase_ascii$1(suff),
        _eP_=caml_string_equal(lowercase_ascii$1(s),_eO_);
      else
       var _eP_=_eN_;
      return _eP_}
    function chop_suffix_opt$0(suffix,filename)
     {var
       len_s=caml_ml_string_length(suffix),
       len_f=caml_ml_string_length(filename);
      if(len_s <= len_f)
       {var
         r=sub$0(filename,len_f - len_s | 0,len_s),
         _eM_=lowercase_ascii$1(suffix);
        return caml_string_equal(lowercase_ascii$1(r),_eM_)
                ?[0,sub$0(filename,0,len_f - len_s | 0)]
                :0}
      return 0}
    try
     {var _c2_=caml_sys_getenv(cst_TEMP),temp_dir_name=_c2_}
    catch(_eL_)
     {_eL_ = caml_wrap_exception(_eL_);
      if(_eL_ !== Not_found)throw _eL_;
      var temp_dir_name=cst$114}
    function quote$0(s)
     {var l=caml_ml_string_length(s),b=create$2(l + 20 | 0);
      add_char(b,34);
      function add_bs(n)
       {var _eJ_=1;
        if(! (n < 1))
         {var j=_eJ_;
          for(;;)
           {add_char(b,92);
            var _eK_=j + 1 | 0;
            if(n !== j){var j=_eK_;continue}
            break}}
        return 0}
      function loop$0(counter,i)
       {var i$0=i;
        for(;;)
         {if(i$0 === l)return add_char(b,34);
          var c=caml_string_get(s,i$0);
          if(34 === c)
           {var _eH_=0;
            if(counter < 50)
             {var counter$1=counter + 1 | 0;
              return loop_bs(counter$1,_eH_,i$0)}
            return caml_trampoline_return(loop_bs,[0,_eH_,i$0])}
          if(92 === c)
           {var _eI_=0;
            if(counter < 50)
             {var counter$0=counter + 1 | 0;
              return loop_bs(counter$0,_eI_,i$0)}
            return caml_trampoline_return(loop_bs,[0,_eI_,i$0])}
          add_char(b,c);
          var i$1=i$0 + 1 | 0,i$0=i$1;
          continue}}
      function loop_bs(counter,n,i)
       {var n$0=n,i$0=i;
        for(;;)
         {if(i$0 === l){add_char(b,34);return add_bs(n$0)}
          var match=caml_string_get(s,i$0);
          if(34 === match)
           {add_bs((2 * n$0 | 0) + 1 | 0);
            add_char(b,34);
            var _eG_=i$0 + 1 | 0;
            if(counter < 50)
             {var counter$1=counter + 1 | 0;return loop$0(counter$1,_eG_)}
            return caml_trampoline_return(loop$0,[0,_eG_])}
          if(92 === match)
           {var i$1=i$0 + 1 | 0,n$1=n$0 + 1 | 0,n$0=n$1,i$0=i$1;continue}
          add_bs(n$0);
          if(counter < 50)
           {var counter$0=counter + 1 | 0;return loop$0(counter$0,i$0)}
          return caml_trampoline_return(loop$0,[0,i$0])}}
      function loop(i){return caml_trampoline(loop$0(0,i))}
      loop(0);
      return contents(b)}
    function quote_cmd_filename(f)
     {if(! contains$0(f,34) && ! contains$0(f,37))
       return contains$0(f,32)?cat(cst$116,cat(f,cst$115)):f;
      return failwith(cat(cst_Filename_quote_command_bad,f))}
    function quote_command$0(cmd,stdin,stdout,stderr,args)
     {if(stderr)
       var
        f=stderr[1],
        _ex_=
         caml_equal(stderr,stdout)
          ?cst_2_1$0
          :cat(cst_2$0,quote_cmd_filename(f)),
        _ey_=_ex_;
      else
       var _ey_=cst$125;
      var _ez_=[0,_ey_,_cW_];
      if(stdout)
       var f$0=stdout[1],_eA_=cat(cst$117,quote_cmd_filename(f$0));
      else
       var _eA_=cst$124;
      var _eB_=[0,_eA_,_ez_];
      if(stdin)
       var f$1=stdin[1],_eC_=cat(cst$118,quote_cmd_filename(f$1));
      else
       var _eC_=cst$123;
      var
       s=concat$1(cst$119,map$4(quote$0,args)),
       b=create$2(caml_ml_string_length(s) + 20 | 0),
       _eD_=[0,_eC_,_eB_];
      iter$4
       (function(c)
         {var switch$0=0;
          if(62 <= c)
           {var _eF_=c - 63 | 0;
            if(60 < _eF_ >>> 0)
             {if(! (62 <= _eF_))switch$0 = 1}
            else
             if(31 === _eF_)switch$0 = 1}
          else
           if(42 <= c)
            {if(60 === c)switch$0 = 1}
           else
            if(33 <= c)
             switch(c - 33 | 0)
              {case 2:case 3:case 6:break;default:switch$0 = 1}
          return switch$0?(add_char(b,94),add_char(b,c)):add_char(b,c)},
        s);
      var _eE_=[0,cst$120,[0,contents(b),_eD_]];
      return concat$1(cst$122,[0,cst$121,[0,quote_cmd_filename(cmd),_eE_]])}
    function drive_and_path(s)
     {var _et_=2 <= caml_ml_string_length(s)?1:0;
      if(_et_)
       {var param=caml_string_get(s,0),switch$0=0;
        if(91 <= param)
         {if(! (25 < param - 97 >>> 0))switch$0 = 1}
        else
         if(65 <= param)switch$0 = 1;
        var _eu_=switch$0?1:0,_ev_=_eu_?58 === caml_string_get(s,1)?1:0:_eu_}
      else
       var _ev_=_et_;
      if(_ev_)
       {var _ew_=sub$0(s,2,caml_ml_string_length(s) - 2 | 0);
        return [0,sub$0(s,0,2),_ew_]}
      return [0,cst$126,s]}
    function dirname$0(s)
     {var
       match=drive_and_path(s),
       path=match[2],
       drive=match[1],
       dir=generic_dirname(is_dir_sep$0,current_dir_name$0,path);
      return cat(drive,dir)}
    function basename$0(s)
     {var match=drive_and_path(s),path=match[2];
      return generic_basename(is_dir_sep$0,current_dir_name$0,path)}
    var
     Win32=
      [0,
       null$1,
       current_dir_name$0,
       parent_dir_name$0,
       dir_sep$0,
       is_dir_sep$0,
       is_relative$0,
       is_implicit$0,
       check_suffix$0,
       chop_suffix_opt$0,
       temp_dir_name,
       quote$0,
       quote_command$0,
       basename$0,
       dirname$0];
    function basename$1(_es_)
     {return generic_basename(is_dir_sep$0,current_dir_name$1,_es_)}
    function dirname$1(_er_)
     {return generic_dirname(is_dir_sep$0,current_dir_name$1,_er_)}
    var
     Cygwin=
      [0,
       null$2,
       current_dir_name$1,
       parent_dir_name$1,
       dir_sep$1,
       is_dir_sep$0,
       is_relative$0,
       is_implicit$0,
       check_suffix$0,
       chop_suffix_opt$0,
       _cV_,
       quote,
       quote_command,
       basename$1,
       dirname$1],
     Sysdeps=
      caml_string_notequal(os_type,cst_Cygwin)
       ?caml_string_notequal(os_type,cst_Win32)?Unix:Win32
       :Cygwin,
     null$3=Sysdeps[1],
     current_dir_name$2=Sysdeps[2],
     parent_dir_name$2=Sysdeps[3],
     dir_sep$2=Sysdeps[4],
     is_dir_sep$1=Sysdeps[5],
     is_relative$1=Sysdeps[6],
     is_implicit$1=Sysdeps[7],
     check_suffix$1=Sysdeps[8],
     chop_suffix_opt$1=Sysdeps[9],
     temp_dir_name$0=Sysdeps[10],
     quote$1=Sysdeps[11],
     quote_command$1=Sysdeps[12],
     basename$2=Sysdeps[13],
     dirname$2=Sysdeps[14];
    function concat$4(dirname,filename)
     {var l=caml_ml_string_length(dirname);
      if(0 !== l && ! is_dir_sep$1(dirname,l - 1 | 0))
       return cat(dirname,cat(dir_sep$2,filename));
      return cat(dirname,filename)}
    function chop_suffix(name,suff)
     {return check_suffix$1(name,suff)
              ?sub$0
                (name,
                 0,
                 caml_ml_string_length(name) - caml_ml_string_length(suff) | 0)
              :invalid_arg(cst_Filename_chop_suffix)}
    function extension_len(name)
     {var i$4=caml_ml_string_length(name) - 1 | 0,i$1=i$4;
      for(;;)
       {if(0 <= i$1 && ! is_dir_sep$1(name,i$1))
         {if(46 === caml_string_get(name,i$1))
           {var i$2=i$1 - 1 | 0,i=i$2;
            for(;;)
             {if(0 <= i && ! is_dir_sep$1(name,i))
               {if(46 === caml_string_get(name,i))
                 {var i$0=i - 1 | 0,i=i$0;continue}
                return caml_ml_string_length(name) - i$1 | 0}
              return 0}}
          var i$3=i$1 - 1 | 0,i$1=i$3;
          continue}
        return 0}}
    function extension(name)
     {var l=extension_len(name);
      return 0 === l?cst$127:sub$0(name,caml_ml_string_length(name) - l | 0,l)}
    function chop_extension(name)
     {var l=extension_len(name);
      return 0 === l
              ?invalid_arg(cst_Filename_chop_extension)
              :sub$0(name,0,caml_ml_string_length(name) - l | 0)}
    function remove_extension(name)
     {var l=extension_len(name);
      return 0 === l?name:sub$0(name,0,caml_ml_string_length(name) - l | 0)}
    var prng$0=[246,function(_eq_){return caml_call1(_ci_[2],0)}];
    function temp_file_name(temp_dir,prefix,suffix)
     {var
       _eo_=caml_obj_tag(prng$0),
       _ep_=
        250 === _eo_?prng$0[1]:246 === _eo_?force_lazy_block(prng$0):prng$0,
       rnd=caml_call1(_ci_[4],_ep_) & 16777215;
      return concat$4(temp_dir,caml_call3(sprintf(_cX_),prefix,rnd,suffix))}
    var current_temp_dir_name=[0,temp_dir_name$0];
    function set_temp_dir_name(s){current_temp_dir_name[1] = s;return 0}
    function get_temp_dir_name(param){return current_temp_dir_name[1]}
    function temp_file(opt,prefix,suffix)
     {if(opt)
       var sth=opt[1],temp_dir=sth;
      else
       var temp_dir=current_temp_dir_name[1];
      function try_name(counter)
       {var counter$0=counter;
        for(;;)
         {var name=temp_file_name(temp_dir,prefix,suffix);
          try
           {runtime.caml_sys_close(caml_sys_open(name,_cY_,384));return name}
          catch(e)
           {e = caml_wrap_exception(e);
            if(e[1] === Sys_error)
             {if(1000 <= counter$0)throw e;
              var counter$1=counter$0 + 1 | 0,counter$0=counter$1;
              continue}
            throw e}}}
      return try_name(0)}
    function open_temp_file(opt,_em_,_el_,prefix,suffix)
     {if(opt)var sth=opt[1],mode=sth;else var mode=_cZ_;
      if(_em_)var sth$0=_em_[1],perms=sth$0;else var perms=384;
      if(_el_)
       var sth$1=_el_[1],temp_dir=sth$1;
      else
       var temp_dir=current_temp_dir_name[1];
      function try_name(counter)
       {var counter$0=counter;
        for(;;)
         {var name=temp_file_name(temp_dir,prefix,suffix);
          try
           {var _en_=[0,name,open_gen([0,1,[0,3,[0,5,mode]]],perms,name)];
            return _en_}
          catch(e)
           {e = caml_wrap_exception(e);
            if(e[1] === Sys_error)
             {if(1000 <= counter$0)throw e;
              var counter$1=counter$0 + 1 | 0,counter$0=counter$1;
              continue}
            throw e}}}
      return try_name(0)}
    var
     Stdlib_Filename=
      [0,
       current_dir_name$2,
       parent_dir_name$2,
       dir_sep$2,
       concat$4,
       is_relative$1,
       is_implicit$1,
       check_suffix$1,
       chop_suffix,
       chop_suffix_opt$1,
       extension,
       remove_extension,
       chop_extension,
       basename$2,
       dirname$2,
       null$3,
       temp_file,
       open_temp_file,
       get_temp_dir_name,
       set_temp_dir_name,
       temp_dir_name$0,
       quote$1,
       quote_command$1];
    caml_register_global(826,Stdlib_Filename,"Stdlib__Filename");
    function add$4(x,y){return [254,x[1] + y[1],x[2] + y[2]]}
    function sub$4(x,y){return [254,x[1] - y[1],x[2] - y[2]]}
    function neg(x){return [254,- x[1],- x[2]]}
    function conj(x){return [254,x[1],- x[2]]}
    function mul(x,y)
     {return [254,x[1] * y[1] - x[2] * y[2],x[1] * y[2] + x[2] * y[1]]}
    function div(x,y)
     {if(Math.abs(y[2]) <= Math.abs(y[1]))
       {var r=y[2] / y[1],d=y[1] + r * y[2];
        return [254,(x[1] + r * x[2]) / d,(x[2] - r * x[1]) / d]}
      var r$0=y[1] / y[2],d$0=y[2] + r$0 * y[1];
      return [254,(r$0 * x[1] + x[2]) / d$0,(r$0 * x[2] - x[1]) / d$0]}
    function inv(x){return div(one$4,x)}
    function norm2(x){return x[1] * x[1] + x[2] * x[2]}
    function norm(x)
     {var r=Math.abs(x[1]),i=Math.abs(x[2]);
      if(r == 0.)return i;
      if(i == 0.)return r;
      if(i <= r){var q=i / r;return r * Math.sqrt(1. + q * q)}
      var q$0=r / i;
      return i * Math.sqrt(1. + q$0 * q$0)}
    function arg(x){return Math.atan2(x[2],x[1])}
    function polar(n,a){return [254,Math.cos(a) * n,Math.sin(a) * n]}
    function sqrt(x)
     {if(x[1] == 0. && x[2] == 0.)return _c0_;
      var r=Math.abs(x[1]),i=Math.abs(x[2]);
      if(i <= r)
       var
        q=i / r,
        w=Math.sqrt(r) * Math.sqrt(0.5 * (1. + Math.sqrt(1. + q * q)));
      else
       var
        q$0=r / i,
        w=Math.sqrt(i) * Math.sqrt(0.5 * (q$0 + Math.sqrt(1. + q$0 * q$0)));
      if(0. <= x[1])return [254,w,0.5 * x[2] / w];
      var w$0=0. <= x[2]?w:- w;
      return [254,0.5 * i / w,w$0]}
    function exp(x)
     {var e=Math.exp(x[1]);return [254,e * Math.cos(x[2]),e * Math.sin(x[2])]}
    function log(x)
     {var _ek_=Math.atan2(x[2],x[1]);return [254,Math.log(norm(x)),_ek_]}
    function pow(x,y){return exp(mul(y,log(x)))}
    var
     Stdlib_Complex=
      [0,
       zero$4,
       one$4,
       i,
       neg,
       conj,
       add$4,
       sub$4,
       mul,
       inv,
       div,
       sqrt,
       norm2,
       norm,
       arg,
       polar,
       exp,
       log,
       pow];
    caml_register_global(827,Stdlib_Complex,"Stdlib__Complex");
    var
     Stdlib_ArrayLabels=
      [0,
       make_float,
       init$3,
       create_matrix,
       create_matrix,
       append$1,
       concat$2,
       sub$1,
       copy$1,
       fill$0,
       blit$1,
       to_list$1,
       of_list,
       iter$5,
       iteri$3,
       map$7,
       mapi$3,
       fold_left$3,
       fold_left_map$0,
       fold_right$2,
       iter2$1,
       map2$1,
       for_all$3,
       exists$3,
       for_all2$1,
       exists2$1,
       mem$0,
       memq$0,
       find_opt$0,
       find_map$1,
       split$0,
       combine$0,
       sort,
       fast_sort$0,
       fast_sort$0,
       to_seq$4,
       to_seqi$1,
       of_seq$2,
       Floatarray];
    caml_register_global(828,Stdlib_ArrayLabels,"Stdlib__ArrayLabels");
    var
     Stdlib_ListLabels=
      [0,
       length$1,
       compare_lengths,
       compare_length_with,
       cons$0,
       hd,
       tl,
       nth,
       nth_opt,
       rev,
       init$0,
       append,
       rev_append,
       flatten,
       flatten,
       equal$6,
       compare$6,
       iter$2,
       iteri$0,
       map$4,
       mapi$0,
       rev_map,
       filter_map$0,
       concat_map,
       fold_left_map,
       fold_left$0,
       fold_right,
       iter2$0,
       map2$0,
       rev_map2,
       fold_left2$0,
       fold_right2,
       for_all$0,
       exists$0,
       for_all2$0,
       exists2$0,
       mem,
       memq,
       find$0,
       find_opt,
       find_map$0,
       find_all,
       find_all,
       filteri,
       partition$0,
       partition_map$0,
       assoc,
       assoc_opt,
       assq,
       assq_opt,
       mem_assoc,
       mem_assq,
       remove_assoc,
       remove_assq,
       split,
       combine,
       fast_sort,
       fast_sort,
       fast_sort,
       sort_uniq,
       merge,
       to_seq$1,
       of_seq];
    caml_register_global(829,Stdlib_ListLabels,"Stdlib__ListLabels");
    var
     Stdlib_BytesLabels=
      [0,
       make$0,
       init$1,
       empty$0,
       copy,
       to_bytes,
       of_bytes,
       sub,
       sub_string,
       extend,
       fill,
       blit,
       blit$0,
       concat$0,
       cat$0,
       iter$3,
       iteri$1,
       map$5,
       mapi$1,
       fold_left$1,
       fold_right$0,
       for_all$1,
       exists$1,
       trim,
       escaped$0,
       index,
       index_opt,
       rindex,
       rindex_opt,
       index_from,
       index_from_opt,
       rindex_from,
       rindex_from_opt,
       contains,
       contains_from,
       rcontains_from,
       uppercase$0,
       lowercase$0,
       capitalize,
       uncapitalize,
       uppercase_ascii$0,
       lowercase_ascii$0,
       capitalize_ascii,
       uncapitalize_ascii,
       compare$8,
       equal$8,
       starts_with,
       ends_with,
       unsafe_to_string,
       unsafe_of_string,
       split_on_char,
       to_seq$2,
       to_seqi,
       of_seq$0,
       get_utf_8_uchar,
       set_utf_8_uchar,
       is_valid_utf_8,
       get_utf_16be_uchar,
       set_utf_16be_uchar,
       is_valid_utf_16be,
       get_utf_16le_uchar,
       set_utf_16le_uchar,
       is_valid_utf_16le,
       get_uint8,
       get_int8,
       get_uint16_ne,
       get_uint16_be,
       get_uint16_le,
       get_int16_ne,
       get_int16_be,
       get_int16_le,
       get_int32_ne,
       get_int32_be,
       get_int32_le,
       get_int64_ne,
       get_int64_be,
       get_int64_le,
       set_uint8,
       set_int8,
       set_uint16_ne,
       set_int16_be,
       set_int16_le,
       set_int16_ne,
       set_int16_be,
       set_int16_le,
       set_int32_ne,
       set_int32_be,
       set_int32_le,
       set_int64_ne,
       set_int64_be,
       set_int64_le];
    caml_register_global(830,Stdlib_BytesLabels,"Stdlib__BytesLabels");
    var
     Stdlib_StringLabels=
      [0,
       make$1,
       init$2,
       empty$1,
       of_bytes,
       to_bytes,
       concat$1,
       cat,
       equal$9,
       compare$9,
       starts_with$0,
       ends_with$0,
       contains_from$0,
       rcontains_from$0,
       contains$0,
       sub$0,
       split_on_char$0,
       map$6,
       mapi$2,
       fold_left$2,
       fold_right$1,
       for_all$2,
       exists$2,
       trim$0,
       escaped$1,
       uppercase_ascii$1,
       lowercase_ascii$1,
       capitalize_ascii$0,
       uncapitalize_ascii$0,
       iter$4,
       iteri$2,
       index_from$0,
       index_from_opt$0,
       rindex_from$0,
       rindex_from_opt$0,
       index$0,
       index_opt$0,
       rindex$0,
       rindex_opt$0,
       to_seq$3,
       to_seqi$0,
       of_seq$1,
       get_utf_8_uchar$0,
       is_valid_utf_8$0,
       get_utf_16be_uchar$0,
       is_valid_utf_16be$0,
       get_utf_16le_uchar$0,
       is_valid_utf_16le$0,
       blit$0,
       copy$0,
       fill,
       uppercase$1,
       lowercase$1,
       capitalize$0,
       uncapitalize$0,
       get_uint8$0,
       get_int8$0,
       get_uint16_ne$0,
       get_uint16_be$0,
       get_uint16_le$0,
       get_int16_ne$0,
       get_int16_be$0,
       get_int16_le$0,
       get_int32_ne$0,
       get_int32_be$0,
       get_int32_le$0,
       get_int64_ne$0,
       get_int64_be$0,
       get_int64_le$0];
    caml_register_global(831,Stdlib_StringLabels,"Stdlib__StringLabels");
    var Stdlib_MoreLabels=[0,Stdlib_Hashtbl,Stdlib_Map,Stdlib_Set];
    caml_register_global(832,Stdlib_MoreLabels,"Stdlib__MoreLabels");
    var Stdlib_StdLabels=[0];
    caml_register_global(833,Stdlib_StdLabels,"Stdlib__StdLabels");
    var
     float32=0,
     float64=1,
     int8_signed=2,
     int8_unsigned=3,
     int16_signed=4,
     int16_unsigned=5,
     int32$1=6,
     int64$1=7,
     int$2=8,
     nativeint$1=9,
     complex32=10,
     complex64=11,
     char$0=12;
    function kind_size_in_bytes(param)
     {switch(param)
       {case 0:return 4;
        case 1:return 8;
        case 2:return 1;
        case 3:return 1;
        case 4:return 2;
        case 5:return 2;
        case 6:return 4;
        case 7:return 8;
        case 8:return 4;
        case 9:return 4;
        case 10:return 8;
        case 11:return 16;
        default:return 1}}
    var c_layout=0,fortran_layout=1;
    function cloop(arr,idx,f,col,max)
     {if(col === idx.length - 1)
       return caml_ba_set_generic(arr,idx,caml_call1(f,idx));
      var _ei_=caml_check_bound(max,col)[1 + col] - 1 | 0,_eh_=0;
      if(! (_ei_ < 0))
       {var j=_eh_;
        for(;;)
         {caml_check_bound(idx,col)[1 + col] = j;
          cloop(arr,idx,f,col + 1 | 0,max);
          var _ej_=j + 1 | 0;
          if(_ei_ !== j){var j=_ej_;continue}
          break}}
      return 0}
    function floop(arr,idx,f,col,max)
     {if(0 <= col)
       {var _ef_=caml_check_bound(max,col)[1 + col],_ee_=1;
        if(! (_ef_ < 1))
         {var j=_ee_;
          for(;;)
           {caml_check_bound(idx,col)[1 + col] = j;
            floop(arr,idx,f,col - 1 | 0,max);
            var _eg_=j + 1 | 0;
            if(_ef_ !== j){var j=_eg_;continue}
            break}}
        return 0}
      return caml_ba_set_generic(arr,idx,caml_call1(f,idx))}
    function init$6(kind,layout,dims,f)
     {var arr=caml_ba_create(kind,layout,dims),dlen=dims.length - 1;
      return 0 === dlen
              ?arr
              :layout
                ?(floop(arr,caml_make_vect(dlen,1),f,dlen - 1 | 0,dims),arr)
                :(cloop(arr,caml_make_vect(dlen,0),f,0,dims),arr)}
    function dims(a)
     {var n=caml_ba_num_dims(a),d=caml_make_vect(n,0),_eb_=n - 1 | 0,_ea_=0;
      if(! (_eb_ < 0))
       {var i=_ea_;
        for(;;)
         {var _ec_=runtime.caml_ba_dim(a,i);
          caml_check_bound(d,i)[1 + i] = _ec_;
          var _ed_=i + 1 | 0;
          if(_eb_ !== i){var i=_ed_;continue}
          break}}
      return d}
    function size_in_bytes(arr)
     {var _d$_=fold_left$3(caml_mul,1,dims(arr));
      return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)),_d$_)}
    function create$8(kind,layout){return caml_ba_create(kind,layout,[0])}
    function get$3(arr){return runtime.caml_ba_get_generic(arr,[0])}
    function set$2(arr)
     {var _d9_=[0];
      return function(_d__){return caml_ba_set_generic(arr,_d9_,_d__)}}
    function size_in_bytes$0(arr)
     {return kind_size_in_bytes(caml_ba_kind(arr))}
    function of_value(kind,layout,v)
     {var a=create$8(kind,layout);caml_call1(set$2(a),v);return a}
    function create$9(kind,layout,dim)
     {return caml_ba_create(kind,layout,[0,dim])}
    function size_in_bytes$1(arr)
     {var _d8_=caml_ba_dim_1(arr);
      return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)),_d8_)}
    function slice(a,n)
     {var match=runtime.caml_ba_layout(a);
      return match?caml_ba_slice(a,[0,n]):caml_ba_slice(a,[0,n])}
    function init$7(kind,layout,dim,f)
     {var arr=create$9(kind,layout,dim);
      if(layout)
       {var _d6_=1;
        if(! (dim < 1))
         {var i$0=_d6_;
          for(;;)
           {caml_ba_set_1(arr,i$0,caml_call1(f,i$0));
            var _d7_=i$0 + 1 | 0;
            if(dim !== i$0){var i$0=_d7_;continue}
            break}}
        return arr}
      var _d4_=dim - 1 | 0,_d3_=0;
      if(! (_d4_ < 0))
       {var i=_d3_;
        for(;;)
         {caml_ba_set_1(arr,i,caml_call1(f,i));
          var _d5_=i + 1 | 0;
          if(_d4_ !== i){var i=_d5_;continue}
          break}}
      return arr}
    function of_array(kind,layout,data)
     {var
       ba=create$9(kind,layout,data.length - 1),
       ofs=layout?1:0,
       _d1_=data.length - 1 - 1 | 0,
       _d0_=0;
      if(! (_d1_ < 0))
       {var i=_d0_;
        for(;;)
         {caml_ba_set_1(ba,i + ofs | 0,caml_check_bound(data,i)[1 + i]);
          var _d2_=i + 1 | 0;
          if(_d1_ !== i){var i=_d2_;continue}
          break}}
      return ba}
    function create$10(kind,layout,dim1,dim2)
     {return caml_ba_create(kind,layout,[0,dim1,dim2])}
    function size_in_bytes$2(arr)
     {var _dY_=caml_ba_dim_2(arr),_dZ_=caml_ba_dim_1(arr);
      return caml_mul
              (caml_mul(kind_size_in_bytes(caml_ba_kind(arr)),_dZ_),_dY_)}
    function slice_left(a,n){return caml_ba_slice(a,[0,n])}
    function slice_right(a,n){return caml_ba_slice(a,[0,n])}
    function init$8(kind,layout,dim1,dim2,f)
     {var arr=create$10(kind,layout,dim1,dim2);
      if(layout)
       {var _dU_=1;
        if(! (dim2 < 1))
         {var j$0=_dU_;
          for(;;)
           {var _dV_=1;
            if(! (dim1 < 1))
             {var i$0=_dV_;
              for(;;)
               {caml_ba_set_2(arr,i$0,j$0,caml_call2(f,i$0,j$0));
                var _dX_=i$0 + 1 | 0;
                if(dim1 !== i$0){var i$0=_dX_;continue}
                break}}
            var _dW_=j$0 + 1 | 0;
            if(dim2 !== j$0){var j$0=_dW_;continue}
            break}}
        return arr}
      var _dP_=dim1 - 1 | 0,_dO_=0;
      if(! (_dP_ < 0))
       {var i=_dO_;
        for(;;)
         {var _dR_=dim2 - 1 | 0,_dQ_=0;
          if(! (_dR_ < 0))
           {var j=_dQ_;
            for(;;)
             {caml_ba_set_2(arr,i,j,caml_call2(f,i,j));
              var _dT_=j + 1 | 0;
              if(_dR_ !== j){var j=_dT_;continue}
              break}}
          var _dS_=i + 1 | 0;
          if(_dP_ !== i){var i=_dS_;continue}
          break}}
      return arr}
    function of_array$0(kind,layout,data)
     {var
       dim1=data.length - 1,
       dim2=0 === dim1?0:caml_check_bound(data,0)[1].length - 1,
       ba=create$10(kind,layout,dim1,dim2),
       ofs=layout?1:0,
       _dJ_=dim1 - 1 | 0,
       _dI_=0;
      if(! (_dJ_ < 0))
       {var i=_dI_;
        for(;;)
         {var row=caml_check_bound(data,i)[1 + i];
          if(row.length - 1 !== dim2)
           invalid_arg(cst_Bigarray_Array2_of_array_n);
          var _dL_=dim2 - 1 | 0,_dK_=0;
          if(! (_dL_ < 0))
           {var j=_dK_;
            for(;;)
             {caml_ba_set_2
               (ba,i + ofs | 0,j + ofs | 0,caml_check_bound(row,j)[1 + j]);
              var _dN_=j + 1 | 0;
              if(_dL_ !== j){var j=_dN_;continue}
              break}}
          var _dM_=i + 1 | 0;
          if(_dJ_ !== i){var i=_dM_;continue}
          break}}
      return ba}
    function create$11(kind,layout,dim1,dim2,dim3)
     {return caml_ba_create(kind,layout,[0,dim1,dim2,dim3])}
    function size_in_bytes$3(arr)
     {var
       _dF_=runtime.caml_ba_dim_3(arr),
       _dG_=caml_ba_dim_2(arr),
       _dH_=caml_ba_dim_1(arr);
      return caml_mul
              (caml_mul
                (caml_mul(kind_size_in_bytes(caml_ba_kind(arr)),_dH_),_dG_),
               _dF_)}
    function slice_left_1(a,n,m){return caml_ba_slice(a,[0,n,m])}
    function slice_right_1(a,n,m){return caml_ba_slice(a,[0,n,m])}
    function slice_left_2(a,n){return caml_ba_slice(a,[0,n])}
    function slice_right_2(a,n){return caml_ba_slice(a,[0,n])}
    function init$9(kind,layout,dim1,dim2,dim3,f)
     {var arr=create$11(kind,layout,dim1,dim2,dim3);
      if(layout)
       {var _dz_=1;
        if(! (dim3 < 1))
         {var k$0=_dz_;
          for(;;)
           {var _dA_=1;
            if(! (dim2 < 1))
             {var j$0=_dA_;
              for(;;)
               {var _dC_=1;
                if(! (dim1 < 1))
                 {var i$0=_dC_;
                  for(;;)
                   {caml_ba_set_3(arr,i$0,j$0,k$0,caml_call3(f,i$0,j$0,k$0));
                    var _dE_=i$0 + 1 | 0;
                    if(dim1 !== i$0){var i$0=_dE_;continue}
                    break}}
                var _dD_=j$0 + 1 | 0;
                if(dim2 !== j$0){var j$0=_dD_;continue}
                break}}
            var _dB_=k$0 + 1 | 0;
            if(dim3 !== k$0){var k$0=_dB_;continue}
            break}}
        return arr}
      var _dr_=dim1 - 1 | 0,_dq_=0;
      if(! (_dr_ < 0))
       {var i=_dq_;
        for(;;)
         {var _dt_=dim2 - 1 | 0,_ds_=0;
          if(! (_dt_ < 0))
           {var j=_ds_;
            for(;;)
             {var _dw_=dim3 - 1 | 0,_dv_=0;
              if(! (_dw_ < 0))
               {var k=_dv_;
                for(;;)
                 {caml_ba_set_3(arr,i,j,k,caml_call3(f,i,j,k));
                  var _dy_=k + 1 | 0;
                  if(_dw_ !== k){var k=_dy_;continue}
                  break}}
              var _dx_=j + 1 | 0;
              if(_dt_ !== j){var j=_dx_;continue}
              break}}
          var _du_=i + 1 | 0;
          if(_dr_ !== i){var i=_du_;continue}
          break}}
      return arr}
    function of_array$1(kind,layout,data)
     {var
       dim1=data.length - 1,
       dim2=0 === dim1?0:caml_check_bound(data,0)[1].length - 1,
       dim3=
        0 === dim2
         ?0
         :caml_check_bound(caml_check_bound(data,0)[1],0)[1].length - 1,
       ba=create$11(kind,layout,dim1,dim2,dim3),
       ofs=layout?1:0,
       _di_=dim1 - 1 | 0,
       _dh_=0;
      if(! (_di_ < 0))
       {var i=_dh_;
        for(;;)
         {var row=caml_check_bound(data,i)[1 + i];
          if(row.length - 1 !== dim2)
           invalid_arg(cst_Bigarray_Array3_of_array_n);
          var _dk_=dim2 - 1 | 0,_dj_=0;
          if(! (_dk_ < 0))
           {var j=_dj_;
            for(;;)
             {var col=caml_check_bound(row,j)[1 + j];
              if(col.length - 1 !== dim3)
               invalid_arg(cst_Bigarray_Array3_of_array_n$0);
              var _dn_=dim3 - 1 | 0,_dm_=0;
              if(! (_dn_ < 0))
               {var k=_dm_;
                for(;;)
                 {caml_ba_set_3
                   (ba,
                    i + ofs | 0,
                    j + ofs | 0,
                    k + ofs | 0,
                    caml_check_bound(col,k)[1 + k]);
                  var _dp_=k + 1 | 0;
                  if(_dn_ !== k){var k=_dp_;continue}
                  break}}
              var _do_=j + 1 | 0;
              if(_dk_ !== j){var j=_do_;continue}
              break}}
          var _dl_=i + 1 | 0;
          if(_di_ !== i){var i=_dl_;continue}
          break}}
      return ba}
    function array0_of_genarray(a)
     {return 0 === caml_ba_num_dims(a)
              ?a
              :invalid_arg(cst_Bigarray_array0_of_genarra)}
    function array1_of_genarray(a)
     {return 1 === caml_ba_num_dims(a)
              ?a
              :invalid_arg(cst_Bigarray_array1_of_genarra)}
    function array2_of_genarray(a)
     {return 2 === caml_ba_num_dims(a)
              ?a
              :invalid_arg(cst_Bigarray_array2_of_genarra)}
    function array3_of_genarray(a)
     {return 3 === caml_ba_num_dims(a)
              ?a
              :invalid_arg(cst_Bigarray_array3_of_genarra)}
    function reshape_0(a){return caml_ba_reshape(a,[0])}
    function reshape_1(a,dim1){return caml_ba_reshape(a,[0,dim1])}
    function reshape_2(a,dim1,dim2){return caml_ba_reshape(a,[0,dim1,dim2])}
    function reshape_3(a,dim1,dim2,dim3)
     {return caml_ba_reshape(a,[0,dim1,dim2,dim3])}
    var
     Stdlib_Bigarray=
      [0,
       float32,
       float64,
       complex32,
       complex64,
       int8_signed,
       int8_unsigned,
       int16_signed,
       int16_unsigned,
       int$2,
       int32$1,
       int64$1,
       nativeint$1,
       char$0,
       kind_size_in_bytes,
       c_layout,
       fortran_layout,
       [0,init$6,dims,size_in_bytes],
       [0,
        create$8,
        of_value,
        caml_ba_change_layout,
        size_in_bytes$0,
        get$3,
        set$2,
        of_value],
       [0,
        create$9,
        init$7,
        caml_ba_change_layout,
        size_in_bytes$1,
        slice,
        of_array],
       [0,
        create$10,
        init$8,
        caml_ba_change_layout,
        size_in_bytes$2,
        slice_left,
        slice_right,
        of_array$0],
       [0,
        create$11,
        init$9,
        caml_ba_change_layout,
        size_in_bytes$3,
        slice_left_1,
        slice_right_1,
        slice_left_2,
        slice_right_2,
        of_array$1],
       array0_of_genarray,
       array1_of_genarray,
       array2_of_genarray,
       array3_of_genarray,
       caml_ba_reshape,
       reshape_0,
       reshape_1,
       reshape_2,
       reshape_3];
    caml_register_global(834,Stdlib_Bigarray,"Stdlib__Bigarray");
    function with_open(openfun,s,f)
     {var ic=caml_call1(openfun,s);
      function _dg_(param){return caml_call1(f,ic)}
      return protect(function(param){return close_noerr$0(ic)},_dg_)}
    function with_open_bin(s,f){return with_open(open_bin$0,s,f)}
    function with_open_text(s,f){return with_open(open_text$0,s,f)}
    function with_open_gen(flags,perm,s,f)
     {return with_open(function(_df_){return open_gen$0(flags,perm,_df_)},s,f)}
    var seek=_m_[4],pos=_m_[5],length$11=_m_[6];
    function input_char$0(ic)
     {try
       {var c=caml_ml_input_char(ic)}
      catch(_de_)
       {_de_ = caml_wrap_exception(_de_);
        if(_de_ === End_of_file)return 0;
        throw _de_}
      return [0,c]}
    function input_byte$0(ic)
     {try
       {var n=caml_ml_input_char(ic)}
      catch(_dd_)
       {_dd_ = caml_wrap_exception(_dd_);
        if(_dd_ === End_of_file)return 0;
        throw _dd_}
      return [0,n]}
    function input_line$0(ic)
     {try
       {var s=input_line(ic)}
      catch(_dc_)
       {_dc_ = caml_wrap_exception(_dc_);
        if(_dc_ === End_of_file)return 0;
        throw _dc_}
      return [0,s]}
    function really_input$0(ic,buf,pos,len)
     {try
       {really_input(ic,buf,pos,len);return _c1_}
      catch(_db_)
       {_db_ = caml_wrap_exception(_db_);
        if(_db_ === End_of_file)return 0;
        throw _db_}}
    function really_input_string$0(ic,len)
     {try
       {var s=really_input_string(ic,len)}
      catch(_da_)
       {_da_ = caml_wrap_exception(_da_);
        if(_da_ === End_of_file)return 0;
        throw _da_}
      return [0,s]}
    function read_upto(ic,buf,ofs,len)
     {var ofs$0=ofs,len$0=len;
      for(;;)
       {if(0 !== len$0)
         {var r=input(ic,buf,ofs$0,len$0);
          if(0 !== r)
           {var
             len$1=len$0 - r | 0,
             ofs$1=ofs$0 + r | 0,
             ofs$0=ofs$1,
             len$0=len$1;
            continue}}
        return ofs$0 - ofs | 0}}
    function ensure(buf,ofs,n)
     {var len=caml_ml_bytes_length(buf);
      if((ofs + n | 0) <= len)return buf;
      var new_len=[0,len];
      for(;;)
       {if(new_len[1] < (ofs + n | 0))
         {new_len[1] = (2 * new_len[1] | 0) + 1 | 0;continue}
        var
         new_len$0=new_len[1],
         new_len$1=
          new_len$0 <= max_string_length
           ?new_len$0
           :ofs < max_string_length
             ?max_string_length
             :failwith(cst_In_channel_input_all_chann),
         new_buf=caml_create_bytes(new_len$1);
        blit(buf,0,new_buf,0,ofs);
        return new_buf}}
    function input_all(ic)
     {var chunk_size=65536;
      try
       {var
         _c8_=caml_ml_pos_in(ic),
         _c9_=caml_ml_channel_size(ic) - _c8_ | 0,
         initial_size=_c9_}
      catch(_c$_)
       {_c$_ = caml_wrap_exception(_c$_);
        if(_c$_[1] !== Sys_error)throw _c$_;
        var initial_size=-1}
      var
       initial_size$0=0 <= initial_size?initial_size:chunk_size,
       initial_size$1=
        initial_size$0 <= max_string_length?initial_size$0:max_string_length,
       buf=caml_create_bytes(initial_size$1),
       nread=read_upto(ic,buf,0,initial_size$1);
      if(nread < initial_size$1)return sub_string(buf,0,nread);
      try
       {var c=caml_ml_input_char(ic)}
      catch(_c__)
       {_c__ = caml_wrap_exception(_c__);
        if(_c__ === End_of_file)return caml_string_of_bytes(buf);
        throw _c__}
      function loop(buf,ofs)
       {var buf$0=buf,ofs$0=ofs;
        for(;;)
         {var
           buf$1=ensure(buf$0,ofs$0,chunk_size),
           rem=caml_ml_bytes_length(buf$1) - ofs$0 | 0,
           r=read_upto(ic,buf$1,ofs$0,rem);
          if(r < rem)return sub_string(buf$1,0,ofs$0 + r | 0);
          var ofs$1=ofs$0 + rem | 0,buf$0=buf$1,ofs$0=ofs$1;
          continue}}
      var buf$0=ensure(buf,nread,65537);
      caml_bytes_set(buf$0,nread,c);
      return loop(buf$0,nread + 1 | 0)}
    var
     Stdlib_In_channel=
      [0,
       stdin,
       open_bin$0,
       open_text$0,
       open_gen$0,
       with_open_bin,
       with_open_text,
       with_open_gen,
       seek,
       pos,
       length$11,
       close$0,
       close_noerr$0,
       input_char$0,
       input_byte$0,
       input_line$0,
       input,
       really_input$0,
       really_input_string$0,
       input_all,
       set_binary_mode];
    caml_register_global(835,Stdlib_In_channel,"Stdlib__In_channel");
    function with_open$0(openfun,s,f)
     {var oc=caml_call1(openfun,s);
      function _c7_(param){return caml_call1(f,oc)}
      return protect(function(param){return close_noerr(oc)},_c7_)}
    function with_open_bin$0(s,f){return with_open$0(open_bin,s,f)}
    function with_open_text$0(s,f){return with_open$0(open_text,s,f)}
    function with_open_gen$0(flags,perm,s,f)
     {return with_open$0(function(_c6_){return open_gen(flags,perm,_c6_)},s,f)}
    var
     seek$0=_m_[1],
     pos$0=_m_[2],
     length$12=_m_[3],
     Stdlib_Out_channel=
      [0,
       stdout,
       stderr,
       open_bin,
       open_text,
       open_gen,
       with_open_bin$0,
       with_open_text$0,
       with_open_gen$0,
       seek$0,
       pos$0,
       length$12,
       close,
       close_noerr,
       flush,
       flush_all,
       output_char,
       output_byte,
       output_string,
       output_bytes,
       output,
       output_substring,
       set_binary_mode$0,
       runtime.caml_ml_set_buffered,
       runtime.caml_ml_is_buffered];
    caml_register_global(836,Stdlib_Out_channel,"Stdlib__Out_channel");
    return}
  (globalThis));


//# 1 "../inventaire_linge/.inventaire_linge.objs/inventaire_linge.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_list_of_js_array=runtime.caml_list_of_js_array,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes,
     cst_Chambre_1=caml_string_of_jsbytes("Chambre 1"),
     cst_Chambre_2=caml_string_of_jsbytes("Chambre 2"),
     cst_Chambre_3=caml_string_of_jsbytes("Chambre 3"),
     cst_S_jour=caml_string_of_jsbytes("S\xc3\xa9jour"),
     cst_Salle_de_bains_1=caml_string_of_jsbytes("Salle de bains 1"),
     cst_Salle_de_bains_2=caml_string_of_jsbytes("Salle de bains 2"),
     cst_ch1=caml_string_of_jsbytes("ch1"),
     cst_ch2=caml_string_of_jsbytes("ch2"),
     cst_ch3=caml_string_of_jsbytes("ch3"),
     cst_sj=caml_string_of_jsbytes("sj"),
     cst_sdb1=caml_string_of_jsbytes("sdb1"),
     cst_sdb2=caml_string_of_jsbytes("sdb2"),
     tarif=caml_string_of_jsbytes("2022-2023"),
     destinataires=
      caml_string_of_jsbytes("dubuval@gmail.com,guy.grange@wanadoo.fr"),
     pieces=[0,0,[0,1,[0,2,[0,3,[0,4,[0,5,0]]]]]],
     fournitures=
      caml_list_of_js_array
       ([[0,
          caml_string_of_jsbytes("dh80"),
          caml_string_of_jsbytes("Drap housse 80 cm"),
          4,
          [0,[0,0,2],0]],
         [0,
          caml_string_of_jsbytes("dh90"),
          caml_string_of_jsbytes("Drap housse 90 cm"),
          4,
          [0,[0,2,4],0]],
         [0,
          caml_string_of_jsbytes("dh140"),
          caml_string_of_jsbytes("Drap housse 140 cm"),
          7,
          [0,[0,1,1],[0,[0,3,1],0]]],
         [0,
          caml_string_of_jsbytes("dhbb"),
          caml_string_of_jsbytes("Drap housse b\xc3\xa9b\xc3\xa9"),
          2,
          [0,[0,0,1],0]],
         [0,
          caml_string_of_jsbytes("hc1p"),
          caml_string_of_jsbytes("Housse de couette 1 place"),
          7,
          [0,[0,0,2],[0,[0,2,4],0]]],
         [0,
          caml_string_of_jsbytes("hc2p"),
          caml_string_of_jsbytes("Housse de couette 2 places"),
          10,
          [0,[0,1,1],[0,[0,3,1],0]]],
         [0,
          caml_string_of_jsbytes("hcbb"),
          caml_string_of_jsbytes("Housse de couette b\xc3\xa9b\xc3\xa9"),
          3,
          [0,[0,0,1],0]],
         [0,
          caml_string_of_jsbytes("litbb"),
          caml_string_of_jsbytes("Lit b\xc3\xa9b\xc3\xa9"),
          8,
          [0,[0,0,1],0]],
         [0,
          caml_string_of_jsbytes("pm80"),
          caml_string_of_jsbytes("Prot\xc3\xa8ge matelas 80 cm"),
          0,
          [0,[0,0,2],0]],
         [0,
          caml_string_of_jsbytes("pm90"),
          caml_string_of_jsbytes("Prot\xc3\xa8ge matelas 90 cm"),
          0,
          [0,[0,2,4],0]],
         [0,
          caml_string_of_jsbytes("pm140"),
          caml_string_of_jsbytes("Prot\xc3\xa8ge matelas 140 cm"),
          0,
          [0,[0,1,1],[0,[0,3,1],0]]],
         [0,
          caml_string_of_jsbytes("pmbb"),
          caml_string_of_jsbytes("Prot\xc3\xa8ge matelas b\xc3\xa9b\xc3\xa9"),
          0,
          [0,[0,0,1],0]],
         [0,
          caml_string_of_jsbytes("taie"),
          caml_string_of_jsbytes("Taie d\xe2\x80\x99oreiller"),
          1,
          [0,[0,0,4],[0,[0,1,4],[0,[0,2,8],[0,[0,3,4],0]]]]],
         [0,
          caml_string_of_jsbytes("douche"),
          caml_string_of_jsbytes("Drap de douche"),
          2,
          [0,[0,4,3],[0,[0,5,3],0]]],
         [0,
          caml_string_of_jsbytes("gant"),
          caml_string_of_jsbytes("Gant de toilette"),
          1,
          [0,[0,4,4],[0,[0,5,6],0]]],
         [0,
          caml_string_of_jsbytes("serv"),
          caml_string_of_jsbytes("Serviette de toilette"),
          1,
          [0,[0,4,4],[0,[0,5,6],0]]],
         [0,
          caml_string_of_jsbytes("inv"),
          caml_string_of_jsbytes("Serviette invit\xc3\xa9s"),
          1,
          [0,[0,4,1],[0,[0,5,1],0]]],
         [0,
          caml_string_of_jsbytes("tapis"),
          caml_string_of_jsbytes("Tapis de douche"),
          2,
          [0,[0,4,2],[0,[0,5,2],0]]],
         [0,
          caml_string_of_jsbytes("mains"),
          caml_string_of_jsbytes("Essuie-mains"),
          1,
          [0,[0,3,2],0]],
         [0,
          caml_string_of_jsbytes("table"),
          caml_string_of_jsbytes("Serviettes de table"),
          1,
          [0,[0,3,10],0]],
         [0,
          caml_string_of_jsbytes("torchon"),
          caml_string_of_jsbytes("Torchons \xc3\xa0 vaisselle"),
          1,
          [0,[0,3,2],0]],
         [0,
          caml_string_of_jsbytes("microfibre"),
          caml_string_of_jsbytes("Torchons microfibre"),
          0,
          [0,[0,4,2],[0,[0,5,2],[0,[0,3,2],0]]]]]);
    function short_string_of_piece(param)
     {switch(param)
       {case 0:return cst_ch1;
        case 1:return cst_ch2;
        case 2:return cst_ch3;
        case 3:return cst_sj;
        case 4:return cst_sdb1;
        default:return cst_sdb2}}
    function long_string_of_piece(param)
     {switch(param)
       {case 0:return cst_Chambre_1;
        case 1:return cst_Chambre_2;
        case 2:return cst_Chambre_3;
        case 3:return cst_S_jour;
        case 4:return cst_Salle_de_bains_1;
        default:return cst_Salle_de_bains_2}}
    var
     Inventaire_linge=
      [0,
       tarif,
       destinataires,
       pieces,
       short_string_of_piece,
       long_string_of_piece,
       fournitures];
    runtime.caml_register_global(16,Inventaire_linge,"Inventaire_linge");
    return}
  (globalThis));


//# 1 "../.js/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_exn_with_js_backtrace=runtime.caml_exn_with_js_backtrace,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes;
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_Jsoo_runtime_Error_Exn=
      caml_string_of_jsbytes("Jsoo_runtime.Error.Exn"),
     cst_jsError=caml_string_of_jsbytes("jsError"),
     Stdlib_Callback=global_data.Stdlib__Callback,
     Js=[0],
     Sys=[0],
     Exn=[248,cst_Jsoo_runtime_Error_Exn,runtime.caml_fresh_oo_id(0)];
    caml_call2(Stdlib_Callback[2],cst_jsError,[0,Exn,[0]]);
    function raise(exn){throw exn}
    var
     Error=
      [0,
       raise,
       caml_exn_with_js_backtrace,
       runtime.caml_js_error_option_of_exception,
       Exn],
     For_compatibility_only=[0],
     Bigstring=[0],
     Typed_array=[0,Bigstring],
     Int64=[0],
     Jsoo_runtime=[0,Js,Sys,Error,For_compatibility_only,Typed_array,Int64];
    runtime.caml_register_global(4,Jsoo_runtime,"Jsoo_runtime");
    return}
  (globalThis));


//# 1 "../.js/js_of_ocaml/js_of_ocaml.cma.js"
(function(globalThis)
   {"use strict";
    var
     jsoo_exports=typeof module === "object" && module.exports || globalThis,
     runtime=globalThis.jsoo_runtime,
     caml_float_of_string=runtime.caml_float_of_string,
     caml_fresh_oo_id=runtime.caml_fresh_oo_id,
     caml_int_of_string=runtime.caml_int_of_string,
     caml_js_from_array=runtime.caml_js_from_array,
     caml_js_get=runtime.caml_js_get,
     caml_js_html_escape=runtime.caml_js_html_escape,
     caml_js_set=runtime.caml_js_set,
     caml_js_wrap_callback=runtime.caml_js_wrap_callback,
     caml_js_wrap_meth_callback=runtime.caml_js_wrap_meth_callback,
     caml_jsbytes_of_string=runtime.caml_jsbytes_of_string,
     caml_jsstring_of_string=runtime.caml_jsstring_of_string,
     caml_list_of_js_array=runtime.caml_list_of_js_array,
     caml_ml_string_length=runtime.caml_ml_string_length,
     caml_register_global=runtime.caml_register_global,
     caml_string_compare=runtime.caml_string_compare,
     caml_string_notequal=runtime.caml_string_notequal,
     caml_string_of_array=runtime.caml_string_of_array,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes,
     caml_string_of_jsstring=runtime.caml_string_of_jsstring,
     caml_wrap_exception=runtime.caml_wrap_exception;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    function caml_call5(f,a0,a1,a2,a3,a4)
     {return f.length == 5
              ?f(a0,a1,a2,a3,a4)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_parseFloat=caml_string_of_jsbytes("parseFloat"),
     cst_parseInt=caml_string_of_jsbytes("parseInt"),
     cst_can_t_retrieve_file_name_n=
      caml_string_of_jsbytes("can't retrieve file name: not implemented"),
     cst_endings=caml_string_of_jsbytes("endings"),
     cst_type=caml_string_of_jsbytes("type"),
     cst_loadstart=caml_string_of_jsbytes("loadstart"),
     cst_progress=caml_string_of_jsbytes("progress"),
     cst_abort=caml_string_of_jsbytes("abort"),
     cst_error=caml_string_of_jsbytes("error"),
     cst_load=caml_string_of_jsbytes("load"),
     cst_loadend=caml_string_of_jsbytes("loadend"),
     cst_a$1=caml_string_of_jsbytes("a"),
     cst_area$1=caml_string_of_jsbytes("area"),
     cst_audio$1=caml_string_of_jsbytes("audio"),
     cst_base$1=caml_string_of_jsbytes("base"),
     cst_blockquote$1=caml_string_of_jsbytes("blockquote"),
     cst_body$1=caml_string_of_jsbytes("body"),
     cst_br$1=caml_string_of_jsbytes("br"),
     cst_button$1=caml_string_of_jsbytes("button"),
     cst_canvas$1=caml_string_of_jsbytes("canvas"),
     cst_caption$1=caml_string_of_jsbytes("caption"),
     cst_col$1=caml_string_of_jsbytes("col"),
     cst_colgroup$1=caml_string_of_jsbytes("colgroup"),
     cst_del$1=caml_string_of_jsbytes("del"),
     cst_div$1=caml_string_of_jsbytes("div"),
     cst_dl$1=caml_string_of_jsbytes("dl"),
     cst_embed$1=caml_string_of_jsbytes("embed"),
     cst_fieldset$1=caml_string_of_jsbytes("fieldset"),
     cst_form$1=caml_string_of_jsbytes("form"),
     cst_frame$1=caml_string_of_jsbytes("frame"),
     cst_frameset$1=caml_string_of_jsbytes("frameset"),
     cst_h1$1=caml_string_of_jsbytes("h1"),
     cst_h2$1=caml_string_of_jsbytes("h2"),
     cst_h3$1=caml_string_of_jsbytes("h3"),
     cst_h4$1=caml_string_of_jsbytes("h4"),
     cst_h5$1=caml_string_of_jsbytes("h5"),
     cst_h6$1=caml_string_of_jsbytes("h6"),
     cst_head$1=caml_string_of_jsbytes("head"),
     cst_hr$1=caml_string_of_jsbytes("hr"),
     cst_html$1=caml_string_of_jsbytes("html"),
     cst_iframe$1=caml_string_of_jsbytes("iframe"),
     cst_img$1=caml_string_of_jsbytes("img"),
     cst_input$2=caml_string_of_jsbytes("input"),
     cst_ins$1=caml_string_of_jsbytes("ins"),
     cst_label$1=caml_string_of_jsbytes("label"),
     cst_legend$1=caml_string_of_jsbytes("legend"),
     cst_li$1=caml_string_of_jsbytes("li"),
     cst_link$1=caml_string_of_jsbytes("link"),
     cst_map$1=caml_string_of_jsbytes("map"),
     cst_meta$1=caml_string_of_jsbytes("meta"),
     cst_object$1=caml_string_of_jsbytes("object"),
     cst_ol$1=caml_string_of_jsbytes("ol"),
     cst_optgroup$1=caml_string_of_jsbytes("optgroup"),
     cst_option$1=caml_string_of_jsbytes("option"),
     cst_p$1=caml_string_of_jsbytes("p"),
     cst_param$1=caml_string_of_jsbytes("param"),
     cst_pre$1=caml_string_of_jsbytes("pre"),
     cst_q$1=caml_string_of_jsbytes("q"),
     cst_script$1=caml_string_of_jsbytes("script"),
     cst_select$2=caml_string_of_jsbytes("select"),
     cst_style$1=caml_string_of_jsbytes("style"),
     cst_table$1=caml_string_of_jsbytes("table"),
     cst_tbody$1=caml_string_of_jsbytes("tbody"),
     cst_td$1=caml_string_of_jsbytes("td"),
     cst_textarea$1=caml_string_of_jsbytes("textarea"),
     cst_tfoot$1=caml_string_of_jsbytes("tfoot"),
     cst_th$1=caml_string_of_jsbytes("th"),
     cst_thead$1=caml_string_of_jsbytes("thead"),
     cst_title$1=caml_string_of_jsbytes("title"),
     cst_tr$1=caml_string_of_jsbytes("tr"),
     cst_ul$1=caml_string_of_jsbytes("ul"),
     cst_video$1=caml_string_of_jsbytes("video"),
     cst_KeyH=caml_string_of_jsbytes("KeyH"),
     cst_Digit6=caml_string_of_jsbytes("Digit6"),
     cst_BrowserRefresh=caml_string_of_jsbytes("BrowserRefresh"),
     cst_Backslash=caml_string_of_jsbytes("Backslash"),
     cst_AltLeft=caml_string_of_jsbytes("AltLeft"),
     cst_AltRight=caml_string_of_jsbytes("AltRight"),
     cst_ArrowDown=caml_string_of_jsbytes("ArrowDown"),
     cst_ArrowLeft=caml_string_of_jsbytes("ArrowLeft"),
     cst_ArrowRight=caml_string_of_jsbytes("ArrowRight"),
     cst_ArrowUp=caml_string_of_jsbytes("ArrowUp"),
     cst_Backquote=caml_string_of_jsbytes("Backquote"),
     cst_Backspace=caml_string_of_jsbytes("Backspace"),
     cst_BracketLeft=caml_string_of_jsbytes("BracketLeft"),
     cst_BracketRight=caml_string_of_jsbytes("BracketRight"),
     cst_BrowserBack=caml_string_of_jsbytes("BrowserBack"),
     cst_BrowserFavorites=caml_string_of_jsbytes("BrowserFavorites"),
     cst_BrowserForward=caml_string_of_jsbytes("BrowserForward"),
     cst_BrowserHome=caml_string_of_jsbytes("BrowserHome"),
     cst_Delete=caml_string_of_jsbytes("Delete"),
     cst_BrowserSearch=caml_string_of_jsbytes("BrowserSearch"),
     cst_BrowserStop=caml_string_of_jsbytes("BrowserStop"),
     cst_CapsLock=caml_string_of_jsbytes("CapsLock"),
     cst_Comma=caml_string_of_jsbytes("Comma"),
     cst_ContextMenu=caml_string_of_jsbytes("ContextMenu"),
     cst_ControlLeft=caml_string_of_jsbytes("ControlLeft"),
     cst_ControlRight=caml_string_of_jsbytes("ControlRight"),
     cst_Digit0=caml_string_of_jsbytes("Digit0"),
     cst_Digit1=caml_string_of_jsbytes("Digit1"),
     cst_Digit2=caml_string_of_jsbytes("Digit2"),
     cst_Digit3=caml_string_of_jsbytes("Digit3"),
     cst_Digit4=caml_string_of_jsbytes("Digit4"),
     cst_Digit5=caml_string_of_jsbytes("Digit5"),
     cst_F6=caml_string_of_jsbytes("F6"),
     cst_F1=caml_string_of_jsbytes("F1"),
     cst_Digit7=caml_string_of_jsbytes("Digit7"),
     cst_Digit8=caml_string_of_jsbytes("Digit8"),
     cst_Digit9=caml_string_of_jsbytes("Digit9"),
     cst_End=caml_string_of_jsbytes("End"),
     cst_Enter=caml_string_of_jsbytes("Enter"),
     cst_Equal=caml_string_of_jsbytes("Equal"),
     cst_Escape=caml_string_of_jsbytes("Escape"),
     cst_F10=caml_string_of_jsbytes("F10"),
     cst_F11=caml_string_of_jsbytes("F11"),
     cst_F12=caml_string_of_jsbytes("F12"),
     cst_F2=caml_string_of_jsbytes("F2"),
     cst_F3=caml_string_of_jsbytes("F3"),
     cst_F4=caml_string_of_jsbytes("F4"),
     cst_F5=caml_string_of_jsbytes("F5"),
     cst_KeyA=caml_string_of_jsbytes("KeyA"),
     cst_F7=caml_string_of_jsbytes("F7"),
     cst_F8=caml_string_of_jsbytes("F8"),
     cst_F9=caml_string_of_jsbytes("F9"),
     cst_Home=caml_string_of_jsbytes("Home"),
     cst_Insert=caml_string_of_jsbytes("Insert"),
     cst_IntlBackslash=caml_string_of_jsbytes("IntlBackslash"),
     cst_IntlYen=caml_string_of_jsbytes("IntlYen"),
     cst_KeyB=caml_string_of_jsbytes("KeyB"),
     cst_KeyC=caml_string_of_jsbytes("KeyC"),
     cst_KeyD=caml_string_of_jsbytes("KeyD"),
     cst_KeyE=caml_string_of_jsbytes("KeyE"),
     cst_KeyF=caml_string_of_jsbytes("KeyF"),
     cst_KeyG=caml_string_of_jsbytes("KeyG"),
     cst_Numpad4=caml_string_of_jsbytes("Numpad4"),
     cst_KeyX=caml_string_of_jsbytes("KeyX"),
     cst_KeyP=caml_string_of_jsbytes("KeyP"),
     cst_KeyI=caml_string_of_jsbytes("KeyI"),
     cst_KeyJ=caml_string_of_jsbytes("KeyJ"),
     cst_KeyK=caml_string_of_jsbytes("KeyK"),
     cst_KeyL=caml_string_of_jsbytes("KeyL"),
     cst_KeyM=caml_string_of_jsbytes("KeyM"),
     cst_KeyN=caml_string_of_jsbytes("KeyN"),
     cst_KeyO=caml_string_of_jsbytes("KeyO"),
     cst_KeyQ=caml_string_of_jsbytes("KeyQ"),
     cst_KeyR=caml_string_of_jsbytes("KeyR"),
     cst_KeyS=caml_string_of_jsbytes("KeyS"),
     cst_KeyT=caml_string_of_jsbytes("KeyT"),
     cst_KeyU=caml_string_of_jsbytes("KeyU"),
     cst_KeyV=caml_string_of_jsbytes("KeyV"),
     cst_KeyW=caml_string_of_jsbytes("KeyW"),
     cst_MetaRight=caml_string_of_jsbytes("MetaRight"),
     cst_KeyY=caml_string_of_jsbytes("KeyY"),
     cst_KeyZ=caml_string_of_jsbytes("KeyZ"),
     cst_MediaPlayPause=caml_string_of_jsbytes("MediaPlayPause"),
     cst_MediaStop=caml_string_of_jsbytes("MediaStop"),
     cst_MediaTrackNext=caml_string_of_jsbytes("MediaTrackNext"),
     cst_MediaTrackPrevious=caml_string_of_jsbytes("MediaTrackPrevious"),
     cst_MetaLeft=caml_string_of_jsbytes("MetaLeft"),
     cst_Minus=caml_string_of_jsbytes("Minus"),
     cst_NumLock=caml_string_of_jsbytes("NumLock"),
     cst_Numpad0=caml_string_of_jsbytes("Numpad0"),
     cst_Numpad1=caml_string_of_jsbytes("Numpad1"),
     cst_Numpad2=caml_string_of_jsbytes("Numpad2"),
     cst_Numpad3=caml_string_of_jsbytes("Numpad3"),
     cst_PageUp=caml_string_of_jsbytes("PageUp"),
     cst_NumpadDivide=caml_string_of_jsbytes("NumpadDivide"),
     cst_Numpad5=caml_string_of_jsbytes("Numpad5"),
     cst_Numpad6=caml_string_of_jsbytes("Numpad6"),
     cst_Numpad7=caml_string_of_jsbytes("Numpad7"),
     cst_Numpad8=caml_string_of_jsbytes("Numpad8"),
     cst_Numpad9=caml_string_of_jsbytes("Numpad9"),
     cst_NumpadAdd=caml_string_of_jsbytes("NumpadAdd"),
     cst_NumpadDecimal=caml_string_of_jsbytes("NumpadDecimal"),
     cst_NumpadEnter=caml_string_of_jsbytes("NumpadEnter"),
     cst_NumpadEqual=caml_string_of_jsbytes("NumpadEqual"),
     cst_NumpadMultiply=caml_string_of_jsbytes("NumpadMultiply"),
     cst_NumpadSubtract=caml_string_of_jsbytes("NumpadSubtract"),
     cst_OSLeft=caml_string_of_jsbytes("OSLeft"),
     cst_OSRight=caml_string_of_jsbytes("OSRight"),
     cst_PageDown=caml_string_of_jsbytes("PageDown"),
     cst_ShiftRight=caml_string_of_jsbytes("ShiftRight"),
     cst_Pause=caml_string_of_jsbytes("Pause"),
     cst_Period=caml_string_of_jsbytes("Period"),
     cst_PrintScreen=caml_string_of_jsbytes("PrintScreen"),
     cst_Quote=caml_string_of_jsbytes("Quote"),
     cst_ScrollLock=caml_string_of_jsbytes("ScrollLock"),
     cst_Semicolon=caml_string_of_jsbytes("Semicolon"),
     cst_ShiftLeft=caml_string_of_jsbytes("ShiftLeft"),
     cst_Slash=caml_string_of_jsbytes("Slash"),
     cst_Space=caml_string_of_jsbytes("Space"),
     cst_Tab=caml_string_of_jsbytes("Tab"),
     cst_VolumeDown=caml_string_of_jsbytes("VolumeDown"),
     cst_VolumeMute=caml_string_of_jsbytes("VolumeMute"),
     cst_VolumeUp=caml_string_of_jsbytes("VolumeUp"),
     cst_mouseout$0=caml_string_of_jsbytes("mouseout"),
     cst_mouseover$0=caml_string_of_jsbytes("mouseover"),
     cst_video$0=caml_string_of_jsbytes("video"),
     cst_audio$0=caml_string_of_jsbytes("audio"),
     cst_ul$0=caml_string_of_jsbytes("ul"),
     cst_tr$0=caml_string_of_jsbytes("tr"),
     cst_title$0=caml_string_of_jsbytes("title"),
     cst_thead$0=caml_string_of_jsbytes("thead"),
     cst_th$0=caml_string_of_jsbytes("th"),
     cst_tfoot$0=caml_string_of_jsbytes("tfoot"),
     cst_textarea$0=caml_string_of_jsbytes("textarea"),
     cst_td$0=caml_string_of_jsbytes("td"),
     cst_tbody$0=caml_string_of_jsbytes("tbody"),
     cst_table$0=caml_string_of_jsbytes("table"),
     cst_style$0=caml_string_of_jsbytes("style"),
     cst_select$1=caml_string_of_jsbytes("select"),
     cst_script$0=caml_string_of_jsbytes("script"),
     cst_q$0=caml_string_of_jsbytes("q"),
     cst_pre$0=caml_string_of_jsbytes("pre"),
     cst_param$0=caml_string_of_jsbytes("param"),
     cst_p$0=caml_string_of_jsbytes("p"),
     cst_option$0=caml_string_of_jsbytes("option"),
     cst_optgroup$0=caml_string_of_jsbytes("optgroup"),
     cst_ol$0=caml_string_of_jsbytes("ol"),
     cst_object$0=caml_string_of_jsbytes("object"),
     cst_meta$0=caml_string_of_jsbytes("meta"),
     cst_map$0=caml_string_of_jsbytes("map"),
     cst_link$0=caml_string_of_jsbytes("link"),
     cst_li$0=caml_string_of_jsbytes("li"),
     cst_legend$0=caml_string_of_jsbytes("legend"),
     cst_label$0=caml_string_of_jsbytes("label"),
     cst_ins$0=caml_string_of_jsbytes("ins"),
     cst_input$1=caml_string_of_jsbytes("input"),
     cst_img$0=caml_string_of_jsbytes("img"),
     cst_iframe$0=caml_string_of_jsbytes("iframe"),
     cst_html$0=caml_string_of_jsbytes("html"),
     cst_hr$0=caml_string_of_jsbytes("hr"),
     cst_head$0=caml_string_of_jsbytes("head"),
     cst_h6$0=caml_string_of_jsbytes("h6"),
     cst_h5$0=caml_string_of_jsbytes("h5"),
     cst_h4$0=caml_string_of_jsbytes("h4"),
     cst_h3$0=caml_string_of_jsbytes("h3"),
     cst_h2$0=caml_string_of_jsbytes("h2"),
     cst_h1$0=caml_string_of_jsbytes("h1"),
     cst_frame$0=caml_string_of_jsbytes("frame"),
     cst_frameset$0=caml_string_of_jsbytes("frameset"),
     cst_form$0=caml_string_of_jsbytes("form"),
     cst_embed$0=caml_string_of_jsbytes("embed"),
     cst_fieldset$0=caml_string_of_jsbytes("fieldset"),
     cst_dl$0=caml_string_of_jsbytes("dl"),
     cst_div$0=caml_string_of_jsbytes("div"),
     cst_del$0=caml_string_of_jsbytes("del"),
     cst_colgroup$0=caml_string_of_jsbytes("colgroup"),
     cst_col$0=caml_string_of_jsbytes("col"),
     cst_caption$0=caml_string_of_jsbytes("caption"),
     cst_canvas$0=caml_string_of_jsbytes("canvas"),
     cst_button$0=caml_string_of_jsbytes("button"),
     cst_br$0=caml_string_of_jsbytes("br"),
     cst_body$0=caml_string_of_jsbytes("body"),
     cst_blockquote$0=caml_string_of_jsbytes("blockquote"),
     cst_base$0=caml_string_of_jsbytes("base"),
     cst_area$0=caml_string_of_jsbytes("area"),
     cst_a$0=caml_string_of_jsbytes("a"),
     cst_canvas=caml_string_of_jsbytes("canvas"),
     cst_video=caml_string_of_jsbytes("video"),
     cst_audio=caml_string_of_jsbytes("audio"),
     cst_iframe=caml_string_of_jsbytes("iframe"),
     cst_frame=caml_string_of_jsbytes("frame"),
     cst_frameset=caml_string_of_jsbytes("frameset"),
     cst_address=caml_string_of_jsbytes("address"),
     cst_noscript=caml_string_of_jsbytes("noscript"),
     cst_dt=caml_string_of_jsbytes("dt"),
     cst_dd=caml_string_of_jsbytes("dd"),
     cst_abbr=caml_string_of_jsbytes("abbr"),
     cst_var=caml_string_of_jsbytes("var"),
     cst_kbd=caml_string_of_jsbytes("kbd"),
     cst_samp=caml_string_of_jsbytes("samp"),
     cst_code=caml_string_of_jsbytes("code"),
     cst_dfn=caml_string_of_jsbytes("dfn"),
     cst_cite=caml_string_of_jsbytes("cite"),
     cst_strong=caml_string_of_jsbytes("strong"),
     cst_em=caml_string_of_jsbytes("em"),
     cst_small=caml_string_of_jsbytes("small"),
     cst_big=caml_string_of_jsbytes("big"),
     cst_b=caml_string_of_jsbytes("b"),
     cst_i=caml_string_of_jsbytes("i"),
     cst_tt=caml_string_of_jsbytes("tt"),
     cst_span=caml_string_of_jsbytes("span"),
     cst_sup=caml_string_of_jsbytes("sup"),
     cst_sub=caml_string_of_jsbytes("sub"),
     cst_td=caml_string_of_jsbytes("td"),
     cst_th=caml_string_of_jsbytes("th"),
     cst_tr=caml_string_of_jsbytes("tr"),
     cst_tbody=caml_string_of_jsbytes("tbody"),
     cst_tfoot=caml_string_of_jsbytes("tfoot"),
     cst_thead=caml_string_of_jsbytes("thead"),
     cst_colgroup=caml_string_of_jsbytes("colgroup"),
     cst_col=caml_string_of_jsbytes("col"),
     cst_caption=caml_string_of_jsbytes("caption"),
     cst_table=caml_string_of_jsbytes("table"),
     cst_script=caml_string_of_jsbytes("script"),
     cst_area=caml_string_of_jsbytes("area"),
     cst_map=caml_string_of_jsbytes("map"),
     cst_param=caml_string_of_jsbytes("param"),
     cst_object=caml_string_of_jsbytes("object"),
     cst_img=caml_string_of_jsbytes("img"),
     cst_a=caml_string_of_jsbytes("a"),
     cst_del=caml_string_of_jsbytes("del"),
     cst_ins=caml_string_of_jsbytes("ins"),
     cst_hr=caml_string_of_jsbytes("hr"),
     cst_br=caml_string_of_jsbytes("br"),
     cst_pre=caml_string_of_jsbytes("pre"),
     cst_blockquote=caml_string_of_jsbytes("blockquote"),
     cst_q=caml_string_of_jsbytes("q"),
     cst_h6=caml_string_of_jsbytes("h6"),
     cst_h5=caml_string_of_jsbytes("h5"),
     cst_h4=caml_string_of_jsbytes("h4"),
     cst_h3=caml_string_of_jsbytes("h3"),
     cst_h2=caml_string_of_jsbytes("h2"),
     cst_h1=caml_string_of_jsbytes("h1"),
     cst_p=caml_string_of_jsbytes("p"),
     cst_embed=caml_string_of_jsbytes("embed"),
     cst_div=caml_string_of_jsbytes("div"),
     cst_li=caml_string_of_jsbytes("li"),
     cst_dl=caml_string_of_jsbytes("dl"),
     cst_ol=caml_string_of_jsbytes("ol"),
     cst_ul=caml_string_of_jsbytes("ul"),
     cst_legend=caml_string_of_jsbytes("legend"),
     cst_fieldset=caml_string_of_jsbytes("fieldset"),
     cst_label=caml_string_of_jsbytes("label"),
     cst_button=caml_string_of_jsbytes("button"),
     cst_textarea=caml_string_of_jsbytes("textarea"),
     cst_input$0=caml_string_of_jsbytes("input"),
     cst_select$0=caml_string_of_jsbytes("select"),
     cst_option=caml_string_of_jsbytes("option"),
     cst_optgroup=caml_string_of_jsbytes("optgroup"),
     cst_form=caml_string_of_jsbytes("form"),
     cst_body=caml_string_of_jsbytes("body"),
     cst_style=caml_string_of_jsbytes("style"),
     cst_base=caml_string_of_jsbytes("base"),
     cst_meta=caml_string_of_jsbytes("meta"),
     cst_title=caml_string_of_jsbytes("title"),
     cst_link=caml_string_of_jsbytes("link"),
     cst_head=caml_string_of_jsbytes("head"),
     cst_html=caml_string_of_jsbytes("html"),
     cst_click=caml_string_of_jsbytes("click"),
     cst_copy=caml_string_of_jsbytes("copy"),
     cst_cut=caml_string_of_jsbytes("cut"),
     cst_paste=caml_string_of_jsbytes("paste"),
     cst_dblclick=caml_string_of_jsbytes("dblclick"),
     cst_mousedown=caml_string_of_jsbytes("mousedown"),
     cst_mouseup=caml_string_of_jsbytes("mouseup"),
     cst_mouseover=caml_string_of_jsbytes("mouseover"),
     cst_mousemove=caml_string_of_jsbytes("mousemove"),
     cst_mouseout=caml_string_of_jsbytes("mouseout"),
     cst_keypress=caml_string_of_jsbytes("keypress"),
     cst_keydown=caml_string_of_jsbytes("keydown"),
     cst_keyup=caml_string_of_jsbytes("keyup"),
     cst_mousewheel=caml_string_of_jsbytes("mousewheel"),
     cst_DOMMouseScroll=caml_string_of_jsbytes("DOMMouseScroll"),
     cst_touchstart=caml_string_of_jsbytes("touchstart"),
     cst_touchmove=caml_string_of_jsbytes("touchmove"),
     cst_touchend=caml_string_of_jsbytes("touchend"),
     cst_touchcancel=caml_string_of_jsbytes("touchcancel"),
     cst_dragstart=caml_string_of_jsbytes("dragstart"),
     cst_dragend=caml_string_of_jsbytes("dragend"),
     cst_dragenter=caml_string_of_jsbytes("dragenter"),
     cst_dragover=caml_string_of_jsbytes("dragover"),
     cst_dragleave=caml_string_of_jsbytes("dragleave"),
     cst_drag=caml_string_of_jsbytes("drag"),
     cst_drop=caml_string_of_jsbytes("drop"),
     cst_hashchange=caml_string_of_jsbytes("hashchange"),
     cst_change=caml_string_of_jsbytes("change"),
     cst_input=caml_string_of_jsbytes("input"),
     cst_timeupdate=caml_string_of_jsbytes("timeupdate"),
     cst_submit=caml_string_of_jsbytes("submit"),
     cst_scroll=caml_string_of_jsbytes("scroll"),
     cst_focus=caml_string_of_jsbytes("focus"),
     cst_blur=caml_string_of_jsbytes("blur"),
     cst_load$0=caml_string_of_jsbytes("load"),
     cst_unload=caml_string_of_jsbytes("unload"),
     cst_beforeunload=caml_string_of_jsbytes("beforeunload"),
     cst_resize=caml_string_of_jsbytes("resize"),
     cst_orientationchange=caml_string_of_jsbytes("orientationchange"),
     cst_popstate=caml_string_of_jsbytes("popstate"),
     cst_error$0=caml_string_of_jsbytes("error"),
     cst_abort$0=caml_string_of_jsbytes("abort"),
     cst_select=caml_string_of_jsbytes("select"),
     cst_online=caml_string_of_jsbytes("online"),
     cst_offline=caml_string_of_jsbytes("offline"),
     cst_checking=caml_string_of_jsbytes("checking"),
     cst_noupdate=caml_string_of_jsbytes("noupdate"),
     cst_downloading=caml_string_of_jsbytes("downloading"),
     cst_progress$0=caml_string_of_jsbytes("progress"),
     cst_updateready=caml_string_of_jsbytes("updateready"),
     cst_cached=caml_string_of_jsbytes("cached"),
     cst_obsolete=caml_string_of_jsbytes("obsolete"),
     cst_DOMContentLoaded=caml_string_of_jsbytes("DOMContentLoaded"),
     cst_animationstart=caml_string_of_jsbytes("animationstart"),
     cst_animationend=caml_string_of_jsbytes("animationend"),
     cst_animationiteration=caml_string_of_jsbytes("animationiteration"),
     cst_animationcancel=caml_string_of_jsbytes("animationcancel"),
     cst_canplay=caml_string_of_jsbytes("canplay"),
     cst_canplaythrough=caml_string_of_jsbytes("canplaythrough"),
     cst_durationchange=caml_string_of_jsbytes("durationchange"),
     cst_emptied=caml_string_of_jsbytes("emptied"),
     cst_ended=caml_string_of_jsbytes("ended"),
     cst_gotpointercapture=caml_string_of_jsbytes("gotpointercapture"),
     cst_loadeddata=caml_string_of_jsbytes("loadeddata"),
     cst_loadedmetadata=caml_string_of_jsbytes("loadedmetadata"),
     cst_loadstart$0=caml_string_of_jsbytes("loadstart"),
     cst_lostpointercapture=caml_string_of_jsbytes("lostpointercapture"),
     cst_message=caml_string_of_jsbytes("message"),
     cst_pause=caml_string_of_jsbytes("pause"),
     cst_play=caml_string_of_jsbytes("play"),
     cst_playing=caml_string_of_jsbytes("playing"),
     cst_pointerenter=caml_string_of_jsbytes("pointerenter"),
     cst_pointercancel=caml_string_of_jsbytes("pointercancel"),
     cst_pointerdown=caml_string_of_jsbytes("pointerdown"),
     cst_pointerleave=caml_string_of_jsbytes("pointerleave"),
     cst_pointermove=caml_string_of_jsbytes("pointermove"),
     cst_pointerout=caml_string_of_jsbytes("pointerout"),
     cst_pointerover=caml_string_of_jsbytes("pointerover"),
     cst_pointerup=caml_string_of_jsbytes("pointerup"),
     cst_ratechange=caml_string_of_jsbytes("ratechange"),
     cst_seeked=caml_string_of_jsbytes("seeked"),
     cst_seeking=caml_string_of_jsbytes("seeking"),
     cst_stalled=caml_string_of_jsbytes("stalled"),
     cst_suspend=caml_string_of_jsbytes("suspend"),
     cst_volumechange=caml_string_of_jsbytes("volumechange"),
     cst_waiting=caml_string_of_jsbytes("waiting"),
     cst_Js_of_ocaml_Dom_html_Canva=
      caml_string_of_jsbytes("Js_of_ocaml__Dom_html.Canvas_not_available"),
     cst_checkbox=caml_string_of_jsbytes("checkbox"),
     cst_file=caml_string_of_jsbytes("file"),
     cst_password=caml_string_of_jsbytes("password"),
     cst_radio=caml_string_of_jsbytes("radio"),
     cst_reset=caml_string_of_jsbytes("reset"),
     cst_submit$0=caml_string_of_jsbytes("submit"),
     cst_text=caml_string_of_jsbytes("text"),
     cst_readystatechange=caml_string_of_jsbytes("readystatechange"),
     cst_loadstart$1=caml_string_of_jsbytes("loadstart"),
     cst_progress$1=caml_string_of_jsbytes("progress"),
     cst_abort$1=caml_string_of_jsbytes("abort"),
     cst_error$1=caml_string_of_jsbytes("error"),
     cst_load$1=caml_string_of_jsbytes("load"),
     cst_timeout=caml_string_of_jsbytes("timeout"),
     cst_loadend$0=caml_string_of_jsbytes("loadend"),
     cst_Worker_onmessage_is_undefi$0=
      caml_string_of_jsbytes("Worker.onmessage is undefined"),
     cst_Worker_onmessage_is_undefi=
      caml_string_of_jsbytes("Worker.onmessage is undefined"),
     cst_Worker_import_scripts_is_u=
      caml_string_of_jsbytes("Worker.import_scripts is undefined"),
     cst_webglcontextlost=caml_string_of_jsbytes("webglcontextlost"),
     cst_webglcontextrestored=caml_string_of_jsbytes("webglcontextrestored"),
     cst_webglcontextcreationerror=
      caml_string_of_jsbytes("webglcontextcreationerror"),
     cst_g=caml_string_of_jsbytes("g"),
     cst=caml_string_of_jsbytes("[\\][()\\\\|+*.?{}^$]"),
     cst$37=caml_string_of_jsbytes(""),
     cst$13=caml_string_of_jsbytes(""),
     cst$21=caml_string_of_jsbytes(""),
     cst$14=caml_string_of_jsbytes("#"),
     cst$15=caml_string_of_jsbytes("?"),
     cst$20=caml_string_of_jsbytes(""),
     cst$16=caml_string_of_jsbytes("/"),
     cst$17=caml_string_of_jsbytes("/"),
     cst$19=caml_string_of_jsbytes(":"),
     cst$18=caml_string_of_jsbytes(""),
     cst_http$1=caml_string_of_jsbytes("http://"),
     cst$22=caml_string_of_jsbytes(""),
     cst$30=caml_string_of_jsbytes(""),
     cst$23=caml_string_of_jsbytes("#"),
     cst$24=caml_string_of_jsbytes("?"),
     cst$29=caml_string_of_jsbytes(""),
     cst$25=caml_string_of_jsbytes("/"),
     cst$26=caml_string_of_jsbytes("/"),
     cst$28=caml_string_of_jsbytes(":"),
     cst$27=caml_string_of_jsbytes(""),
     cst_https$1=caml_string_of_jsbytes("https://"),
     cst$31=caml_string_of_jsbytes(""),
     cst$36=caml_string_of_jsbytes(""),
     cst$32=caml_string_of_jsbytes("#"),
     cst$33=caml_string_of_jsbytes("?"),
     cst$35=caml_string_of_jsbytes(""),
     cst$34=caml_string_of_jsbytes("/"),
     cst_file$2=caml_string_of_jsbytes("file://"),
     cst$12=caml_string_of_jsbytes(""),
     cst$11=caml_string_of_jsbytes(""),
     cst$10=caml_string_of_jsbytes(""),
     cst$9=caml_string_of_jsbytes(""),
     cst$8=caml_string_of_jsbytes(""),
     cst$7=caml_string_of_jsbytes(""),
     cst$6=caml_string_of_jsbytes(""),
     cst$4=caml_string_of_jsbytes("="),
     cst$5=caml_string_of_jsbytes("&"),
     cst$2=caml_string_of_jsbytes(""),
     cst$3=caml_string_of_jsbytes(""),
     cst_file$0=caml_string_of_jsbytes("file"),
     cst_file$1=caml_string_of_jsbytes("file:"),
     cst_http=caml_string_of_jsbytes("http"),
     cst_http$0=caml_string_of_jsbytes("http:"),
     cst_https=caml_string_of_jsbytes("https"),
     cst_https$0=caml_string_of_jsbytes("https:"),
     cst$1=caml_string_of_jsbytes(" "),
     cst_2B=caml_string_of_jsbytes("%2B"),
     cst_Js_of_ocaml_Url_Local_exn=
      caml_string_of_jsbytes("Js_of_ocaml__Url.Local_exn"),
     cst$0=caml_string_of_jsbytes("+"),
     cst_Js_of_ocaml_Url_Not_an_htt=
      caml_string_of_jsbytes("Js_of_ocaml__Url.Not_an_http_protocol"),
     cst_Hh_Tt_Tt_Pp_Ss_0_9a_zA_Z_0=
      caml_string_of_jsbytes
       ("^([Hh][Tt][Tt][Pp][Ss]?)://([0-9a-zA-Z.-]+|\\[[0-9a-zA-Z.-]+\\]|\\[[0-9A-Fa-f:.]+\\])?(:([0-9]+))?(/([^\\?#]*)(\\?([^#]*))?(#(.*))?)?$"),
     cst_Ff_Ii_Ll_Ee=
      caml_string_of_jsbytes
       ("^([Ff][Ii][Ll][Ee])://([^\\?#]*)(\\?([^#]*))?(#(.*))?$"),
     s=caml_string_of_jsbytes("4.0.0"),
     git_version=caml_string_of_jsbytes(""),
     cst$38=caml_string_of_jsbytes(""),
     cst$41=caml_string_of_jsbytes("+"),
     cst_Jstable_keys=caml_string_of_jsbytes("Jstable.keys"),
     t5=runtime.caml_int64_create_lo_mi_hi(1,0,0),
     cst_is_not_a_valid_length$0=
      caml_string_of_jsbytes(" is not a valid length"),
     cst_d_d_deg_grad_rad_turns=
      caml_string_of_jsbytes("^(\\d*(?:\\.\\d*))(deg|grad|rad|turns)$"),
     cst_length_conversion_error$0=
      caml_string_of_jsbytes("length conversion error: "),
     cst_deg$0=caml_string_of_jsbytes("deg"),
     cst_grad$0=caml_string_of_jsbytes("grad"),
     cst_rad$0=caml_string_of_jsbytes("rad"),
     cst_turns$0=caml_string_of_jsbytes("turns"),
     cst_deg=caml_string_of_jsbytes("deg"),
     cst_grad=caml_string_of_jsbytes("grad"),
     cst_rad=caml_string_of_jsbytes("rad"),
     cst_turns=caml_string_of_jsbytes("turns"),
     cst_is_not_a_valid_length=
      caml_string_of_jsbytes(" is not a valid length"),
     cst_0$0=caml_string_of_jsbytes("0"),
     cst_d_d_s_S=caml_string_of_jsbytes("^(\\d*(?:\\.\\d*)?)\\s*(\\S*)$"),
     cst_length_conversion_error=
      caml_string_of_jsbytes("length conversion error: "),
     cst_pc$0=caml_string_of_jsbytes("pc"),
     cst_ch$0=caml_string_of_jsbytes("ch"),
     cst_cm$0=caml_string_of_jsbytes("cm"),
     cst_em$1=caml_string_of_jsbytes("em"),
     cst_ex$0=caml_string_of_jsbytes("ex"),
     cst_gd$0=caml_string_of_jsbytes("gd"),
     cst_in$0=caml_string_of_jsbytes("in"),
     cst_mm$0=caml_string_of_jsbytes("mm"),
     cst_pt$0=caml_string_of_jsbytes("pt"),
     cst_px$0=caml_string_of_jsbytes("px"),
     cst_rem$0=caml_string_of_jsbytes("rem"),
     cst_vh$0=caml_string_of_jsbytes("vh"),
     cst_vm$0=caml_string_of_jsbytes("vm"),
     cst_vw$0=caml_string_of_jsbytes("vw"),
     cst_0=caml_string_of_jsbytes("0"),
     cst_em$0=caml_string_of_jsbytes("em"),
     cst_ex=caml_string_of_jsbytes("ex"),
     cst_px=caml_string_of_jsbytes("px"),
     cst_gd=caml_string_of_jsbytes("gd"),
     cst_rem=caml_string_of_jsbytes("rem"),
     cst_vw=caml_string_of_jsbytes("vw"),
     cst_vh=caml_string_of_jsbytes("vh"),
     cst_vm=caml_string_of_jsbytes("vm"),
     cst_ch=caml_string_of_jsbytes("ch"),
     cst_mm=caml_string_of_jsbytes("mm"),
     cst_cm=caml_string_of_jsbytes("cm"),
     cst_in=caml_string_of_jsbytes("in"),
     cst_pt=caml_string_of_jsbytes("pt"),
     cst_pc=caml_string_of_jsbytes("pc"),
     cst$40=caml_string_of_jsbytes("): "),
     cst_color_conversion_error$0=
      caml_string_of_jsbytes("color conversion error ("),
     cst$39=caml_string_of_jsbytes("): "),
     cst_color_conversion_error=
      caml_string_of_jsbytes("color conversion error ("),
     cst_is_not_a_valid_color$0=
      caml_string_of_jsbytes(" is not a valid color"),
     cst_rgba_d_d_d_d_d=
      caml_string_of_jsbytes
       ("(rgba?)\\((?:(\\d*),(\\d*),(\\d*)(?:,(\\d*(?:\\.\\d*)?))?)\\)"),
     cst_rgba_d_d_d_d_d$0=
      caml_string_of_jsbytes
       ("(rgba?)\\((?:(\\d*)%,(\\d*)%,(\\d*)%(?:,(\\d*(?:\\.\\d*)?))?)\\)"),
     cst_hsla_d_d_d_d_d=
      caml_string_of_jsbytes
       ("(hsla?)\\((?:(\\d*),(\\d*)%,(\\d*)%(?:,(\\d*(?:\\.\\d*)?))?)\\)"),
     cst_rgb=caml_string_of_jsbytes("rgb"),
     cst_rgba=caml_string_of_jsbytes("rgba"),
     cst_rgb$0=caml_string_of_jsbytes("rgb"),
     cst_rgba$0=caml_string_of_jsbytes("rgba"),
     cst_hsl=caml_string_of_jsbytes("hsl"),
     cst_hsla=caml_string_of_jsbytes("hsla"),
     cst_rgb_s_d_s_d_s_d=
      caml_string_of_jsbytes("^rgb\\(\\s*\\d*,\\s*\\d*,\\s*\\d*\\)$"),
     cst_rgb_s_d_s_d_s_d$0=
      caml_string_of_jsbytes("^rgb\\(\\s*\\d*%,\\s*\\d*%,\\s*\\d*%\\)$"),
     cst_rgba_s_d_s_d_s_d_d_d=
      caml_string_of_jsbytes
       ("^rgba\\(\\s*\\d*,\\s*\\d*,\\s*\\d*,\\d*\\.?\\d*\\)$"),
     cst_rgba_s_d_s_d_s_d_d_d$0=
      caml_string_of_jsbytes
       ("^rgba\\(\\s*\\d*%,\\s*\\d*%,\\s*\\d*%,\\d*\\.?\\d*\\)$"),
     cst_hsl_s_d_s_d_s_d=
      caml_string_of_jsbytes("^hsl\\(\\s*\\d*,\\s*\\d*%,\\s*\\d*%\\)$"),
     cst_hsla_s_d_s_d_s_d_d_d=
      caml_string_of_jsbytes
       ("^hsla\\(\\s*\\d*,\\s*\\d*%,\\s*\\d*%,\\d*\\.?\\d*\\)$"),
     cst_is_not_a_valid_color=caml_string_of_jsbytes(" is not a valid color"),
     cst_is_out_of_valid_range=
      caml_string_of_jsbytes(" is out of valid range"),
     partial=[8,[0,0,0],0,0,[12,41,0]],
     partial$0=[12,41,0],
     partial$1=[0,0,0],
     cst_lightgrey$0=caml_string_of_jsbytes("lightgrey"),
     cst_darkslategray$0=caml_string_of_jsbytes("darkslategray"),
     cst_cornsilk$0=caml_string_of_jsbytes("cornsilk"),
     cst_blue$0=caml_string_of_jsbytes("blue"),
     cst_aliceblue$0=caml_string_of_jsbytes("aliceblue"),
     cst_antiquewhite$0=caml_string_of_jsbytes("antiquewhite"),
     cst_aqua$0=caml_string_of_jsbytes("aqua"),
     cst_aquamarine$0=caml_string_of_jsbytes("aquamarine"),
     cst_azure$0=caml_string_of_jsbytes("azure"),
     cst_beige$0=caml_string_of_jsbytes("beige"),
     cst_bisque$0=caml_string_of_jsbytes("bisque"),
     cst_black$0=caml_string_of_jsbytes("black"),
     cst_blanchedalmond$0=caml_string_of_jsbytes("blanchedalmond"),
     cst_blueviolet$0=caml_string_of_jsbytes("blueviolet"),
     cst_brown$0=caml_string_of_jsbytes("brown"),
     cst_burlywood$0=caml_string_of_jsbytes("burlywood"),
     cst_cadetblue$0=caml_string_of_jsbytes("cadetblue"),
     cst_chartreuse$0=caml_string_of_jsbytes("chartreuse"),
     cst_chocolate$0=caml_string_of_jsbytes("chocolate"),
     cst_coral$0=caml_string_of_jsbytes("coral"),
     cst_cornflowerblue$0=caml_string_of_jsbytes("cornflowerblue"),
     cst_darkkhaki$0=caml_string_of_jsbytes("darkkhaki"),
     cst_crimson$0=caml_string_of_jsbytes("crimson"),
     cst_cyan$0=caml_string_of_jsbytes("cyan"),
     cst_darkblue$0=caml_string_of_jsbytes("darkblue"),
     cst_darkcyan$0=caml_string_of_jsbytes("darkcyan"),
     cst_darkgoldenrod$0=caml_string_of_jsbytes("darkgoldenrod"),
     cst_darkgray$0=caml_string_of_jsbytes("darkgray"),
     cst_darkgreen$0=caml_string_of_jsbytes("darkgreen"),
     cst_darkgrey$0=caml_string_of_jsbytes("darkgrey"),
     cst_darkmagenta$0=caml_string_of_jsbytes("darkmagenta"),
     cst_darkolivegreen$0=caml_string_of_jsbytes("darkolivegreen"),
     cst_darkorange$0=caml_string_of_jsbytes("darkorange"),
     cst_darkorchid$0=caml_string_of_jsbytes("darkorchid"),
     cst_darkred$0=caml_string_of_jsbytes("darkred"),
     cst_darksalmon$0=caml_string_of_jsbytes("darksalmon"),
     cst_darkseagreen$0=caml_string_of_jsbytes("darkseagreen"),
     cst_darkslateblue$0=caml_string_of_jsbytes("darkslateblue"),
     cst_greenyellow$0=caml_string_of_jsbytes("greenyellow"),
     cst_floralwhite$0=caml_string_of_jsbytes("floralwhite"),
     cst_darkslategrey$0=caml_string_of_jsbytes("darkslategrey"),
     cst_darkturquoise$0=caml_string_of_jsbytes("darkturquoise"),
     cst_darkviolet$0=caml_string_of_jsbytes("darkviolet"),
     cst_deeppink$0=caml_string_of_jsbytes("deeppink"),
     cst_deepskyblue$0=caml_string_of_jsbytes("deepskyblue"),
     cst_dimgray$0=caml_string_of_jsbytes("dimgray"),
     cst_dimgrey$0=caml_string_of_jsbytes("dimgrey"),
     cst_dodgerblue$0=caml_string_of_jsbytes("dodgerblue"),
     cst_firebrick$0=caml_string_of_jsbytes("firebrick"),
     cst_forestgreen$0=caml_string_of_jsbytes("forestgreen"),
     cst_fuchsia$0=caml_string_of_jsbytes("fuchsia"),
     cst_gainsboro$0=caml_string_of_jsbytes("gainsboro"),
     cst_ghostwhite$0=caml_string_of_jsbytes("ghostwhite"),
     cst_gold$0=caml_string_of_jsbytes("gold"),
     cst_goldenrod$0=caml_string_of_jsbytes("goldenrod"),
     cst_gray$0=caml_string_of_jsbytes("gray"),
     cst_green$0=caml_string_of_jsbytes("green"),
     cst_lavenderblush$0=caml_string_of_jsbytes("lavenderblush"),
     cst_grey$0=caml_string_of_jsbytes("grey"),
     cst_honeydew$0=caml_string_of_jsbytes("honeydew"),
     cst_hotpink$0=caml_string_of_jsbytes("hotpink"),
     cst_indianred$0=caml_string_of_jsbytes("indianred"),
     cst_indigo$0=caml_string_of_jsbytes("indigo"),
     cst_ivory$0=caml_string_of_jsbytes("ivory"),
     cst_khaki$0=caml_string_of_jsbytes("khaki"),
     cst_lavender$0=caml_string_of_jsbytes("lavender"),
     cst_lawngreen$0=caml_string_of_jsbytes("lawngreen"),
     cst_lemonchiffon$0=caml_string_of_jsbytes("lemonchiffon"),
     cst_lightblue$0=caml_string_of_jsbytes("lightblue"),
     cst_lightcoral$0=caml_string_of_jsbytes("lightcoral"),
     cst_lightcyan$0=caml_string_of_jsbytes("lightcyan"),
     cst_lightgoldenrodyellow$0=caml_string_of_jsbytes("lightgoldenrodyellow"),
     cst_lightgray$0=caml_string_of_jsbytes("lightgray"),
     cst_lightgreen$0=caml_string_of_jsbytes("lightgreen"),
     cst_paleturquoise$0=caml_string_of_jsbytes("paleturquoise"),
     cst_mediumslateblue$0=caml_string_of_jsbytes("mediumslateblue"),
     cst_limegreen$0=caml_string_of_jsbytes("limegreen"),
     cst_lightpink$0=caml_string_of_jsbytes("lightpink"),
     cst_lightsalmon$0=caml_string_of_jsbytes("lightsalmon"),
     cst_lightseagreen$0=caml_string_of_jsbytes("lightseagreen"),
     cst_lightskyblue$0=caml_string_of_jsbytes("lightskyblue"),
     cst_lightslategray$0=caml_string_of_jsbytes("lightslategray"),
     cst_lightslategrey$0=caml_string_of_jsbytes("lightslategrey"),
     cst_lightsteelblue$0=caml_string_of_jsbytes("lightsteelblue"),
     cst_lightyellow$0=caml_string_of_jsbytes("lightyellow"),
     cst_lime$0=caml_string_of_jsbytes("lime"),
     cst_linen$0=caml_string_of_jsbytes("linen"),
     cst_magenta$0=caml_string_of_jsbytes("magenta"),
     cst_maroon$0=caml_string_of_jsbytes("maroon"),
     cst_mediumaquamarine$0=caml_string_of_jsbytes("mediumaquamarine"),
     cst_mediumblue$0=caml_string_of_jsbytes("mediumblue"),
     cst_mediumorchid$0=caml_string_of_jsbytes("mediumorchid"),
     cst_mediumpurple$0=caml_string_of_jsbytes("mediumpurple"),
     cst_mediumseagreen$0=caml_string_of_jsbytes("mediumseagreen"),
     cst_navy$0=caml_string_of_jsbytes("navy"),
     cst_mediumspringgreen$0=caml_string_of_jsbytes("mediumspringgreen"),
     cst_mediumturquoise$0=caml_string_of_jsbytes("mediumturquoise"),
     cst_mediumvioletred$0=caml_string_of_jsbytes("mediumvioletred"),
     cst_midnightblue$0=caml_string_of_jsbytes("midnightblue"),
     cst_mintcream$0=caml_string_of_jsbytes("mintcream"),
     cst_mistyrose$0=caml_string_of_jsbytes("mistyrose"),
     cst_moccasin$0=caml_string_of_jsbytes("moccasin"),
     cst_navajowhite$0=caml_string_of_jsbytes("navajowhite"),
     cst_oldlace$0=caml_string_of_jsbytes("oldlace"),
     cst_olive$0=caml_string_of_jsbytes("olive"),
     cst_olivedrab$0=caml_string_of_jsbytes("olivedrab"),
     cst_orange$0=caml_string_of_jsbytes("orange"),
     cst_orangered$0=caml_string_of_jsbytes("orangered"),
     cst_orchid$0=caml_string_of_jsbytes("orchid"),
     cst_palegoldenrod$0=caml_string_of_jsbytes("palegoldenrod"),
     cst_palegreen$0=caml_string_of_jsbytes("palegreen"),
     cst_skyblue$0=caml_string_of_jsbytes("skyblue"),
     cst_rosybrown$0=caml_string_of_jsbytes("rosybrown"),
     cst_palevioletred$0=caml_string_of_jsbytes("palevioletred"),
     cst_papayawhip$0=caml_string_of_jsbytes("papayawhip"),
     cst_peachpuff$0=caml_string_of_jsbytes("peachpuff"),
     cst_peru$0=caml_string_of_jsbytes("peru"),
     cst_pink$0=caml_string_of_jsbytes("pink"),
     cst_plum$0=caml_string_of_jsbytes("plum"),
     cst_powderblue$0=caml_string_of_jsbytes("powderblue"),
     cst_purple$0=caml_string_of_jsbytes("purple"),
     cst_red$0=caml_string_of_jsbytes("red"),
     cst_royalblue$0=caml_string_of_jsbytes("royalblue"),
     cst_saddlebrown$0=caml_string_of_jsbytes("saddlebrown"),
     cst_salmon$0=caml_string_of_jsbytes("salmon"),
     cst_sandybrown$0=caml_string_of_jsbytes("sandybrown"),
     cst_seagreen$0=caml_string_of_jsbytes("seagreen"),
     cst_seashell$0=caml_string_of_jsbytes("seashell"),
     cst_sienna$0=caml_string_of_jsbytes("sienna"),
     cst_silver$0=caml_string_of_jsbytes("silver"),
     cst_thistle$0=caml_string_of_jsbytes("thistle"),
     cst_slateblue$0=caml_string_of_jsbytes("slateblue"),
     cst_slategray$0=caml_string_of_jsbytes("slategray"),
     cst_slategrey$0=caml_string_of_jsbytes("slategrey"),
     cst_snow$0=caml_string_of_jsbytes("snow"),
     cst_springgreen$0=caml_string_of_jsbytes("springgreen"),
     cst_steelblue$0=caml_string_of_jsbytes("steelblue"),
     cst_tan$0=caml_string_of_jsbytes("tan"),
     cst_teal$0=caml_string_of_jsbytes("teal"),
     cst_tomato$0=caml_string_of_jsbytes("tomato"),
     cst_turquoise$0=caml_string_of_jsbytes("turquoise"),
     cst_violet$0=caml_string_of_jsbytes("violet"),
     cst_wheat$0=caml_string_of_jsbytes("wheat"),
     cst_white$0=caml_string_of_jsbytes("white"),
     cst_whitesmoke$0=caml_string_of_jsbytes("whitesmoke"),
     cst_yellow$0=caml_string_of_jsbytes("yellow"),
     cst_yellowgreen$0=caml_string_of_jsbytes("yellowgreen"),
     cst_is_not_a_valid_color_name=
      caml_string_of_jsbytes(" is not a valid color name"),
     cst_aliceblue=caml_string_of_jsbytes("aliceblue"),
     cst_antiquewhite=caml_string_of_jsbytes("antiquewhite"),
     cst_aqua=caml_string_of_jsbytes("aqua"),
     cst_aquamarine=caml_string_of_jsbytes("aquamarine"),
     cst_azure=caml_string_of_jsbytes("azure"),
     cst_beige=caml_string_of_jsbytes("beige"),
     cst_bisque=caml_string_of_jsbytes("bisque"),
     cst_black=caml_string_of_jsbytes("black"),
     cst_blanchedalmond=caml_string_of_jsbytes("blanchedalmond"),
     cst_blue=caml_string_of_jsbytes("blue"),
     cst_blueviolet=caml_string_of_jsbytes("blueviolet"),
     cst_brown=caml_string_of_jsbytes("brown"),
     cst_burlywood=caml_string_of_jsbytes("burlywood"),
     cst_cadetblue=caml_string_of_jsbytes("cadetblue"),
     cst_chartreuse=caml_string_of_jsbytes("chartreuse"),
     cst_chocolate=caml_string_of_jsbytes("chocolate"),
     cst_coral=caml_string_of_jsbytes("coral"),
     cst_cornflowerblue=caml_string_of_jsbytes("cornflowerblue"),
     cst_cornsilk=caml_string_of_jsbytes("cornsilk"),
     cst_crimson=caml_string_of_jsbytes("crimson"),
     cst_cyan=caml_string_of_jsbytes("cyan"),
     cst_darkblue=caml_string_of_jsbytes("darkblue"),
     cst_darkcyan=caml_string_of_jsbytes("darkcyan"),
     cst_darkgoldenrod=caml_string_of_jsbytes("darkgoldenrod"),
     cst_darkgray=caml_string_of_jsbytes("darkgray"),
     cst_darkgreen=caml_string_of_jsbytes("darkgreen"),
     cst_darkgrey=caml_string_of_jsbytes("darkgrey"),
     cst_darkkhaki=caml_string_of_jsbytes("darkkhaki"),
     cst_darkmagenta=caml_string_of_jsbytes("darkmagenta"),
     cst_darkolivegreen=caml_string_of_jsbytes("darkolivegreen"),
     cst_darkorange=caml_string_of_jsbytes("darkorange"),
     cst_darkorchid=caml_string_of_jsbytes("darkorchid"),
     cst_darkred=caml_string_of_jsbytes("darkred"),
     cst_darksalmon=caml_string_of_jsbytes("darksalmon"),
     cst_darkseagreen=caml_string_of_jsbytes("darkseagreen"),
     cst_darkslateblue=caml_string_of_jsbytes("darkslateblue"),
     cst_darkslategray=caml_string_of_jsbytes("darkslategray"),
     cst_darkslategrey=caml_string_of_jsbytes("darkslategrey"),
     cst_darkturquoise=caml_string_of_jsbytes("darkturquoise"),
     cst_darkviolet=caml_string_of_jsbytes("darkviolet"),
     cst_deeppink=caml_string_of_jsbytes("deeppink"),
     cst_deepskyblue=caml_string_of_jsbytes("deepskyblue"),
     cst_dimgray=caml_string_of_jsbytes("dimgray"),
     cst_dimgrey=caml_string_of_jsbytes("dimgrey"),
     cst_dodgerblue=caml_string_of_jsbytes("dodgerblue"),
     cst_firebrick=caml_string_of_jsbytes("firebrick"),
     cst_floralwhite=caml_string_of_jsbytes("floralwhite"),
     cst_forestgreen=caml_string_of_jsbytes("forestgreen"),
     cst_fuchsia=caml_string_of_jsbytes("fuchsia"),
     cst_gainsboro=caml_string_of_jsbytes("gainsboro"),
     cst_ghostwhite=caml_string_of_jsbytes("ghostwhite"),
     cst_gold=caml_string_of_jsbytes("gold"),
     cst_goldenrod=caml_string_of_jsbytes("goldenrod"),
     cst_gray=caml_string_of_jsbytes("gray"),
     cst_grey=caml_string_of_jsbytes("grey"),
     cst_green=caml_string_of_jsbytes("green"),
     cst_greenyellow=caml_string_of_jsbytes("greenyellow"),
     cst_honeydew=caml_string_of_jsbytes("honeydew"),
     cst_hotpink=caml_string_of_jsbytes("hotpink"),
     cst_indianred=caml_string_of_jsbytes("indianred"),
     cst_indigo=caml_string_of_jsbytes("indigo"),
     cst_ivory=caml_string_of_jsbytes("ivory"),
     cst_khaki=caml_string_of_jsbytes("khaki"),
     cst_lavender=caml_string_of_jsbytes("lavender"),
     cst_lavenderblush=caml_string_of_jsbytes("lavenderblush"),
     cst_lawngreen=caml_string_of_jsbytes("lawngreen"),
     cst_lemonchiffon=caml_string_of_jsbytes("lemonchiffon"),
     cst_lightblue=caml_string_of_jsbytes("lightblue"),
     cst_lightcoral=caml_string_of_jsbytes("lightcoral"),
     cst_lightcyan=caml_string_of_jsbytes("lightcyan"),
     cst_lightgoldenrodyellow=caml_string_of_jsbytes("lightgoldenrodyellow"),
     cst_lightgray=caml_string_of_jsbytes("lightgray"),
     cst_lightgreen=caml_string_of_jsbytes("lightgreen"),
     cst_lightgrey=caml_string_of_jsbytes("lightgrey"),
     cst_lightpink=caml_string_of_jsbytes("lightpink"),
     cst_lightsalmon=caml_string_of_jsbytes("lightsalmon"),
     cst_lightseagreen=caml_string_of_jsbytes("lightseagreen"),
     cst_lightskyblue=caml_string_of_jsbytes("lightskyblue"),
     cst_lightslategray=caml_string_of_jsbytes("lightslategray"),
     cst_lightslategrey=caml_string_of_jsbytes("lightslategrey"),
     cst_lightsteelblue=caml_string_of_jsbytes("lightsteelblue"),
     cst_lightyellow=caml_string_of_jsbytes("lightyellow"),
     cst_lime=caml_string_of_jsbytes("lime"),
     cst_limegreen=caml_string_of_jsbytes("limegreen"),
     cst_linen=caml_string_of_jsbytes("linen"),
     cst_magenta=caml_string_of_jsbytes("magenta"),
     cst_maroon=caml_string_of_jsbytes("maroon"),
     cst_mediumaquamarine=caml_string_of_jsbytes("mediumaquamarine"),
     cst_mediumblue=caml_string_of_jsbytes("mediumblue"),
     cst_mediumorchid=caml_string_of_jsbytes("mediumorchid"),
     cst_mediumpurple=caml_string_of_jsbytes("mediumpurple"),
     cst_mediumseagreen=caml_string_of_jsbytes("mediumseagreen"),
     cst_mediumslateblue=caml_string_of_jsbytes("mediumslateblue"),
     cst_mediumspringgreen=caml_string_of_jsbytes("mediumspringgreen"),
     cst_mediumturquoise=caml_string_of_jsbytes("mediumturquoise"),
     cst_mediumvioletred=caml_string_of_jsbytes("mediumvioletred"),
     cst_midnightblue=caml_string_of_jsbytes("midnightblue"),
     cst_mintcream=caml_string_of_jsbytes("mintcream"),
     cst_mistyrose=caml_string_of_jsbytes("mistyrose"),
     cst_moccasin=caml_string_of_jsbytes("moccasin"),
     cst_navajowhite=caml_string_of_jsbytes("navajowhite"),
     cst_navy=caml_string_of_jsbytes("navy"),
     cst_oldlace=caml_string_of_jsbytes("oldlace"),
     cst_olive=caml_string_of_jsbytes("olive"),
     cst_olivedrab=caml_string_of_jsbytes("olivedrab"),
     cst_orange=caml_string_of_jsbytes("orange"),
     cst_orangered=caml_string_of_jsbytes("orangered"),
     cst_orchid=caml_string_of_jsbytes("orchid"),
     cst_palegoldenrod=caml_string_of_jsbytes("palegoldenrod"),
     cst_palegreen=caml_string_of_jsbytes("palegreen"),
     cst_paleturquoise=caml_string_of_jsbytes("paleturquoise"),
     cst_palevioletred=caml_string_of_jsbytes("palevioletred"),
     cst_papayawhip=caml_string_of_jsbytes("papayawhip"),
     cst_peachpuff=caml_string_of_jsbytes("peachpuff"),
     cst_peru=caml_string_of_jsbytes("peru"),
     cst_pink=caml_string_of_jsbytes("pink"),
     cst_plum=caml_string_of_jsbytes("plum"),
     cst_powderblue=caml_string_of_jsbytes("powderblue"),
     cst_purple=caml_string_of_jsbytes("purple"),
     cst_red=caml_string_of_jsbytes("red"),
     cst_rosybrown=caml_string_of_jsbytes("rosybrown"),
     cst_royalblue=caml_string_of_jsbytes("royalblue"),
     cst_saddlebrown=caml_string_of_jsbytes("saddlebrown"),
     cst_salmon=caml_string_of_jsbytes("salmon"),
     cst_sandybrown=caml_string_of_jsbytes("sandybrown"),
     cst_seagreen=caml_string_of_jsbytes("seagreen"),
     cst_seashell=caml_string_of_jsbytes("seashell"),
     cst_sienna=caml_string_of_jsbytes("sienna"),
     cst_silver=caml_string_of_jsbytes("silver"),
     cst_skyblue=caml_string_of_jsbytes("skyblue"),
     cst_slateblue=caml_string_of_jsbytes("slateblue"),
     cst_slategray=caml_string_of_jsbytes("slategray"),
     cst_slategrey=caml_string_of_jsbytes("slategrey"),
     cst_snow=caml_string_of_jsbytes("snow"),
     cst_springgreen=caml_string_of_jsbytes("springgreen"),
     cst_steelblue=caml_string_of_jsbytes("steelblue"),
     cst_tan=caml_string_of_jsbytes("tan"),
     cst_teal=caml_string_of_jsbytes("teal"),
     cst_thistle=caml_string_of_jsbytes("thistle"),
     cst_tomato=caml_string_of_jsbytes("tomato"),
     cst_turquoise=caml_string_of_jsbytes("turquoise"),
     cst_violet=caml_string_of_jsbytes("violet"),
     cst_wheat=caml_string_of_jsbytes("wheat"),
     cst_white=caml_string_of_jsbytes("white"),
     cst_whitesmoke=caml_string_of_jsbytes("whitesmoke"),
     cst_yellow=caml_string_of_jsbytes("yellow"),
     cst_yellowgreen=caml_string_of_jsbytes("yellowgreen"),
     cst_vkern$0=caml_string_of_jsbytes("vkern"),
     cst_view$0=caml_string_of_jsbytes("view"),
     cst_use$0=caml_string_of_jsbytes("use"),
     cst_tspan$0=caml_string_of_jsbytes("tspan"),
     cst_tref$0=caml_string_of_jsbytes("tref"),
     cst_title$3=caml_string_of_jsbytes("title"),
     cst_textpath$0=caml_string_of_jsbytes("textpath"),
     cst_text$1=caml_string_of_jsbytes("text"),
     cst_symbol$0=caml_string_of_jsbytes("symbol"),
     cst_switch$0=caml_string_of_jsbytes("switch"),
     cst_svg$0=caml_string_of_jsbytes("svg"),
     cst_style$3=caml_string_of_jsbytes("style"),
     cst_stop$0=caml_string_of_jsbytes("stop"),
     cst_set$0=caml_string_of_jsbytes("set"),
     cst_script$3=caml_string_of_jsbytes("script"),
     cst_rect$0=caml_string_of_jsbytes("rect"),
     cst_radialgradient$0=caml_string_of_jsbytes("radialgradient"),
     cst_polyline$0=caml_string_of_jsbytes("polyline"),
     cst_polygon$0=caml_string_of_jsbytes("polygon"),
     cst_pattern$0=caml_string_of_jsbytes("pattern"),
     cst_path$0=caml_string_of_jsbytes("path"),
     cst_mpath$0=caml_string_of_jsbytes("mpath"),
     cst_missing_glyph$0=caml_string_of_jsbytes("missing-glyph"),
     cst_metadata$0=caml_string_of_jsbytes("metadata"),
     cst_mask$0=caml_string_of_jsbytes("mask"),
     cst_lineargradient$0=caml_string_of_jsbytes("lineargradient"),
     cst_line$0=caml_string_of_jsbytes("line"),
     cst_image$0=caml_string_of_jsbytes("image"),
     cst_hkern$0=caml_string_of_jsbytes("hkern"),
     cst_glyphref$0=caml_string_of_jsbytes("glyphref"),
     cst_glyph$0=caml_string_of_jsbytes("glyph"),
     cst_g$1=caml_string_of_jsbytes("g"),
     cst_foreignobject=caml_string_of_jsbytes("foreignobject"),
     cst_font_face_uri$0=caml_string_of_jsbytes("font-face-uri"),
     cst_font_face_src$0=caml_string_of_jsbytes("font-face-src"),
     cst_font_face_name$0=caml_string_of_jsbytes("font-face-name"),
     cst_font_face_format$0=caml_string_of_jsbytes("font-face-format"),
     cst_font_face$0=caml_string_of_jsbytes("font-face"),
     cst_font$0=caml_string_of_jsbytes("font"),
     cst_filter$0=caml_string_of_jsbytes("filter"),
     cst_ellipse$0=caml_string_of_jsbytes("ellipse"),
     cst_desc$0=caml_string_of_jsbytes("desc"),
     cst_defs$0=caml_string_of_jsbytes("defs"),
     cst_cursor$0=caml_string_of_jsbytes("cursor"),
     cst_clippath$0=caml_string_of_jsbytes("clippath"),
     cst_circle$0=caml_string_of_jsbytes("circle"),
     cst_animatetransform$0=caml_string_of_jsbytes("animatetransform"),
     cst_animatemotion$0=caml_string_of_jsbytes("animatemotion"),
     cst_animatecolor$0=caml_string_of_jsbytes("animatecolor"),
     cst_animate$0=caml_string_of_jsbytes("animate"),
     cst_altglyphitem$0=caml_string_of_jsbytes("altglyphitem"),
     cst_altglyphdef$0=caml_string_of_jsbytes("altglyphdef"),
     cst_altglyph$0=caml_string_of_jsbytes("altglyph"),
     cst_a$3=caml_string_of_jsbytes("a"),
     cst_vkern=caml_string_of_jsbytes("vkern"),
     cst_view=caml_string_of_jsbytes("view"),
     cst_use=caml_string_of_jsbytes("use"),
     cst_tspan=caml_string_of_jsbytes("tspan"),
     cst_tref=caml_string_of_jsbytes("tref"),
     cst_title$2=caml_string_of_jsbytes("title"),
     cst_textpath=caml_string_of_jsbytes("textpath"),
     cst_text$0=caml_string_of_jsbytes("text"),
     cst_symbol=caml_string_of_jsbytes("symbol"),
     cst_switch=caml_string_of_jsbytes("switch"),
     cst_svg=caml_string_of_jsbytes("svg"),
     cst_style$2=caml_string_of_jsbytes("style"),
     cst_stop=caml_string_of_jsbytes("stop"),
     cst_set=caml_string_of_jsbytes("set"),
     cst_script$2=caml_string_of_jsbytes("script"),
     cst_rect=caml_string_of_jsbytes("rect"),
     cst_radialgradient=caml_string_of_jsbytes("radialgradient"),
     cst_polyline=caml_string_of_jsbytes("polyline"),
     cst_polygon=caml_string_of_jsbytes("polygon"),
     cst_pattern=caml_string_of_jsbytes("pattern"),
     cst_path=caml_string_of_jsbytes("path"),
     cst_mpath=caml_string_of_jsbytes("mpath"),
     cst_missing_glyph=caml_string_of_jsbytes("missing-glyph"),
     cst_metadata=caml_string_of_jsbytes("metadata"),
     cst_mask=caml_string_of_jsbytes("mask"),
     cst_lineargradient=caml_string_of_jsbytes("lineargradient"),
     cst_line=caml_string_of_jsbytes("line"),
     cst_image=caml_string_of_jsbytes("image"),
     cst_hkern=caml_string_of_jsbytes("hkern"),
     cst_glyphref=caml_string_of_jsbytes("glyphref"),
     cst_glyph=caml_string_of_jsbytes("glyph"),
     cst_g$0=caml_string_of_jsbytes("g"),
     cst_foreignObject=caml_string_of_jsbytes("foreignObject"),
     cst_font_face_uri=caml_string_of_jsbytes("font-face-uri"),
     cst_font_face_src=caml_string_of_jsbytes("font-face-src"),
     cst_font_face_name=caml_string_of_jsbytes("font-face-name"),
     cst_font_face_format=caml_string_of_jsbytes("font-face-format"),
     cst_font_face=caml_string_of_jsbytes("font-face"),
     cst_font=caml_string_of_jsbytes("font"),
     cst_filter=caml_string_of_jsbytes("filter"),
     cst_ellipse=caml_string_of_jsbytes("ellipse"),
     cst_desc=caml_string_of_jsbytes("desc"),
     cst_defs=caml_string_of_jsbytes("defs"),
     cst_cursor=caml_string_of_jsbytes("cursor"),
     cst_clippath=caml_string_of_jsbytes("clippath"),
     cst_circle=caml_string_of_jsbytes("circle"),
     cst_animatetransform=caml_string_of_jsbytes("animatetransform"),
     cst_animatemotion=caml_string_of_jsbytes("animatemotion"),
     cst_animatecolor=caml_string_of_jsbytes("animatecolor"),
     cst_animate=caml_string_of_jsbytes("animate"),
     cst_altglyphitem=caml_string_of_jsbytes("altglyphitem"),
     cst_altglyphdef=caml_string_of_jsbytes("altglyphdef"),
     cst_altglyph=caml_string_of_jsbytes("altglyph"),
     cst_a$2=caml_string_of_jsbytes("a"),
     cst_Js_of_ocaml_Dom_svg_SVGErr=
      caml_string_of_jsbytes("Js_of_ocaml__Dom_svg.SVGError"),
     Stdlib_String=global_data.Stdlib__String,
     Stdlib_Char=global_data.Stdlib__Char,
     Stdlib=global_data.Stdlib,
     Jsoo_runtime=global_data.Jsoo_runtime,
     Stdlib_Printexc=global_data.Stdlib__Printexc,
     Assert_failure=global_data.Assert_failure,
     Stdlib_List=global_data.Stdlib__List,
     Stdlib_Array=global_data.Stdlib__Array,
     Stdlib_Uchar=global_data.Stdlib__Uchar,
     Stdlib_Printf=global_data.Stdlib__Printf,
     Stdlib_Obj=global_data.Stdlib__Obj,
     Js_of_ocaml=[0];
    caml_register_global(1635,Js_of_ocaml,"Js_of_ocaml__");
    var
     Poly=[0],
     _g_=[0,caml_string_of_jsbytes("lib/js_of_ocaml/dom.ml"),351,67],
     _h_=[0,caml_string_of_jsbytes("transparent")],
     _i_=[0,caml_string_of_jsbytes("native")],
     _m_=[0,caml_string_of_jsbytes("lib/js_of_ocaml/dom_html.ml"),2850,58],
     _l_=[0,caml_string_of_jsbytes("lib/js_of_ocaml/dom_html.ml"),2849,61],
     _k_=
      [0,
       [11,
        caml_string_of_jsbytes("getElementById_exn: "),
        [3,0,[11,caml_string_of_jsbytes(" not found"),0]]],
       caml_string_of_jsbytes("getElementById_exn: %S not found")],
     _o_=[0,caml_string_of_jsbytes("lib/js_of_ocaml/form.ml"),178,13],
     _n_=[0,1],
     _p_=[0,caml_string_of_jsbytes("lib/js_of_ocaml/regexp.ml"),34,64],
     _q_=[0,caml_string_of_jsbytes(""),0],
     _ck_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cl_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cm_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cn_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _b8_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _b9_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _b__=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _b$_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _ca_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cb_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cc_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cd_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _ce_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cf_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cg_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _ch_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _ci_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _cj_=[0,[8,[0,0,0],0,0,[2,0,0]],caml_string_of_jsbytes("%f%s")],
     _b7_=
      caml_list_of_js_array
       ([caml_string_of_jsbytes("aliceblue"),
         caml_string_of_jsbytes("antiquewhite"),
         caml_string_of_jsbytes("aqua"),
         caml_string_of_jsbytes("aquamarine"),
         caml_string_of_jsbytes("azure"),
         caml_string_of_jsbytes("beige"),
         caml_string_of_jsbytes("bisque"),
         caml_string_of_jsbytes("black"),
         caml_string_of_jsbytes("blanchedalmond"),
         caml_string_of_jsbytes("blue"),
         caml_string_of_jsbytes("blueviolet"),
         caml_string_of_jsbytes("brown"),
         caml_string_of_jsbytes("burlywood"),
         caml_string_of_jsbytes("cadetblue"),
         caml_string_of_jsbytes("chartreuse"),
         caml_string_of_jsbytes("chocolate"),
         caml_string_of_jsbytes("coral"),
         caml_string_of_jsbytes("cornflowerblue"),
         caml_string_of_jsbytes("cornsilk"),
         caml_string_of_jsbytes("crimson"),
         caml_string_of_jsbytes("cyan"),
         caml_string_of_jsbytes("darkblue"),
         caml_string_of_jsbytes("darkcyan"),
         caml_string_of_jsbytes("darkgoldenrod"),
         caml_string_of_jsbytes("darkgray"),
         caml_string_of_jsbytes("darkgreen"),
         caml_string_of_jsbytes("darkgrey"),
         caml_string_of_jsbytes("darkkhaki"),
         caml_string_of_jsbytes("darkmagenta"),
         caml_string_of_jsbytes("darkolivegreen"),
         caml_string_of_jsbytes("darkorange"),
         caml_string_of_jsbytes("darkorchid"),
         caml_string_of_jsbytes("darkred"),
         caml_string_of_jsbytes("darksalmon"),
         caml_string_of_jsbytes("darkseagreen"),
         caml_string_of_jsbytes("darkslateblue"),
         caml_string_of_jsbytes("darkslategray"),
         caml_string_of_jsbytes("darkslategrey"),
         caml_string_of_jsbytes("darkturquoise"),
         caml_string_of_jsbytes("darkviolet"),
         caml_string_of_jsbytes("deeppink"),
         caml_string_of_jsbytes("deepskyblue"),
         caml_string_of_jsbytes("dimgray"),
         caml_string_of_jsbytes("dimgrey"),
         caml_string_of_jsbytes("dodgerblue"),
         caml_string_of_jsbytes("firebrick"),
         caml_string_of_jsbytes("floralwhite"),
         caml_string_of_jsbytes("forestgreen"),
         caml_string_of_jsbytes("fuchsia"),
         caml_string_of_jsbytes("gainsboro"),
         caml_string_of_jsbytes("ghostwhite"),
         caml_string_of_jsbytes("gold"),
         caml_string_of_jsbytes("goldenrod"),
         caml_string_of_jsbytes("gray"),
         caml_string_of_jsbytes("green"),
         caml_string_of_jsbytes("greenyellow"),
         caml_string_of_jsbytes("grey"),
         caml_string_of_jsbytes("honeydew"),
         caml_string_of_jsbytes("hotpink"),
         caml_string_of_jsbytes("indianred"),
         caml_string_of_jsbytes("indigo"),
         caml_string_of_jsbytes("ivory"),
         caml_string_of_jsbytes("khaki"),
         caml_string_of_jsbytes("lavender"),
         caml_string_of_jsbytes("lavenderblush"),
         caml_string_of_jsbytes("lawngreen"),
         caml_string_of_jsbytes("lemonchiffon"),
         caml_string_of_jsbytes("lightblue"),
         caml_string_of_jsbytes("lightcoral"),
         caml_string_of_jsbytes("lightcyan"),
         caml_string_of_jsbytes("lightgoldenrodyellow"),
         caml_string_of_jsbytes("lightgray"),
         caml_string_of_jsbytes("lightgreen"),
         caml_string_of_jsbytes("lightgrey"),
         caml_string_of_jsbytes("lightpink"),
         caml_string_of_jsbytes("lightsalmon"),
         caml_string_of_jsbytes("lightseagreen"),
         caml_string_of_jsbytes("lightskyblue"),
         caml_string_of_jsbytes("lightslategray"),
         caml_string_of_jsbytes("lightslategrey"),
         caml_string_of_jsbytes("lightsteelblue"),
         caml_string_of_jsbytes("lightyellow"),
         caml_string_of_jsbytes("lime"),
         caml_string_of_jsbytes("limegreen"),
         caml_string_of_jsbytes("linen"),
         caml_string_of_jsbytes("magenta"),
         caml_string_of_jsbytes("maroon"),
         caml_string_of_jsbytes("mediumaquamarine"),
         caml_string_of_jsbytes("mediumblue"),
         caml_string_of_jsbytes("mediumorchid"),
         caml_string_of_jsbytes("mediumpurple"),
         caml_string_of_jsbytes("mediumseagreen"),
         caml_string_of_jsbytes("mediumslateblue"),
         caml_string_of_jsbytes("mediumspringgreen"),
         caml_string_of_jsbytes("mediumturquoise"),
         caml_string_of_jsbytes("mediumvioletred"),
         caml_string_of_jsbytes("midnightblue"),
         caml_string_of_jsbytes("mintcream"),
         caml_string_of_jsbytes("mistyrose"),
         caml_string_of_jsbytes("moccasin"),
         caml_string_of_jsbytes("navajowhite"),
         caml_string_of_jsbytes("navy"),
         caml_string_of_jsbytes("oldlace"),
         caml_string_of_jsbytes("olive"),
         caml_string_of_jsbytes("olivedrab"),
         caml_string_of_jsbytes("orange"),
         caml_string_of_jsbytes("orangered"),
         caml_string_of_jsbytes("orchid"),
         caml_string_of_jsbytes("palegoldenrod"),
         caml_string_of_jsbytes("palegreen"),
         caml_string_of_jsbytes("paleturquoise"),
         caml_string_of_jsbytes("palevioletred"),
         caml_string_of_jsbytes("papayawhip"),
         caml_string_of_jsbytes("peachpuff"),
         caml_string_of_jsbytes("peru"),
         caml_string_of_jsbytes("pink"),
         caml_string_of_jsbytes("plum"),
         caml_string_of_jsbytes("powderblue"),
         caml_string_of_jsbytes("purple"),
         caml_string_of_jsbytes("red"),
         caml_string_of_jsbytes("rosybrown"),
         caml_string_of_jsbytes("royalblue"),
         caml_string_of_jsbytes("saddlebrown"),
         caml_string_of_jsbytes("salmon"),
         caml_string_of_jsbytes("sandybrown"),
         caml_string_of_jsbytes("seagreen"),
         caml_string_of_jsbytes("seashell"),
         caml_string_of_jsbytes("sienna"),
         caml_string_of_jsbytes("silver"),
         caml_string_of_jsbytes("skyblue"),
         caml_string_of_jsbytes("slateblue"),
         caml_string_of_jsbytes("slategray"),
         caml_string_of_jsbytes("slategrey"),
         caml_string_of_jsbytes("snow"),
         caml_string_of_jsbytes("springgreen"),
         caml_string_of_jsbytes("steelblue"),
         caml_string_of_jsbytes("tan"),
         caml_string_of_jsbytes("teal"),
         caml_string_of_jsbytes("thistle"),
         caml_string_of_jsbytes("tomato"),
         caml_string_of_jsbytes("turquoise"),
         caml_string_of_jsbytes("violet"),
         caml_string_of_jsbytes("wheat"),
         caml_string_of_jsbytes("white"),
         caml_string_of_jsbytes("whitesmoke"),
         caml_string_of_jsbytes("yellow"),
         caml_string_of_jsbytes("yellowgreen")]),
     _b6_=
      [0,
       [12,35,[4,8,[0,2,2],0,[4,8,[0,2,2],0,[4,8,[0,2,2],0,0]]]],
       caml_string_of_jsbytes("#%02X%02X%02X")],
     _b0_=
      [0,
       [11,
        caml_string_of_jsbytes("rgb("),
        [4,0,0,0,[12,44,[4,0,0,0,[12,44,[4,0,0,0,[12,41,0]]]]]]],
       caml_string_of_jsbytes("rgb(%d,%d,%d)")],
     _b1_=
      [0,
       [11,
        caml_string_of_jsbytes("rgb("),
        [4,
         0,
         0,
         0,
         [12,37,[12,44,[4,0,0,0,[12,37,[12,44,[4,0,0,0,[12,37,[12,41,0]]]]]]]]]],
       caml_string_of_jsbytes("rgb(%d%%,%d%%,%d%%)")],
     _b2_=
      [0,
       [11,
        caml_string_of_jsbytes("rgba("),
        [4,
         0,
         0,
         0,
         [12,44,[4,0,0,0,[12,44,[4,0,0,0,[12,44,[8,[0,0,0],0,0,[12,41,0]]]]]]]]],
       caml_string_of_jsbytes("rgba(%d,%d,%d,%f)")],
     _b3_=
      [0,
       [11,
        caml_string_of_jsbytes("rgba("),
        [4,
         0,
         0,
         0,
         [12,
          37,
          [12,44,[4,0,0,0,[12,37,[12,44,[4,0,0,0,[12,37,[12,44,partial]]]]]]]]]],
       caml_string_of_jsbytes("rgba(%d%%,%d%%,%d%%,%f)")],
     _b4_=
      [0,
       [11,
        caml_string_of_jsbytes("hsl("),
        [4,
         0,
         0,
         0,
         [12,44,[4,0,0,0,[12,37,[12,44,[4,0,0,0,[12,37,[12,41,0]]]]]]]]],
       caml_string_of_jsbytes("hsl(%d,%d%%,%d%%)")],
     _b5_=
      [0,
       [11,
        caml_string_of_jsbytes("hsla("),
        [4,
         0,
         0,
         0,
         [12,
          44,
          [4,
           0,
           0,
           0,
           [12,
            37,
            [12,44,[4,0,0,0,[12,37,[12,44,[8,partial$1,0,0,partial$0]]]]]]]]]],
       caml_string_of_jsbytes("hsla(%d,%d%%,%d%%,%f)")],
     _x_=[0,240,248,255],
     _y_=[0,250,235,215],
     _z_=[0,0,255,255],
     _A_=[0,127,255,212],
     _B_=[0,240,255,255],
     _C_=[0,245,245,220],
     _D_=[0,255,228,196],
     _E_=[0,0,0,0],
     _F_=[0,255,235,205],
     _G_=[0,0,0,255],
     _H_=[0,138,43,226],
     _I_=[0,165,42,42],
     _J_=[0,222,184,135],
     _K_=[0,95,158,160],
     _L_=[0,127,255,0],
     _M_=[0,210,105,30],
     _N_=[0,255,127,80],
     _O_=[0,100,149,237],
     _P_=[0,255,248,220],
     _Q_=[0,220,20,60],
     _R_=[0,0,255,255],
     _S_=[0,0,0,139],
     _T_=[0,0,139,139],
     _U_=[0,184,134,11],
     _V_=[0,169,169,169],
     _W_=[0,0,100,0],
     _X_=[0,169,169,169],
     _Y_=[0,189,183,107],
     _Z_=[0,139,0,139],
     ___=[0,85,107,47],
     _$_=[0,255,140,0],
     _aa_=[0,153,50,204],
     _ab_=[0,139,0,0],
     _ac_=[0,233,150,122],
     _ad_=[0,143,188,143],
     _ae_=[0,72,61,139],
     _af_=[0,47,79,79],
     _ag_=[0,47,79,79],
     _ah_=[0,0,206,209],
     _ai_=[0,148,0,211],
     _aj_=[0,255,20,147],
     _ak_=[0,0,191,255],
     _al_=[0,105,105,105],
     _am_=[0,105,105,105],
     _an_=[0,30,144,255],
     _ao_=[0,178,34,34],
     _ap_=[0,255,250,240],
     _aq_=[0,34,139,34],
     _ar_=[0,255,0,255],
     _as_=[0,220,220,220],
     _at_=[0,248,248,255],
     _au_=[0,255,215,0],
     _av_=[0,218,165,32],
     _aw_=[0,128,128,128],
     _ax_=[0,128,128,128],
     _ay_=[0,0,128,0],
     _az_=[0,173,255,47],
     _aA_=[0,240,255,240],
     _aB_=[0,255,105,180],
     _aC_=[0,205,92,92],
     _aD_=[0,75,0,130],
     _aE_=[0,255,255,240],
     _aF_=[0,240,230,140],
     _aG_=[0,230,230,250],
     _aH_=[0,255,240,245],
     _aI_=[0,124,252,0],
     _aJ_=[0,255,250,205],
     _aK_=[0,173,216,230],
     _aL_=[0,240,128,128],
     _aM_=[0,224,255,255],
     _aN_=[0,250,250,210],
     _aO_=[0,211,211,211],
     _aP_=[0,144,238,144],
     _aQ_=[0,211,211,211],
     _aR_=[0,255,182,193],
     _aS_=[0,255,160,122],
     _aT_=[0,32,178,170],
     _aU_=[0,135,206,250],
     _aV_=[0,119,136,153],
     _aW_=[0,119,136,153],
     _aX_=[0,176,196,222],
     _aY_=[0,255,255,224],
     _aZ_=[0,0,255,0],
     _a0_=[0,50,205,50],
     _a1_=[0,250,240,230],
     _a2_=[0,255,0,255],
     _a3_=[0,128,0,0],
     _a4_=[0,102,205,170],
     _a5_=[0,0,0,205],
     _a6_=[0,186,85,211],
     _a7_=[0,147,112,219],
     _a8_=[0,60,179,113],
     _a9_=[0,123,104,238],
     _a__=[0,0,250,154],
     _a$_=[0,72,209,204],
     _ba_=[0,199,21,133],
     _bb_=[0,25,25,112],
     _bc_=[0,245,255,250],
     _bd_=[0,255,228,225],
     _be_=[0,255,228,181],
     _bf_=[0,255,222,173],
     _bg_=[0,0,0,128],
     _bh_=[0,253,245,230],
     _bi_=[0,128,128,0],
     _bj_=[0,107,142,35],
     _bk_=[0,255,165,0],
     _bl_=[0,255,69,0],
     _bm_=[0,218,112,214],
     _bn_=[0,238,232,170],
     _bo_=[0,152,251,152],
     _bp_=[0,175,238,238],
     _bq_=[0,219,112,147],
     _br_=[0,255,239,213],
     _bs_=[0,255,218,185],
     _bt_=[0,205,133,63],
     _bu_=[0,255,192,203],
     _bv_=[0,221,160,221],
     _bw_=[0,176,224,230],
     _bx_=[0,128,0,128],
     _by_=[0,255,0,0],
     _bz_=[0,188,143,143],
     _bA_=[0,65,105,225],
     _bB_=[0,139,69,19],
     _bC_=[0,250,128,114],
     _bD_=[0,244,164,96],
     _bE_=[0,46,139,87],
     _bF_=[0,255,245,238],
     _bG_=[0,160,82,45],
     _bH_=[0,192,192,192],
     _bI_=[0,135,206,235],
     _bJ_=[0,106,90,205],
     _bK_=[0,112,128,144],
     _bL_=[0,112,128,144],
     _bM_=[0,255,250,250],
     _bN_=[0,0,255,127],
     _bO_=[0,70,130,180],
     _bP_=[0,210,180,140],
     _bQ_=[0,0,128,128],
     _bR_=[0,216,191,216],
     _bS_=[0,255,99,71],
     _bT_=[0,64,224,208],
     _bU_=[0,238,130,238],
     _bV_=[0,245,222,179],
     _bW_=[0,255,255,255],
     _bX_=[0,245,245,245],
     _bY_=[0,255,255,0],
     _bZ_=[0,154,205,50];
    function symbol(x,y){return x < y?1:0}
    function symbol$0(x,y){return x <= y?1:0}
    function symbol$1(x,y){return x !== y?1:0}
    function symbol$2(x,y){return x === y?1:0}
    function symbol$3(x,y){return y < x?1:0}
    function symbol$4(x,y){return y <= x?1:0}
    var compare=runtime.caml_int_compare;
    function equal(x,y){return x === y?1:0}
    function max(x,y){return y <= x?x:y}
    function min(x,y){return x <= y?x:y}
    var
     Int_replace_polymorphic_compar=
      [0,
       symbol,
       symbol$0,
       symbol$1,
       symbol$2,
       symbol$3,
       symbol$4,
       compare,
       equal,
       max,
       min],
     make=Stdlib_String[1],
     init=Stdlib_String[2],
     empty=Stdlib_String[3],
     of_bytes=Stdlib_String[4],
     to_bytes=Stdlib_String[5],
     concat=Stdlib_String[6],
     cat=Stdlib_String[7],
     compare$0=Stdlib_String[9],
     starts_with=Stdlib_String[10],
     ends_with=Stdlib_String[11],
     contains_from=Stdlib_String[12],
     rcontains_from=Stdlib_String[13],
     contains=Stdlib_String[14],
     sub=Stdlib_String[15],
     split_on_char=Stdlib_String[16],
     map=Stdlib_String[17],
     mapi=Stdlib_String[18],
     fold_left=Stdlib_String[19],
     fold_right=Stdlib_String[20],
     for_all=Stdlib_String[21],
     exists=Stdlib_String[22],
     trim=Stdlib_String[23],
     escaped=Stdlib_String[24],
     uppercase_ascii=Stdlib_String[25],
     lowercase_ascii=Stdlib_String[26],
     capitalize_ascii=Stdlib_String[27],
     uncapitalize_ascii=Stdlib_String[28],
     iter=Stdlib_String[29],
     iteri=Stdlib_String[30],
     index_from=Stdlib_String[31],
     index_from_opt=Stdlib_String[32],
     rindex_from=Stdlib_String[33],
     rindex_from_opt=Stdlib_String[34],
     index=Stdlib_String[35],
     index_opt=Stdlib_String[36],
     rindex=Stdlib_String[37],
     rindex_opt=Stdlib_String[38],
     to_seq=Stdlib_String[39],
     to_seqi=Stdlib_String[40],
     of_seq=Stdlib_String[41],
     get_utf_8_uchar=Stdlib_String[42],
     is_valid_utf_8=Stdlib_String[43],
     get_utf_16be_uchar=Stdlib_String[44],
     is_valid_utf_16be=Stdlib_String[45],
     get_utf_16le_uchar=Stdlib_String[46],
     is_valid_utf_16le=Stdlib_String[47],
     blit=Stdlib_String[48],
     copy=Stdlib_String[49],
     fill=Stdlib_String[50],
     uppercase=Stdlib_String[51],
     lowercase=Stdlib_String[52],
     capitalize=Stdlib_String[53],
     uncapitalize=Stdlib_String[54],
     get_uint8=Stdlib_String[55],
     get_int8=Stdlib_String[56],
     get_uint16_ne=Stdlib_String[57],
     get_uint16_be=Stdlib_String[58],
     get_uint16_le=Stdlib_String[59],
     get_int16_ne=Stdlib_String[60],
     get_int16_be=Stdlib_String[61],
     get_int16_le=Stdlib_String[62],
     get_int32_ne=Stdlib_String[63],
     get_int32_be=Stdlib_String[64],
     get_int32_le=Stdlib_String[65],
     get_int64_ne=Stdlib_String[66],
     get_int64_be=Stdlib_String[67],
     get_int64_le=Stdlib_String[68];
    function equal$0(x,y){return runtime.caml_string_equal(x,y)}
    var
     String=
      [0,
       make,
       init,
       empty,
       of_bytes,
       to_bytes,
       concat,
       cat,
       compare$0,
       starts_with,
       ends_with,
       contains_from,
       rcontains_from,
       contains,
       sub,
       split_on_char,
       map,
       mapi,
       fold_left,
       fold_right,
       for_all,
       exists,
       trim,
       escaped,
       uppercase_ascii,
       lowercase_ascii,
       capitalize_ascii,
       uncapitalize_ascii,
       iter,
       iteri,
       index_from,
       index_from_opt,
       rindex_from,
       rindex_from_opt,
       index,
       index_opt,
       rindex,
       rindex_opt,
       to_seq,
       to_seqi,
       of_seq,
       get_utf_8_uchar,
       is_valid_utf_8,
       get_utf_16be_uchar,
       is_valid_utf_16be,
       get_utf_16le_uchar,
       is_valid_utf_16le,
       blit,
       copy,
       fill,
       uppercase,
       lowercase,
       capitalize,
       uncapitalize,
       get_uint8,
       get_int8,
       get_uint16_ne,
       get_uint16_be,
       get_uint16_le,
       get_int16_ne,
       get_int16_be,
       get_int16_le,
       get_int32_ne,
       get_int32_be,
       get_int32_le,
       get_int64_ne,
       get_int64_be,
       get_int64_le,
       equal$0],
     chr=Stdlib_Char[1],
     escaped$0=Stdlib_Char[2],
     lowercase$0=Stdlib_Char[3],
     uppercase$0=Stdlib_Char[4],
     lowercase_ascii$0=Stdlib_Char[5],
     uppercase_ascii$0=Stdlib_Char[6],
     compare$1=Stdlib_Char[7];
    function equal$1(x,y){return x === y?1:0}
    var
     Char=
      [0,
       chr,
       escaped$0,
       lowercase$0,
       uppercase$0,
       lowercase_ascii$0,
       uppercase_ascii$0,
       compare$1,
       equal$1],
     symbol$5=Int_replace_polymorphic_compar[1],
     symbol$6=Int_replace_polymorphic_compar[2],
     symbol$7=Int_replace_polymorphic_compar[3],
     symbol$8=Int_replace_polymorphic_compar[4],
     symbol$9=Int_replace_polymorphic_compar[5],
     symbol$10=Int_replace_polymorphic_compar[6],
     compare$2=Int_replace_polymorphic_compar[7],
     equal$2=Int_replace_polymorphic_compar[8],
     max$0=Int_replace_polymorphic_compar[9],
     min$0=Int_replace_polymorphic_compar[10],
     Js_of_ocaml_Import=
      [0,
       Poly,
       Int_replace_polymorphic_compar,
       String,
       Char,
       symbol$5,
       symbol$6,
       symbol$7,
       symbol$8,
       symbol$9,
       symbol$10,
       compare$2,
       equal$2,
       max$0,
       min$0];
    caml_register_global(1638,Js_of_ocaml_Import,"Js_of_ocaml__Import");
    var global=globalThis,Unsafe=[0,global],no_handler=null,t39=undefined;
    function return$0(_gO_){return _gO_}
    function map$0(x,f){return x == no_handler?no_handler:caml_call1(f,x)}
    function bind(x,f){return x == no_handler?no_handler:caml_call1(f,x)}
    function test(x){return 1 - (x == no_handler?1:0)}
    function iter$0(x,f)
     {var _gN_=1 - (x == no_handler?1:0);return _gN_?caml_call1(f,x):_gN_}
    function case$0(x,f,g)
     {return x == no_handler?caml_call1(f,0):caml_call1(g,x)}
    function get(x,f){return x == no_handler?caml_call1(f,0):x}
    function option(x){if(x){var x$0=x[1];return x$0}return no_handler}
    function to_option(x)
     {function _gM_(x){return [0,x]}
      return case$0(x,function(param){return 0},_gM_)}
    var
     Opt=
      [0,
       no_handler,
       return$0,
       map$0,
       bind,
       test,
       iter$0,
       case$0,
       get,
       option,
       to_option];
    function return$1(_gL_){return _gL_}
    function map$1(x,f){return x === t39?t39:caml_call1(f,x)}
    function bind$0(x,f){return x === t39?t39:caml_call1(f,x)}
    function test$0(x){return x !== t39?1:0}
    function iter$1(x,f)
     {var _gK_=x !== t39?1:0;return _gK_?caml_call1(f,x):_gK_}
    function case$1(x,f,g){return x === t39?caml_call1(f,0):caml_call1(g,x)}
    function get$0(x,f){return x === t39?caml_call1(f,0):x}
    function option$0(x){if(x){var x$0=x[1];return x$0}return t39}
    function to_option$0(x)
     {function _gJ_(x){return [0,x]}
      return case$1(x,function(param){return 0},_gJ_)}
    var
     Optdef=
      [0,
       t39,
       return$1,
       map$1,
       bind$0,
       test$0,
       iter$1,
       case$1,
       get$0,
       option$0,
       to_option$0];
    function coerce(x,f,g)
     {function _gH_(param){return caml_call1(g,x)}
      var _gI_=caml_call1(f,x);
      return caml_call2(Opt[8],_gI_,_gH_)}
    function coerce_opt(x,f,g)
     {function _gF_(param){return caml_call1(g,x)}
      var _gG_=caml_call2(Opt[4],x,f);
      return caml_call2(Opt[8],_gG_,_gF_)}
    var
     t25=true,
     t4=false,
     string_constr=Unsafe[1].String,
     t11=Unsafe[1].RegExp,
     t4$0=Unsafe[1].Object;
    function object_keys(t3){return t4$0.keys(t3)}
    var
     array_length=Unsafe[1].Array,
     array_get=caml_js_get,
     array_set=caml_js_set;
    function array_map(f,a)
     {return a.map
              (caml_js_wrap_callback
                (function(x,idx,param){return caml_call1(f,x)}))}
    function array_mapi(f,a)
     {return a.map
              (caml_js_wrap_callback
                (function(x,idx,param){return caml_call2(f,idx,x)}))}
    function str_array(_gE_){return _gE_}
    function match_result(_gD_){return _gD_}
    var
     t122=Unsafe[1].Date,
     math=Unsafe[1].Math,
     error_constr=Unsafe[1].Error,
     include=Jsoo_runtime[3],
     raise=include[1],
     attach_js_backtrace=include[2],
     of_exn=include[3],
     Error=include[4];
    function name(e){return caml_string_of_jsstring(e.name)}
    function message(e){return caml_string_of_jsstring(e.message)}
    function stack(e)
     {var _gC_=caml_call2(Opt[3],e.stack,caml_string_of_jsstring);
      return caml_call1(Opt[10],_gC_)}
    function to_string(e){return caml_string_of_jsstring(e.toString())}
    function raise_js_error(e){return caml_call1(raise,e)}
    function string_of_error(e){return to_string(e)}
    var JSON=Unsafe[1].JSON;
    function decodeURI(s){return Unsafe[1].decodeURI(s)}
    function decodeURIComponent(s){return Unsafe[1].decodeURIComponent(s)}
    function encodeURI(s){return Unsafe[1].encodeURI(s)}
    function encodeURIComponent(s){return Unsafe[1].encodeURIComponent(s)}
    function escape(s){return Unsafe[1].escape(s)}
    function unescape(s){return Unsafe[1].unescape(s)}
    function isNaN(i){return Unsafe[1].isNaN(i) | 0}
    function parseInt(s)
     {var s$0=Unsafe[1].parseInt(s);
      return isNaN(s$0)?caml_call1(Stdlib[2],cst_parseInt):s$0}
    function parseFloat(s)
     {var s$0=Unsafe[1].parseFloat(s);
      return isNaN(s$0)?caml_call1(Stdlib[2],cst_parseFloat):s$0}
    function _a_(param)
     {if(param[1] === Error){var e=param[2];return [0,to_string(e)]}return 0}
    caml_call1(Stdlib_Printexc[9],_a_);
    function _b_(e)
     {return e instanceof array_length
              ?0
              :[0,caml_string_of_jsstring(e.toString())]}
    caml_call1(Stdlib_Printexc[9],_b_);
    function export_js(field,x){return jsoo_exports[field] = x}
    function export$0(field,x)
     {return export_js(caml_jsstring_of_string(field),x)}
    function export_all(obj)
     {var
       t27=object_keys(obj),
       t26=
        caml_js_wrap_callback
         (function(key,param,_gB_){return export_js(key,obj[key])});
      return t27.forEach(t26)}
    var _c_=runtime.caml_js_error_of_exception;
    function _d_(_gA_){return _gA_}
    var
     _e_=
      [0,
       to_string,
       name,
       message,
       stack,
       raise,
       attach_js_backtrace,
       of_exn,
       Error,
       function(_gz_){return _gz_},
       _d_];
    function _f_(_gy_){return _gy_}
    var
     Js_of_ocaml_Js=
      [0,
       no_handler,
       function(_gx_){return _gx_},
       t39,
       _f_,
       Opt,
       Optdef,
       t25,
       t4,
       string_constr,
       t11,
       t11,
       t11,
       object_keys,
       array_length,
       array_length,
       array_get,
       array_set,
       array_map,
       array_mapi,
       str_array,
       match_result,
       t122,
       t122,
       t122,
       t122,
       t122,
       t122,
       t122,
       t122,
       t122,
       math,
       error_constr,
       _e_,
       JSON,
       decodeURI,
       decodeURIComponent,
       encodeURI,
       encodeURIComponent,
       escape,
       unescape,
       isNaN,
       parseInt,
       parseFloat,
       coerce,
       coerce_opt,
       export$0,
       export_all,
       Unsafe,
       string_of_error,
       raise_js_error,
       attach_js_backtrace,
       _c_,
       Error];
    caml_register_global(1642,Js_of_ocaml_Js,"Js_of_ocaml__Js");
    function list_of_nodeList(nodeList)
     {var length=nodeList.length,acc=0,i=0;
      for(;;)
       {if(caml_call2(symbol$5,i,length))
         {var _gw_=nodeList.item(i),match=caml_call1(Opt[10],_gw_);
          if(match)
           {var e=match[1],i$0=i + 1 | 0,acc$0=[0,e,acc],acc=acc$0,i=i$0;
            continue}
          var i$1=i + 1 | 0,i=i$1;
          continue}
        return caml_call1(Stdlib_List[9],acc)}}
    var
     disconnected=1,
     preceding=2,
     following=4,
     contains$0=8,
     contained_by=16,
     implementation_specific=32;
    function has(t,mask){return caml_call2(symbol$8,t & mask,mask)}
    function add(x,y){return x | y}
    var
     DocumentPosition=
      [0,
       disconnected,
       preceding,
       following,
       contains$0,
       contained_by,
       implementation_specific,
       has,
       add,
       add];
    function appendChild(p,n){p.appendChild(n);return 0}
    function removeChild(p,n){p.removeChild(n);return 0}
    function replaceChild(p,n,o){p.replaceChild(n,o);return 0}
    function insertBefore(p,n,o){p.insertBefore(n,o);return 0}
    function nodeType(e)
     {var match=e.nodeType;
      if(match)
       switch(match - 1 | 0)
        {case 0:return [0,e];case 1:return [1,e];case 2:case 3:return [2,e]}
      return [3,e]}
    function cast(e,t){return e.nodeType === t?e:no_handler}
    function element(e){return cast(e,1)}
    function text(e)
     {if(3 !== e.nodeType && 4 !== e.nodeType)return no_handler;return e}
    function attr(e){return cast(e,2)}
    function handler(f)
     {return function(e)
       {if(caml_call1(Opt[5],e))
         {var res=caml_call1(f,e);
          if(1 - (res | 0))e.preventDefault();
          return res}
        var t18=event,t17=caml_call1(f,t18);
        if(1 - (t17 | 0))t18.returnValue = t17;
        return t17}}
    function full_handler(f)
     {return runtime.caml_js_wrap_meth_callback_unsafe
              (function(this$0,e)
                {if(caml_call1(Opt[5],e))
                  {var res=caml_call2(f,this$0,e);
                   if(1 - (res | 0))e.preventDefault();
                   return res}
                 var t21=event,t20=caml_call2(f,this$0,t21);
                 if(1 - (t20 | 0))t21.returnValue = t20;
                 return t20})}
    function invoke_handler(f,this$0,event){return f.call(this$0,event)}
    function eventTarget(e)
     {function _gt_(param)
       {function _gv_(param){throw Stdlib[8]}
        return caml_call2(Opt[8],e.srcElement,_gv_)}
      var t27=caml_call2(Opt[8],e.target,_gt_);
      if(t27 instanceof Unsafe[1].Node)
       {if(3 === t27.nodeType)
         {var _gu_=function(param){throw [0,Assert_failure,_g_]};
          return caml_call2(Opt[8],t27.parentNode,_gu_)}
        return t27}
      return t27}
    function make$0(s){return caml_jsstring_of_string(s)}
    var Event=[0,make$0];
    function addEventListenerWithOptions(t50,t47,capture,once,passive,t48)
     {if(t50.addEventListener === t39)
       {var
         t34="on".concat(t47),
         t35=
          function(e)
           {var _gq_=[0,t48,e,[0]];
            return function(_gr_,_gs_)
             {return runtime.caml_js_call(_gq_,_gr_,_gs_)}};
        t50.attachEvent(t34,t35);
        return function(param){return t50.detachEvent(t34,t35)}}
      var t49={};
      function iter(t,f){if(t){var b=t[1];return caml_call1(f,b)}return 0}
      iter(capture,function(t37){return t49.capture = t37});
      iter(once,function(t39){return t49.once = t39});
      iter(passive,function(t41){return t49.passive = t41});
      t50.addEventListener(t47,t48,t49);
      return function(param){return t50.removeEventListener(t47,t48,t49)}}
    function addEventListener(e,typ,h,capt)
     {return addEventListenerWithOptions(e,typ,[0,capt],0,0,h)}
    function removeEventListener(id){return caml_call1(id,0)}
    function preventDefault(t54)
     {if(caml_call1(Optdef[5],t54.preventDefault))return t54.preventDefault();
      var t53=! ! 0;
      return t54.returnValue = t53}
    function createCustomEvent(bubbles,cancelable,detail,t62)
     {function opt_iter(f,param)
       {if(param){var x=param[1];return caml_call1(f,x)}return 0}
      var t63={};
      opt_iter(function(x){var t55=! ! x;return t63.bubbles = t55},bubbles);
      opt_iter
       (function(x){var t57=! ! x;return t63.cancelable = t57},cancelable);
      opt_iter(function(t59){return t63.detail = t59},detail);
      var t64=Unsafe[1].CustomEvent;
      return new t64(t62,t63)}
    var
     Js_of_ocaml_Dom=
      [0,
       DocumentPosition,
       insertBefore,
       replaceChild,
       removeChild,
       appendChild,
       list_of_nodeList,
       nodeType,
       [0,element,text,attr],
       no_handler,
       handler,
       full_handler,
       invoke_handler,
       eventTarget,
       Event,
       addEventListenerWithOptions,
       addEventListener,
       removeEventListener,
       preventDefault,
       createCustomEvent];
    caml_register_global(1645,Js_of_ocaml_Dom,"Js_of_ocaml__Dom");
    var
     arrayBuffer=Unsafe[1].ArrayBuffer,
     int8Array_inBuffer=Unsafe[1].Int8Array,
     t11$0=Unsafe[1].Uint8Array,
     int16Array_inBuffer=Unsafe[1].Int16Array,
     uint16Array_inBuffer=Unsafe[1].Uint16Array,
     int32Array_inBuffer=Unsafe[1].Int32Array,
     uint32Array_inBuffer=Unsafe[1].Uint32Array,
     float32Array_inBuffer=Unsafe[1].Float32Array,
     float64Array_inBuffer=Unsafe[1].Float64Array,
     set=caml_js_set;
    function get$1(a,i){return a[i]}
    function unsafe_get(a,i){return a[i]}
    var dataView=Unsafe[1].DataView;
    function of_arrayBuffer(ab)
     {var uint8=new t11$0(ab);return caml_string_of_array(uint8)}
    var
     Js_of_ocaml_Typed_array=
      [0,
       arrayBuffer,
       runtime.caml_ba_kind_of_typed_array,
       runtime.caml_ba_to_typed_array,
       runtime.caml_ba_from_typed_array,
       int8Array_inBuffer,
       int8Array_inBuffer,
       int8Array_inBuffer,
       int8Array_inBuffer,
       int8Array_inBuffer,
       t11$0,
       t11$0,
       t11$0,
       t11$0,
       t11$0,
       int16Array_inBuffer,
       int16Array_inBuffer,
       int16Array_inBuffer,
       int16Array_inBuffer,
       int16Array_inBuffer,
       uint16Array_inBuffer,
       uint16Array_inBuffer,
       uint16Array_inBuffer,
       uint16Array_inBuffer,
       uint16Array_inBuffer,
       int32Array_inBuffer,
       int32Array_inBuffer,
       int32Array_inBuffer,
       int32Array_inBuffer,
       int32Array_inBuffer,
       uint32Array_inBuffer,
       uint32Array_inBuffer,
       uint32Array_inBuffer,
       uint32Array_inBuffer,
       uint32Array_inBuffer,
       float32Array_inBuffer,
       float32Array_inBuffer,
       float32Array_inBuffer,
       float32Array_inBuffer,
       float32Array_inBuffer,
       float64Array_inBuffer,
       float64Array_inBuffer,
       float64Array_inBuffer,
       float64Array_inBuffer,
       float64Array_inBuffer,
       set,
       get$1,
       unsafe_get,
       dataView,
       dataView,
       [0,
        runtime.bigstring_to_array_buffer,
        runtime.bigstring_to_typed_array,
        runtime.bigstring_of_array_buffer,
        runtime.bigstring_of_typed_array],
       [0,of_arrayBuffer,caml_string_of_array]];
    caml_register_global
     (1646,Js_of_ocaml_Typed_array,"Js_of_ocaml__Typed_array");
    var t3=Unsafe[1].Blob;
    function filter_map(f,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var q=param$0[2],v=param$0[1],match=caml_call1(f,v);
          if(match){var v$0=match[1];return [0,v$0,filter_map(f,q)]}
          var param$0=q;
          continue}
        return 0}}
    function blob_raw(contentType,endings,a)
     {var _gm_=0;
      if(endings)
       var _gn_=116179762 <= endings[1]?_h_:_i_,_go_=_gn_;
      else
       var _go_=0;
      var
       _gp_=[0,[0,cst_type,contentType],[0,[0,cst_endings,_go_],_gm_]],
       options=
        filter_map
         (function(param)
           {var v=param[2],name=param[1];
            if(v)
             {var v$0=v[1];return [0,[0,name,caml_jsstring_of_string(v$0)]]}
            return 0},
          _gp_),
       options$0=
        options
         ?runtime.caml_js_object(caml_call1(Stdlib_Array[12],options))
         :t39,
       t1=caml_js_from_array(a);
      return new t3(t1,options$0)}
    function blob_from_string(contentType,endings,s)
     {return blob_raw(contentType,endings,[0,caml_jsstring_of_string(s)])}
    function blob_from_any(contentType,endings,l)
     {function _gk_(param)
       {var _gl_=param[1];
        if(155580615 === _gl_){var s=param[2];return s}
        if(486041214 <= _gl_)
         {if(1037850489 <= _gl_){var a=param[2];return a}
          var a$0=param[2];
          return a$0}
        if(288368849 <= _gl_)
         {var s$0=param[2];return caml_jsstring_of_string(s$0)}
        var b=param[2];
        return b}
      var l$0=caml_call2(Stdlib_List[19],_gk_,l);
      return blob_raw(contentType,endings,caml_call1(Stdlib_Array[12],l$0))}
    function filename(file)
     {var match=caml_call1(Optdef[10],file.name);
      if(match){var name=match[1];return name}
      var match$0=caml_call1(Optdef[10],file.fileName);
      if(match$0){var name$0=match$0[1];return name$0}
      return caml_call1(Stdlib[2],cst_can_t_retrieve_file_name_n)}
    var doc_constr=Unsafe[1].Document;
    function document(e){return e instanceof doc_constr?e:no_handler}
    function blob(e){return e instanceof t3?e:no_handler}
    function string(e){return typeof e === "string"?e:no_handler}
    function arrayBuffer$0(e){return e instanceof arrayBuffer?e:no_handler}
    var
     loadstart=caml_call1(Event[1],cst_loadstart),
     progress=caml_call1(Event[1],cst_progress),
     abort=caml_call1(Event[1],cst_abort),
     error=caml_call1(Event[1],cst_error),
     load=caml_call1(Event[1],cst_load),
     loadend=caml_call1(Event[1],cst_loadend),
     ReaderEvent=[0,loadstart,progress,abort,error,load,loadend],
     fileReader=Unsafe[1].FileReader,
     Js_of_ocaml_File=
      [0,
       blob_from_string,
       blob_from_any,
       [0,document,blob,function(_gj_){return _gj_},string,arrayBuffer$0],
       ReaderEvent,
       filename,
       fileReader,
       addEventListener];
    caml_register_global(1648,Js_of_ocaml_File,"Js_of_ocaml__File");
    var
     onIE=runtime.caml_js_on_ie(0) | 0,
     click=caml_call1(Event[1],cst_click),
     copy$0=caml_call1(Event[1],cst_copy),
     cut=caml_call1(Event[1],cst_cut),
     paste=caml_call1(Event[1],cst_paste),
     dblclick=caml_call1(Event[1],cst_dblclick),
     mousedown=caml_call1(Event[1],cst_mousedown),
     mouseup=caml_call1(Event[1],cst_mouseup),
     mouseover=caml_call1(Event[1],cst_mouseover),
     mousemove=caml_call1(Event[1],cst_mousemove),
     mouseout=caml_call1(Event[1],cst_mouseout),
     keypress=caml_call1(Event[1],cst_keypress),
     keydown=caml_call1(Event[1],cst_keydown),
     keyup=caml_call1(Event[1],cst_keyup),
     mousewheel=caml_call1(Event[1],cst_mousewheel),
     DOMMouseScroll=caml_call1(Event[1],cst_DOMMouseScroll),
     touchstart=caml_call1(Event[1],cst_touchstart),
     touchmove=caml_call1(Event[1],cst_touchmove),
     touchend=caml_call1(Event[1],cst_touchend),
     touchcancel=caml_call1(Event[1],cst_touchcancel),
     dragstart=caml_call1(Event[1],cst_dragstart),
     dragend=caml_call1(Event[1],cst_dragend),
     dragenter=caml_call1(Event[1],cst_dragenter),
     dragover=caml_call1(Event[1],cst_dragover),
     dragleave=caml_call1(Event[1],cst_dragleave),
     drag=caml_call1(Event[1],cst_drag),
     drop=caml_call1(Event[1],cst_drop),
     hashchange=caml_call1(Event[1],cst_hashchange),
     change=caml_call1(Event[1],cst_change),
     input=caml_call1(Event[1],cst_input),
     timeupdate=caml_call1(Event[1],cst_timeupdate),
     submit=caml_call1(Event[1],cst_submit),
     scroll=caml_call1(Event[1],cst_scroll),
     focus=caml_call1(Event[1],cst_focus),
     blur=caml_call1(Event[1],cst_blur),
     load$0=caml_call1(Event[1],cst_load$0),
     unload=caml_call1(Event[1],cst_unload),
     beforeunload=caml_call1(Event[1],cst_beforeunload),
     resize=caml_call1(Event[1],cst_resize),
     orientationchange=caml_call1(Event[1],cst_orientationchange),
     popstate=caml_call1(Event[1],cst_popstate),
     error$0=caml_call1(Event[1],cst_error$0),
     abort$0=caml_call1(Event[1],cst_abort$0),
     select=caml_call1(Event[1],cst_select),
     online=caml_call1(Event[1],cst_online),
     offline=caml_call1(Event[1],cst_offline),
     checking=caml_call1(Event[1],cst_checking),
     noupdate=caml_call1(Event[1],cst_noupdate),
     downloading=caml_call1(Event[1],cst_downloading),
     progress$0=caml_call1(Event[1],cst_progress$0),
     updateready=caml_call1(Event[1],cst_updateready),
     cached=caml_call1(Event[1],cst_cached),
     obsolete=caml_call1(Event[1],cst_obsolete),
     domContentLoaded=caml_call1(Event[1],cst_DOMContentLoaded),
     animationstart=caml_call1(Event[1],cst_animationstart),
     animationend=caml_call1(Event[1],cst_animationend),
     animationiteration=caml_call1(Event[1],cst_animationiteration),
     animationcancel=caml_call1(Event[1],cst_animationcancel),
     canplay=caml_call1(Event[1],cst_canplay),
     canplaythrough=caml_call1(Event[1],cst_canplaythrough),
     durationchange=caml_call1(Event[1],cst_durationchange),
     emptied=caml_call1(Event[1],cst_emptied),
     ended=caml_call1(Event[1],cst_ended),
     gotpointercapture=caml_call1(Event[1],cst_gotpointercapture),
     loadeddata=caml_call1(Event[1],cst_loadeddata),
     loadedmetadata=caml_call1(Event[1],cst_loadedmetadata),
     loadstart$0=caml_call1(Event[1],cst_loadstart$0),
     lostpointercapture=caml_call1(Event[1],cst_lostpointercapture),
     message$0=caml_call1(Event[1],cst_message),
     pause=caml_call1(Event[1],cst_pause),
     play=caml_call1(Event[1],cst_play),
     playing=caml_call1(Event[1],cst_playing),
     pointerenter=caml_call1(Event[1],cst_pointerenter),
     pointercancel=caml_call1(Event[1],cst_pointercancel),
     pointerdown=caml_call1(Event[1],cst_pointerdown),
     pointerleave=caml_call1(Event[1],cst_pointerleave),
     pointermove=caml_call1(Event[1],cst_pointermove),
     pointerout=caml_call1(Event[1],cst_pointerout),
     pointerover=caml_call1(Event[1],cst_pointerover),
     pointerup=caml_call1(Event[1],cst_pointerup),
     ratechange=caml_call1(Event[1],cst_ratechange),
     seeked=caml_call1(Event[1],cst_seeked),
     seeking=caml_call1(Event[1],cst_seeking),
     stalled=caml_call1(Event[1],cst_stalled),
     suspend=caml_call1(Event[1],cst_suspend),
     volumechange=caml_call1(Event[1],cst_volumechange),
     waiting=caml_call1(Event[1],cst_waiting),
     make$1=Event[1],
     Event$0=
      [0,
       click,
       copy$0,
       cut,
       paste,
       dblclick,
       mousedown,
       mouseup,
       mouseover,
       mousemove,
       mouseout,
       keypress,
       keydown,
       keyup,
       mousewheel,
       DOMMouseScroll,
       touchstart,
       touchmove,
       touchend,
       touchcancel,
       dragstart,
       dragend,
       dragenter,
       dragover,
       dragleave,
       drag,
       drop,
       hashchange,
       change,
       input,
       timeupdate,
       submit,
       scroll,
       focus,
       blur,
       load$0,
       unload,
       beforeunload,
       resize,
       orientationchange,
       popstate,
       error$0,
       abort$0,
       select,
       online,
       offline,
       checking,
       noupdate,
       downloading,
       progress$0,
       updateready,
       cached,
       obsolete,
       domContentLoaded,
       animationstart,
       animationend,
       animationiteration,
       animationcancel,
       canplay,
       canplaythrough,
       durationchange,
       emptied,
       ended,
       gotpointercapture,
       loadeddata,
       loadedmetadata,
       loadstart$0,
       lostpointercapture,
       message$0,
       pause,
       play,
       playing,
       pointerenter,
       pointercancel,
       pointerdown,
       pointerleave,
       pointermove,
       pointerout,
       pointerover,
       pointerup,
       ratechange,
       seeked,
       seeking,
       stalled,
       suspend,
       volumechange,
       waiting,
       make$1],
     d="2d";
    function location_origin(loc)
     {function _gh_(o){return o}
      function _gi_(param)
       {var t8=loc.protocol,t7=loc.hostname,t9=loc.port;
        if
         (caml_call2(symbol$8,t8.length,0)
          &&
          caml_call2(symbol$8,t7.length,0))
         return "";
        var t13=t8.concat("//",t7);
        if(caml_call2(symbol$9,t9.length,0))
         {var t12=loc.port;return t13.concat(":",t12)}
        return t13}
      return caml_call3(Optdef[7],loc.origin,_gi_,_gh_)}
    var _j_=Unsafe[1],t87=_j_.document;
    function getElementById(id)
     {function _ge_(pnode){return pnode}
      function _gf_(param){throw Stdlib[8]}
      var t15=caml_jsstring_of_string(id),_gg_=t87.getElementById(t15);
      return caml_call3(Opt[7],_gg_,_gf_,_ge_)}
    function getElementById_exn(id)
     {function _ga_(pnode){return pnode}
      function _gb_(param)
       {var _gd_=caml_call2(Stdlib_Printf[4],_k_,id);
        return caml_call1(Stdlib[2],_gd_)}
      var t17=caml_jsstring_of_string(id),_gc_=t87.getElementById(t17);
      return caml_call3(Opt[7],_gc_,_gb_,_ga_)}
    function getElementById_opt(id)
     {var t19=caml_jsstring_of_string(id),_f$_=t87.getElementById(t19);
      return caml_call1(Opt[10],_f$_)}
    function getElementById_coerce(id,coerce)
     {function _f7_(e)
       {var _f__=caml_call1(coerce,e);return caml_call1(Opt[10],_f__)}
      function _f8_(param){return 0}
      var t21=caml_jsstring_of_string(id),_f9_=t87.getElementById(t21);
      return caml_call3(Opt[7],_f9_,_f8_,_f7_)}
    function opt_iter(x,f){if(x){var v=x[1];return caml_call1(f,v)}return 0}
    function createElement(t24,name)
     {var t23=caml_jsstring_of_string(name);return t24.createElement(t23)}
    function unsafeCreateElement(doc,name){return createElement(doc,name)}
    var createElementSyntax=[0,785140586];
    function unsafeCreateElementEx(type,name,doc,elt)
     {for(;;)
       {if(0 === type && 0 === name)return createElement(doc,elt);
        var _f1_=createElementSyntax[1];
        if(785140586 === _f1_)
         {try
           {var
             el=t87.createElement('<input name="x">'),
             _f4_=el.tagName.toLowerCase() === "input"?1:0,
             _f5_=_f4_?el.name === "x"?1:0:_f4_,
             _f2_=_f5_}
          catch(_f6_){var _f2_=0}
          var _f3_=_f2_?982028505:-1003883683;
          createElementSyntax[1] = _f3_;
          continue}
        if(982028505 <= _f1_)
         {var t40=new array_length();
          t40.push("<",caml_jsstring_of_string(elt));
          opt_iter
           (type,
            function(t)
             {var t34=caml_js_html_escape(t);
              t40.push(' type="',t34,'"');
              return 0});
          opt_iter
           (name,
            function(n)
             {var t38=caml_js_html_escape(n);
              t40.push(' name="',t38,'"');
              return 0});
          t40.push(">");
          return doc.createElement(t40.join(""))}
        var t28=createElement(doc,elt);
        opt_iter(type,function(t25){return t28.type = t25});
        opt_iter(name,function(t27){return t28.name = t27});
        return t28}}
    function createHtml(doc){return unsafeCreateElement(doc,cst_html)}
    function createHead(doc){return unsafeCreateElement(doc,cst_head)}
    function createLink(doc){return unsafeCreateElement(doc,cst_link)}
    function createTitle(doc){return unsafeCreateElement(doc,cst_title)}
    function createMeta(doc){return unsafeCreateElement(doc,cst_meta)}
    function createBase(doc){return unsafeCreateElement(doc,cst_base)}
    function createStyle(doc){return unsafeCreateElement(doc,cst_style)}
    function createBody(doc){return unsafeCreateElement(doc,cst_body)}
    function createForm(doc){return unsafeCreateElement(doc,cst_form)}
    function createOptgroup(doc){return unsafeCreateElement(doc,cst_optgroup)}
    function createOption(doc){return unsafeCreateElement(doc,cst_option)}
    function createSelect(type,name,doc)
     {return unsafeCreateElementEx(type,name,doc,cst_select$0)}
    function createInput(type,name,doc)
     {return unsafeCreateElementEx(type,name,doc,cst_input$0)}
    function createTextarea(type,name,doc)
     {return unsafeCreateElementEx(type,name,doc,cst_textarea)}
    function createButton(type,name,doc)
     {return unsafeCreateElementEx(type,name,doc,cst_button)}
    function createLabel(doc){return unsafeCreateElement(doc,cst_label)}
    function createFieldset(doc){return unsafeCreateElement(doc,cst_fieldset)}
    function createLegend(doc){return unsafeCreateElement(doc,cst_legend)}
    function createUl(doc){return unsafeCreateElement(doc,cst_ul)}
    function createOl(doc){return unsafeCreateElement(doc,cst_ol)}
    function createDl(doc){return unsafeCreateElement(doc,cst_dl)}
    function createLi(doc){return unsafeCreateElement(doc,cst_li)}
    function createDiv(doc){return unsafeCreateElement(doc,cst_div)}
    function createEmbed(doc){return unsafeCreateElement(doc,cst_embed)}
    function createP(doc){return unsafeCreateElement(doc,cst_p)}
    function createH1(doc){return unsafeCreateElement(doc,cst_h1)}
    function createH2(doc){return unsafeCreateElement(doc,cst_h2)}
    function createH3(doc){return unsafeCreateElement(doc,cst_h3)}
    function createH4(doc){return unsafeCreateElement(doc,cst_h4)}
    function createH5(doc){return unsafeCreateElement(doc,cst_h5)}
    function createH6(doc){return unsafeCreateElement(doc,cst_h6)}
    function createQ(doc){return unsafeCreateElement(doc,cst_q)}
    function createBlockquote(doc)
     {return unsafeCreateElement(doc,cst_blockquote)}
    function createPre(doc){return unsafeCreateElement(doc,cst_pre)}
    function createBr(doc){return unsafeCreateElement(doc,cst_br)}
    function createHr(doc){return unsafeCreateElement(doc,cst_hr)}
    function createIns(doc){return unsafeCreateElement(doc,cst_ins)}
    function createDel(doc){return unsafeCreateElement(doc,cst_del)}
    function createA(doc){return unsafeCreateElement(doc,cst_a)}
    function createImg(doc){return unsafeCreateElement(doc,cst_img)}
    function createObject(doc){return unsafeCreateElement(doc,cst_object)}
    function createParam(doc){return unsafeCreateElement(doc,cst_param)}
    function createMap(doc){return unsafeCreateElement(doc,cst_map)}
    function createArea(doc){return unsafeCreateElement(doc,cst_area)}
    function createScript(doc){return unsafeCreateElement(doc,cst_script)}
    function createTable(doc){return unsafeCreateElement(doc,cst_table)}
    function createCaption(doc){return unsafeCreateElement(doc,cst_caption)}
    function createCol(doc){return unsafeCreateElement(doc,cst_col)}
    function createColgroup(doc){return unsafeCreateElement(doc,cst_colgroup)}
    function createThead(doc){return unsafeCreateElement(doc,cst_thead)}
    function createTfoot(doc){return unsafeCreateElement(doc,cst_tfoot)}
    function createTbody(doc){return unsafeCreateElement(doc,cst_tbody)}
    function createTr(doc){return unsafeCreateElement(doc,cst_tr)}
    function createTh(doc){return unsafeCreateElement(doc,cst_th)}
    function createTd(doc){return unsafeCreateElement(doc,cst_td)}
    function createSub(doc){return createElement(doc,cst_sub)}
    function createSup(doc){return createElement(doc,cst_sup)}
    function createSpan(doc){return createElement(doc,cst_span)}
    function createTt(doc){return createElement(doc,cst_tt)}
    function createI(doc){return createElement(doc,cst_i)}
    function createB(doc){return createElement(doc,cst_b)}
    function createBig(doc){return createElement(doc,cst_big)}
    function createSmall(doc){return createElement(doc,cst_small)}
    function createEm(doc){return createElement(doc,cst_em)}
    function createStrong(doc){return createElement(doc,cst_strong)}
    function createCite(doc){return createElement(doc,cst_cite)}
    function createDfn(doc){return createElement(doc,cst_dfn)}
    function createCode(doc){return createElement(doc,cst_code)}
    function createSamp(doc){return createElement(doc,cst_samp)}
    function createKbd(doc){return createElement(doc,cst_kbd)}
    function createVar(doc){return createElement(doc,cst_var)}
    function createAbbr(doc){return createElement(doc,cst_abbr)}
    function createDd(doc){return createElement(doc,cst_dd)}
    function createDt(doc){return createElement(doc,cst_dt)}
    function createNoscript(doc){return createElement(doc,cst_noscript)}
    function createAddress(doc){return createElement(doc,cst_address)}
    function createFrameset(doc){return unsafeCreateElement(doc,cst_frameset)}
    function createFrame(doc){return unsafeCreateElement(doc,cst_frame)}
    function createIframe(doc){return unsafeCreateElement(doc,cst_iframe)}
    function createAudio(doc){return unsafeCreateElement(doc,cst_audio)}
    function createVideo(doc){return unsafeCreateElement(doc,cst_video)}
    var
     Canvas_not_available=
      [248,cst_Js_of_ocaml_Dom_html_Canva,caml_fresh_oo_id(0)];
    function createCanvas(doc)
     {var t52=unsafeCreateElement(doc,cst_canvas);
      if(1 - caml_call1(Opt[5],t52.getContext))throw Canvas_not_available;
      return t52}
    var
     html_element=Unsafe[1].HTMLElement,
     element$0=
      html_element === t39
       ?function(e){return e.innerHTML === t39?no_handler:e}
       :function(e){return e instanceof html_element?e:no_handler};
    function unsafeCoerce(tag,e)
     {var t56=e.tagName,_f0_=caml_jsstring_of_string(tag);
      return t56.toLowerCase() === _f0_?e:no_handler}
    function a(e){return unsafeCoerce(cst_a$0,e)}
    function area(e){return unsafeCoerce(cst_area$0,e)}
    function base(e){return unsafeCoerce(cst_base$0,e)}
    function blockquote(e){return unsafeCoerce(cst_blockquote$0,e)}
    function body(e){return unsafeCoerce(cst_body$0,e)}
    function br(e){return unsafeCoerce(cst_br$0,e)}
    function button(e){return unsafeCoerce(cst_button$0,e)}
    function canvas(e){return unsafeCoerce(cst_canvas$0,e)}
    function caption(e){return unsafeCoerce(cst_caption$0,e)}
    function col(e){return unsafeCoerce(cst_col$0,e)}
    function colgroup(e){return unsafeCoerce(cst_colgroup$0,e)}
    function del(e){return unsafeCoerce(cst_del$0,e)}
    function div(e){return unsafeCoerce(cst_div$0,e)}
    function dl(e){return unsafeCoerce(cst_dl$0,e)}
    function fieldset(e){return unsafeCoerce(cst_fieldset$0,e)}
    function embed(e){return unsafeCoerce(cst_embed$0,e)}
    function form(e){return unsafeCoerce(cst_form$0,e)}
    function frameset(e){return unsafeCoerce(cst_frameset$0,e)}
    function frame(e){return unsafeCoerce(cst_frame$0,e)}
    function h1(e){return unsafeCoerce(cst_h1$0,e)}
    function h2(e){return unsafeCoerce(cst_h2$0,e)}
    function h3(e){return unsafeCoerce(cst_h3$0,e)}
    function h4(e){return unsafeCoerce(cst_h4$0,e)}
    function h5(e){return unsafeCoerce(cst_h5$0,e)}
    function h6(e){return unsafeCoerce(cst_h6$0,e)}
    function head(e){return unsafeCoerce(cst_head$0,e)}
    function hr(e){return unsafeCoerce(cst_hr$0,e)}
    function html(e){return unsafeCoerce(cst_html$0,e)}
    function iframe(e){return unsafeCoerce(cst_iframe$0,e)}
    function img(e){return unsafeCoerce(cst_img$0,e)}
    function input$0(e){return unsafeCoerce(cst_input$1,e)}
    function ins(e){return unsafeCoerce(cst_ins$0,e)}
    function label(e){return unsafeCoerce(cst_label$0,e)}
    function legend(e){return unsafeCoerce(cst_legend$0,e)}
    function li(e){return unsafeCoerce(cst_li$0,e)}
    function link(e){return unsafeCoerce(cst_link$0,e)}
    function map$2(e){return unsafeCoerce(cst_map$0,e)}
    function meta(e){return unsafeCoerce(cst_meta$0,e)}
    function object(e){return unsafeCoerce(cst_object$0,e)}
    function ol(e){return unsafeCoerce(cst_ol$0,e)}
    function optgroup(e){return unsafeCoerce(cst_optgroup$0,e)}
    function option$1(e){return unsafeCoerce(cst_option$0,e)}
    function p(e){return unsafeCoerce(cst_p$0,e)}
    function param(e){return unsafeCoerce(cst_param$0,e)}
    function pre(e){return unsafeCoerce(cst_pre$0,e)}
    function q(e){return unsafeCoerce(cst_q$0,e)}
    function script(e){return unsafeCoerce(cst_script$0,e)}
    function select$0(e){return unsafeCoerce(cst_select$1,e)}
    function style(e){return unsafeCoerce(cst_style$0,e)}
    function table(e){return unsafeCoerce(cst_table$0,e)}
    function tbody(e){return unsafeCoerce(cst_tbody$0,e)}
    function td(e){return unsafeCoerce(cst_td$0,e)}
    function textarea(e){return unsafeCoerce(cst_textarea$0,e)}
    function tfoot(e){return unsafeCoerce(cst_tfoot$0,e)}
    function th(e){return unsafeCoerce(cst_th$0,e)}
    function thead(e){return unsafeCoerce(cst_thead$0,e)}
    function title(e){return unsafeCoerce(cst_title$0,e)}
    function tr(e){return unsafeCoerce(cst_tr$0,e)}
    function ul(e){return unsafeCoerce(cst_ul$0,e)}
    function audio(e){return unsafeCoerce(cst_audio$0,e)}
    function video(e){return unsafeCoerce(cst_video$0,e)}
    function unsafeCoerceEvent(constr,ev)
     {if(constr !== t39 && ev instanceof constr)return ev;return no_handler}
    function mouseEvent(ev){return unsafeCoerceEvent(Unsafe[1].MouseEvent,ev)}
    function keyboardEvent(ev)
     {return unsafeCoerceEvent(Unsafe[1].KeyboardEvent,ev)}
    function wheelEvent(ev){return unsafeCoerceEvent(Unsafe[1].WheelEvent,ev)}
    function mouseScrollEvent(ev)
     {return unsafeCoerceEvent(Unsafe[1].MouseScrollEvent,ev)}
    function popStateEvent(ev)
     {return unsafeCoerceEvent(Unsafe[1].PopStateEvent,ev)}
    function messageEvent(ev)
     {return unsafeCoerceEvent(Unsafe[1].MessageEvent,ev)}
    function eventRelatedTarget(e)
     {function _fX_(param)
       {var match=caml_string_of_jsstring(e.type);
        if(caml_string_notequal(match,cst_mouseout$0))
         {if(caml_string_notequal(match,cst_mouseover$0))return no_handler;
          var _fY_=function(param){throw [0,Assert_failure,_l_]};
          return caml_call2(Optdef[8],e.fromElement,_fY_)}
        function _fZ_(param){throw [0,Assert_failure,_m_]}
        return caml_call2(Optdef[8],e.toElement,_fZ_)}
      return caml_call2(Optdef[8],e.relatedTarget,_fX_)}
    function eventAbsolutePosition(e)
     {var t70=t87.body,t71=t87.documentElement;
      return [0,
              (e.clientX + t70.scrollLeft | 0) + t71.scrollLeft | 0,
              (e.clientY + t70.scrollTop | 0) + t71.scrollTop | 0]}
    function eventAbsolutePosition$0(e)
     {function _fT_(x)
       {function _fV_(y){return [0,x,y]}
        function _fW_(param){return eventAbsolutePosition(e)}
        return caml_call3(Optdef[7],e.pageY,_fW_,_fV_)}
      function _fU_(param){return eventAbsolutePosition(e)}
      return caml_call3(Optdef[7],e.pageX,_fU_,_fT_)}
    function elementClientPosition(e)
     {var t80=e.getBoundingClientRect(),t81=t87.body,t82=t87.documentElement;
      return [0,
              ((t80.left | 0) - t81.clientLeft | 0) - t82.clientLeft | 0,
              ((t80.top | 0) - t81.clientTop | 0) - t82.clientTop | 0]}
    function getDocumentScroll(param)
     {var t88=t87.body,t89=t87.documentElement;
      return [0,
              t88.scrollLeft + t89.scrollLeft | 0,
              t88.scrollTop + t89.scrollTop | 0]}
    function buttonPressed(ev)
     {function _fR_(x){return x}
      function _fS_(param)
       {var match=ev.button,switcher=match - 1 | 0;
        if(! (3 < switcher >>> 0))
         switch(switcher)
          {case 0:return 1;case 1:return 3;case 2:break;default:return 2}
        return 0}
      return caml_call3(Optdef[7],ev.which,_fS_,_fR_)}
    function addMousewheelEventListenerWith(e,capture,once,passive,h)
     {var t96=createDiv(t87);
      t96.setAttribute("onmousewheel","return;");
      if(typeof t96.onmousewheel === "function")
       {var
         _fN_=
          handler
           (function(e)
             {function _fP_(param){return 0}
              var
               dx=
                (- caml_call2(Optdef[8],e.wheelDeltaX,_fP_) | 0) / 40 | 0;
              function _fQ_(param){return e.wheelDelta}
              var
               dy=
                (- caml_call2(Optdef[8],e.wheelDeltaY,_fQ_) | 0) / 40 | 0;
              return caml_call3(h,e,dx,dy)});
        return addEventListenerWithOptions
                (e,Event$0[14],capture,once,passive,_fN_)}
      var
       _fO_=
        handler
         (function(e)
           {var d=e.detail;
            return e.axis === e.HORIZONTAL
                    ?caml_call3(h,e,d,0)
                    :caml_call3(h,e,0,d)});
      return addEventListenerWithOptions
              (e,Event$0[15],capture,once,passive,_fO_)}
    function addMousewheelEventListener(e,h,capt)
     {return addMousewheelEventListenerWith(e,[0,capt],0,0,h)}
    function f(v)
     {var
       match=caml_string_of_jsstring(v),
       switch$0=caml_string_compare(match,cst_KeyH);
      if(0 <= switch$0)
       {if(! (0 < switch$0))return 8;
        var switch$1=caml_string_compare(match,cst_Numpad4);
        if(0 <= switch$1)
         {if(! (0 < switch$1))return 72;
          var switch$2=caml_string_compare(match,cst_PageUp);
          if(0 <= switch$2)
           {if(! (0 < switch$2))return 98;
            var switch$3=caml_string_compare(match,cst_ShiftRight);
            if(0 <= switch$3)
             {if(! (0 < switch$3))return 91;
              if(! caml_string_notequal(match,cst_Slash))return 55;
              if(! caml_string_notequal(match,cst_Space))return 41;
              if(! caml_string_notequal(match,cst_Tab))return 39;
              if(! caml_string_notequal(match,cst_VolumeDown))return 103;
              if(! caml_string_notequal(match,cst_VolumeMute))return 102;
              if(! caml_string_notequal(match,cst_VolumeUp))return 104}
            else
             {if(! caml_string_notequal(match,cst_Pause))return 123;
              if(! caml_string_notequal(match,cst_Period))return 54;
              if(! caml_string_notequal(match,cst_PrintScreen))return 120;
              if(! caml_string_notequal(match,cst_Quote))return 50;
              if(! caml_string_notequal(match,cst_ScrollLock))return 119;
              if(! caml_string_notequal(match,cst_Semicolon))return 49;
              if(! caml_string_notequal(match,cst_ShiftLeft))return 90}}
          else
           {var switch$4=caml_string_compare(match,cst_NumpadDivide);
            if(0 <= switch$4)
             {if(! (0 < switch$4))return 84;
              if(! caml_string_notequal(match,cst_NumpadEnter))return 83;
              if(! caml_string_notequal(match,cst_NumpadEqual))return 82;
              if(! caml_string_notequal(match,cst_NumpadMultiply))return 78;
              if(! caml_string_notequal(match,cst_NumpadSubtract))return 79;
              if(! caml_string_notequal(match,cst_OSLeft))return 117;
              if(! caml_string_notequal(match,cst_OSRight))return 118;
              if(! caml_string_notequal(match,cst_PageDown))return 99}
            else
             {if(! caml_string_notequal(match,cst_Numpad5))return 73;
              if(! caml_string_notequal(match,cst_Numpad6))return 74;
              if(! caml_string_notequal(match,cst_Numpad7))return 75;
              if(! caml_string_notequal(match,cst_Numpad8))return 76;
              if(! caml_string_notequal(match,cst_Numpad9))return 77;
              if(! caml_string_notequal(match,cst_NumpadAdd))return 80;
              if(! caml_string_notequal(match,cst_NumpadDecimal))return 81}}}
        else
         {var switch$5=caml_string_compare(match,cst_KeyX);
          if(0 <= switch$5)
           {if(! (0 < switch$5))return 24;
            var switch$6=caml_string_compare(match,cst_MetaRight);
            if(0 <= switch$6)
             {if(! (0 < switch$6))return 89;
              if(! caml_string_notequal(match,cst_Minus))return 37;
              if(! caml_string_notequal(match,cst_NumLock))return 85;
              if(! caml_string_notequal(match,cst_Numpad0))return 68;
              if(! caml_string_notequal(match,cst_Numpad1))return 69;
              if(! caml_string_notequal(match,cst_Numpad2))return 70;
              if(! caml_string_notequal(match,cst_Numpad3))return 71}
            else
             {if(! caml_string_notequal(match,cst_KeyY))return 25;
              if(! caml_string_notequal(match,cst_KeyZ))return 26;
              if(! caml_string_notequal(match,cst_MediaPlayPause))return 107;
              if(! caml_string_notequal(match,cst_MediaStop))return 108;
              if(! caml_string_notequal(match,cst_MediaTrackNext))return 106;
              if(! caml_string_notequal(match,cst_MediaTrackPrevious))
               return 105;
              if(! caml_string_notequal(match,cst_MetaLeft))return 88}}
          else
           {var switch$7=caml_string_compare(match,cst_KeyP);
            if(0 <= switch$7)
             {if(! (0 < switch$7))return 16;
              if(! caml_string_notequal(match,cst_KeyQ))return 17;
              if(! caml_string_notequal(match,cst_KeyR))return 18;
              if(! caml_string_notequal(match,cst_KeyS))return 19;
              if(! caml_string_notequal(match,cst_KeyT))return 20;
              if(! caml_string_notequal(match,cst_KeyU))return 21;
              if(! caml_string_notequal(match,cst_KeyV))return 22;
              if(! caml_string_notequal(match,cst_KeyW))return 23}
            else
             {if(! caml_string_notequal(match,cst_KeyI))return 9;
              if(! caml_string_notequal(match,cst_KeyJ))return 10;
              if(! caml_string_notequal(match,cst_KeyK))return 11;
              if(! caml_string_notequal(match,cst_KeyL))return 12;
              if(! caml_string_notequal(match,cst_KeyM))return 13;
              if(! caml_string_notequal(match,cst_KeyN))return 14;
              if(! caml_string_notequal(match,cst_KeyO))return 15}}}}
      else
       {var switch$8=caml_string_compare(match,cst_Digit6);
        if(0 <= switch$8)
         {if(! (0 < switch$8))return 33;
          var switch$9=caml_string_compare(match,cst_F6);
          if(0 <= switch$9)
           {if(! (0 < switch$9))return 61;
            var switch$10=caml_string_compare(match,cst_KeyA);
            if(0 <= switch$10)
             {if(! (0 < switch$10))return 1;
              if(! caml_string_notequal(match,cst_KeyB))return 2;
              if(! caml_string_notequal(match,cst_KeyC))return 3;
              if(! caml_string_notequal(match,cst_KeyD))return 4;
              if(! caml_string_notequal(match,cst_KeyE))return 5;
              if(! caml_string_notequal(match,cst_KeyF))return 6;
              if(! caml_string_notequal(match,cst_KeyG))return 7}
            else
             {if(! caml_string_notequal(match,cst_F7))return 62;
              if(! caml_string_notequal(match,cst_F8))return 63;
              if(! caml_string_notequal(match,cst_F9))return 64;
              if(! caml_string_notequal(match,cst_Home))return 100;
              if(! caml_string_notequal(match,cst_Insert))return 44;
              if(! caml_string_notequal(match,cst_IntlBackslash))return 121;
              if(! caml_string_notequal(match,cst_IntlYen))return 122}}
          else
           {var switch$11=caml_string_compare(match,cst_F1);
            if(0 <= switch$11)
             {if(! (0 < switch$11))return 56;
              if(! caml_string_notequal(match,cst_F10))return 65;
              if(! caml_string_notequal(match,cst_F11))return 66;
              if(! caml_string_notequal(match,cst_F12))return 67;
              if(! caml_string_notequal(match,cst_F2))return 57;
              if(! caml_string_notequal(match,cst_F3))return 58;
              if(! caml_string_notequal(match,cst_F4))return 59;
              if(! caml_string_notequal(match,cst_F5))return 60}
            else
             {if(! caml_string_notequal(match,cst_Digit7))return 34;
              if(! caml_string_notequal(match,cst_Digit8))return 35;
              if(! caml_string_notequal(match,cst_Digit9))return 36;
              if(! caml_string_notequal(match,cst_End))return 101;
              if(! caml_string_notequal(match,cst_Enter))return 40;
              if(! caml_string_notequal(match,cst_Equal))return 38;
              if(! caml_string_notequal(match,cst_Escape))return 42}}}
        else
         {var switch$12=caml_string_compare(match,cst_BrowserRefresh);
          if(0 <= switch$12)
           {if(! (0 < switch$12))return 113;
            var switch$13=caml_string_compare(match,cst_Delete);
            if(0 <= switch$13)
             {if(! (0 < switch$13))return 45;
              if(! caml_string_notequal(match,cst_Digit0))return 27;
              if(! caml_string_notequal(match,cst_Digit1))return 28;
              if(! caml_string_notequal(match,cst_Digit2))return 29;
              if(! caml_string_notequal(match,cst_Digit3))return 30;
              if(! caml_string_notequal(match,cst_Digit4))return 31;
              if(! caml_string_notequal(match,cst_Digit5))return 32}
            else
             {if(! caml_string_notequal(match,cst_BrowserSearch))return 110;
              if(! caml_string_notequal(match,cst_BrowserStop))return 114;
              if(! caml_string_notequal(match,cst_CapsLock))return 46;
              if(! caml_string_notequal(match,cst_Comma))return 53;
              if(! caml_string_notequal(match,cst_ContextMenu))return 109;
              if(! caml_string_notequal(match,cst_ControlLeft))return 86;
              if(! caml_string_notequal(match,cst_ControlRight))return 87}}
          else
           {var switch$14=caml_string_compare(match,cst_Backslash);
            if(0 <= switch$14)
             {if(! (0 < switch$14))return 52;
              if(! caml_string_notequal(match,cst_Backspace))return 43;
              if(! caml_string_notequal(match,cst_BracketLeft))return 47;
              if(! caml_string_notequal(match,cst_BracketRight))return 48;
              if(! caml_string_notequal(match,cst_BrowserBack))return 116;
              if(! caml_string_notequal(match,cst_BrowserFavorites))
               return 112;
              if(! caml_string_notequal(match,cst_BrowserForward))return 115;
              if(! caml_string_notequal(match,cst_BrowserHome))return 111}
            else
             {if(! caml_string_notequal(match,cst_AltLeft))return 92;
              if(! caml_string_notequal(match,cst_AltRight))return 93;
              if(! caml_string_notequal(match,cst_ArrowDown))return 97;
              if(! caml_string_notequal(match,cst_ArrowLeft))return 94;
              if(! caml_string_notequal(match,cst_ArrowRight))return 95;
              if(! caml_string_notequal(match,cst_ArrowUp))return 96;
              if(! caml_string_notequal(match,cst_Backquote))return 51}}}}
      return 0}
    function try_key_code_left(param)
     {if(19 <= param)
       {if(91 === param)return 88}
      else
       if(16 <= param)
        switch(param - 16 | 0)
         {case 0:return 90;case 1:return 86;default:return 92}
      return 0}
    function try_key_code_right(param)
     {if(19 <= param)
       {if(91 === param)return 89}
      else
       if(16 <= param)
        switch(param - 16 | 0)
         {case 0:return 91;case 1:return 87;default:return 93}
      return 0}
    function try_key_code_numpad(param)
     {if(47 <= param)
       {var switcher=param - 96 | 0;
        if(! (15 < switcher >>> 0))
         switch(switcher)
          {case 0:return 68;
           case 1:return 69;
           case 2:return 70;
           case 3:return 71;
           case 4:return 72;
           case 5:return 73;
           case 6:return 74;
           case 7:return 75;
           case 8:return 76;
           case 9:return 77;
           case 10:return 78;
           case 11:return 80;
           case 12:break;
           case 13:return 79;
           case 14:return 81;
           default:return 84}}
      else
       if(12 <= param)
        switch(param - 12 | 0)
         {case 0:return 73;
          case 1:return 83;
          case 21:return 77;
          case 22:return 71;
          case 23:return 69;
          case 24:return 75;
          case 25:return 72;
          case 26:return 76;
          case 27:return 74;
          case 28:return 70;
          case 33:return 68;
          case 34:return 81
          }
      return 0}
    function try_key_code_normal(param)
     {var switcher=param - 8 | 0;
      if(! (214 < switcher >>> 0))
       {var _fM_=switcher;
        if(67 <= _fM_)
         switch(_fM_)
          {case 67:return 11;
           case 68:return 12;
           case 69:return 13;
           case 70:return 14;
           case 71:return 15;
           case 72:return 16;
           case 73:return 17;
           case 74:return 18;
           case 75:return 19;
           case 76:return 20;
           case 77:return 21;
           case 78:return 22;
           case 79:return 23;
           case 80:return 24;
           case 81:return 25;
           case 82:return 26;
           case 85:return 109;
           case 104:return 56;
           case 105:return 57;
           case 106:return 58;
           case 107:return 59;
           case 108:return 60;
           case 109:return 61;
           case 110:return 62;
           case 111:return 63;
           case 112:return 64;
           case 113:return 65;
           case 114:return 66;
           case 115:return 67;
           case 137:return 119;
           case 178:return 49;
           case 179:return 38;
           case 180:return 53;
           case 181:return 37;
           case 182:return 54;
           case 183:return 55;
           case 184:return 51;
           case 211:return 47;
           case 212:return 52;
           case 213:return 48;
           case 214:return 50
           }
        else
         switch(_fM_)
          {case 0:return 43;
           case 1:return 39;
           case 5:return 40;
           case 11:return 123;
           case 12:return 46;
           case 19:return 42;
           case 24:return 41;
           case 25:return 98;
           case 26:return 99;
           case 27:return 101;
           case 28:return 100;
           case 29:return 94;
           case 30:return 96;
           case 31:return 95;
           case 32:return 97;
           case 34:return 120;
           case 37:return 44;
           case 38:return 45;
           case 40:return 27;
           case 41:return 28;
           case 42:return 29;
           case 43:return 30;
           case 44:return 31;
           case 45:return 32;
           case 46:return 33;
           case 47:return 34;
           case 48:return 35;
           case 49:return 36;
           case 57:return 1;
           case 58:return 2;
           case 59:return 3;
           case 60:return 4;
           case 61:return 5;
           case 62:return 6;
           case 63:return 7;
           case 64:return 8;
           case 65:return 9;
           case 66:return 10
           }}
      return 0}
    function make_unidentified(param){return 0}
    function run_next(value,f,v){return v?v:caml_call1(f,value)}
    function symbol$11(x,f){return caml_call1(f,x)}
    function of_event(evt)
     {var _fF_=evt.keyCode;
      function _fG_(_fL_){return run_next(_fF_,try_key_code_normal,_fL_)}
      var match=evt.location,switcher=match - 1 | 0;
      if(2 < switcher >>> 0)
       var _fH_=make_unidentified;
      else
       switch(switcher)
        {case 0:
          var
           _fC_=evt.keyCode,
           _fH_=function(_fJ_){return run_next(_fC_,try_key_code_left,_fJ_)};
          break;
         case 1:
          var
           _fD_=evt.keyCode,
           _fH_=function(_fI_){return run_next(_fD_,try_key_code_right,_fI_)};
          break;
         default:
          var
           _fE_=evt.keyCode,
           _fH_=function(_fK_){return run_next(_fE_,try_key_code_numpad,_fK_)}}
      var value=evt.code;
      return symbol$11
              (symbol$11
                (symbol$11
                  (0,
                   function(v)
                    {return v?v:caml_call3(Optdef[7],value,make_unidentified,f)}),
                 _fH_),
               _fG_)}
    function char_of_int(value)
     {if(caml_call2(symbol$5,0,value))
       try
        {var _fA_=[0,caml_call1(Stdlib_Uchar[8],value)];return _fA_}
       catch(_fB_){return 0}
      return 0}
    function empty_string(param){return ""}
    function none(param){return 0}
    function of_event$0(evt)
     {var t110=caml_call2(Optdef[8],evt.key,empty_string),match=t110.length;
      return 0 === match
              ?caml_call3(Optdef[7],evt.charCode,none,char_of_int)
              :1 === match?char_of_int(t110.charCodeAt(0) | 0):0}
    function element$1(_fz_){return _fz_}
    function tagged(e)
     {var t112=e.tagName,tag=caml_string_of_jsbytes(t112.toLowerCase());
      if(caml_call2(symbol$8,caml_ml_string_length(tag),0))return [61,e];
      var match=runtime.caml_string_unsafe_get(tag,0),switcher=match - 97 | 0;
      if(! (21 < switcher >>> 0))
       switch(switcher)
        {case 0:
          return caml_string_notequal(tag,cst_a$1)
                  ?caml_string_notequal(tag,cst_area$1)
                    ?caml_string_notequal(tag,cst_audio$1)?[61,e]:[2,e]
                    :[1,e]
                  :[0,e];
         case 1:
          return caml_string_notequal(tag,cst_base$1)
                  ?caml_string_notequal(tag,cst_blockquote$1)
                    ?caml_string_notequal(tag,cst_body$1)
                      ?caml_string_notequal(tag,cst_br$1)
                        ?caml_string_notequal(tag,cst_button$1)?[61,e]:[7,e]
                        :[6,e]
                      :[5,e]
                    :[4,e]
                  :[3,e];
         case 2:
          return caml_string_notequal(tag,cst_canvas$1)
                  ?caml_string_notequal(tag,cst_caption$1)
                    ?caml_string_notequal(tag,cst_col$1)
                      ?caml_string_notequal(tag,cst_colgroup$1)?[61,e]:[11,e]
                      :[10,e]
                    :[9,e]
                  :[8,e];
         case 3:
          return caml_string_notequal(tag,cst_del$1)
                  ?caml_string_notequal(tag,cst_div$1)
                    ?caml_string_notequal(tag,cst_dl$1)?[61,e]:[14,e]
                    :[13,e]
                  :[12,e];
         case 4:return caml_string_notequal(tag,cst_embed$1)?[61,e]:[15,e];
         case 5:
          return caml_string_notequal(tag,cst_fieldset$1)
                  ?caml_string_notequal(tag,cst_form$1)
                    ?caml_string_notequal(tag,cst_frame$1)
                      ?caml_string_notequal(tag,cst_frameset$1)?[61,e]:[18,e]
                      :[19,e]
                    :[17,e]
                  :[16,e];
         case 7:
          return caml_string_notequal(tag,cst_h1$1)
                  ?caml_string_notequal(tag,cst_h2$1)
                    ?caml_string_notequal(tag,cst_h3$1)
                      ?caml_string_notequal(tag,cst_h4$1)
                        ?caml_string_notequal(tag,cst_h5$1)
                          ?caml_string_notequal(tag,cst_h6$1)
                            ?caml_string_notequal(tag,cst_head$1)
                              ?caml_string_notequal(tag,cst_hr$1)
                                ?caml_string_notequal(tag,cst_html$1)?[61,e]:[28,e]
                                :[27,e]
                              :[26,e]
                            :[25,e]
                          :[24,e]
                        :[23,e]
                      :[22,e]
                    :[21,e]
                  :[20,e];
         case 8:
          return caml_string_notequal(tag,cst_iframe$1)
                  ?caml_string_notequal(tag,cst_img$1)
                    ?caml_string_notequal(tag,cst_input$2)
                      ?caml_string_notequal(tag,cst_ins$1)?[61,e]:[32,e]
                      :[31,e]
                    :[30,e]
                  :[29,e];
         case 11:
          return caml_string_notequal(tag,cst_label$1)
                  ?caml_string_notequal(tag,cst_legend$1)
                    ?caml_string_notequal(tag,cst_li$1)
                      ?caml_string_notequal(tag,cst_link$1)?[61,e]:[36,e]
                      :[35,e]
                    :[34,e]
                  :[33,e];
         case 12:
          return caml_string_notequal(tag,cst_map$1)
                  ?caml_string_notequal(tag,cst_meta$1)?[61,e]:[38,e]
                  :[37,e];
         case 14:
          return caml_string_notequal(tag,cst_object$1)
                  ?caml_string_notequal(tag,cst_ol$1)
                    ?caml_string_notequal(tag,cst_optgroup$1)
                      ?caml_string_notequal(tag,cst_option$1)?[61,e]:[42,e]
                      :[41,e]
                    :[40,e]
                  :[39,e];
         case 15:
          return caml_string_notequal(tag,cst_p$1)
                  ?caml_string_notequal(tag,cst_param$1)
                    ?caml_string_notequal(tag,cst_pre$1)?[61,e]:[45,e]
                    :[44,e]
                  :[43,e];
         case 16:return caml_string_notequal(tag,cst_q$1)?[61,e]:[46,e];
         case 18:
          return caml_string_notequal(tag,cst_script$1)
                  ?caml_string_notequal(tag,cst_select$2)
                    ?caml_string_notequal(tag,cst_style$1)?[61,e]:[49,e]
                    :[48,e]
                  :[47,e];
         case 19:
          return caml_string_notequal(tag,cst_table$1)
                  ?caml_string_notequal(tag,cst_tbody$1)
                    ?caml_string_notequal(tag,cst_td$1)
                      ?caml_string_notequal(tag,cst_textarea$1)
                        ?caml_string_notequal(tag,cst_tfoot$1)
                          ?caml_string_notequal(tag,cst_th$1)
                            ?caml_string_notequal(tag,cst_thead$1)
                              ?caml_string_notequal(tag,cst_title$1)
                                ?caml_string_notequal(tag,cst_tr$1)?[61,e]:[58,e]
                                :[57,e]
                              :[56,e]
                            :[55,e]
                          :[54,e]
                        :[53,e]
                      :[52,e]
                    :[51,e]
                  :[50,e];
         case 20:return caml_string_notequal(tag,cst_ul$1)?[61,e]:[59,e];
         case 21:return caml_string_notequal(tag,cst_video$1)?[61,e]:[60,e]
         }
      return [61,e]}
    function opt_tagged(e)
     {function _fx_(e){return [0,tagged(e)]}
      function _fy_(param){return 0}
      return caml_call3(Opt[7],e,_fy_,_fx_)}
    function taggedEvent(ev)
     {function _ff_(ev){return [0,ev]}
      function _fg_(param)
       {function _fi_(ev){return [1,ev]}
        function _fj_(param)
         {function _fl_(ev){return [3,ev]}
          function _fm_(param)
           {function _fo_(ev){return [4,ev]}
            function _fp_(param)
             {function _fr_(ev){return [5,ev]}
              function _fs_(param)
               {function _fu_(ev){return [2,ev]}
                function _fv_(param){return [6,ev]}
                var _fw_=messageEvent(ev);
                return caml_call3(Opt[7],_fw_,_fv_,_fu_)}
              var _ft_=popStateEvent(ev);
              return caml_call3(Opt[7],_ft_,_fs_,_fr_)}
            var _fq_=mouseScrollEvent(ev);
            return caml_call3(Opt[7],_fq_,_fp_,_fo_)}
          var _fn_=wheelEvent(ev);
          return caml_call3(Opt[7],_fn_,_fm_,_fl_)}
        var _fk_=keyboardEvent(ev);
        return caml_call3(Opt[7],_fk_,_fj_,_fi_)}
      var _fh_=mouseEvent(ev);
      return caml_call3(Opt[7],_fh_,_fg_,_ff_)}
    function opt_taggedEvent(ev)
     {function _fd_(ev){return [0,taggedEvent(ev)]}
      function _fe_(param){return 0}
      return caml_call3(Opt[7],ev,_fe_,_fd_)}
    function stopPropagation(ev)
     {function _fb_(param){return ev.stopPropagation()}
      function _fc_(param){return ev.cancelBubble = t25}
      return caml_call3(Optdef[7],ev.stopPropagation,_fc_,_fb_)}
    var
     requestAnimationFrame=
      runtime.caml_js_pure_expr
       (function(param)
         {var
           l=
            [0,
             _j_.requestAnimationFrame,
             [0,
              _j_.mozRequestAnimationFrame,
              [0,
               _j_.webkitRequestAnimationFrame,
               [0,
                _j_.oRequestAnimationFrame,
                [0,_j_.msRequestAnimationFrame,0]]]]];
          try
           {var
             _e__=function(c){return caml_call1(Optdef[5],c)},
             req=caml_call2(Stdlib_List[38],_e__,l),
             _e$_=function(callback){return req(callback)};
            return _e$_}
          catch(_fa_)
           {_fa_ = caml_wrap_exception(_fa_);
            if(_fa_ === Stdlib[8])
             {var
               now=function(param){var t123=new t122();return t123.getTime()},
               last=[0,now(0)];
              return function(callback)
               {var
                 t=now(0),
                 dt=last[1] + 16.666666666666668 - t,
                 dt$0=dt < 0.?0.:dt;
                last[1] = t;
                _j_.setTimeout(callback,dt$0);
                return 0}}
            throw _fa_}});
    function hasPushState(param)
     {var t128=_j_.history;return caml_call1(Optdef[5],t128.pushState)}
    function hasPlaceholder(param)
     {var t129=createInput(0,0,t87);
      return caml_call1(Optdef[5],t129.placeholder)}
    function hasRequired(param)
     {var t130=createInput(0,0,t87);
      return caml_call1(Optdef[5],t130.required)}
    var overflow_limit=2147483000.;
    function setTimeout(callback,d)
     {var id=[0,0];
      function loop(step,param)
       {if(2147483000. < step)
         var remain=step - 2147483000.,step$0=overflow_limit;
        else
         var remain=0.,step$0=step;
        var
         cb=remain == 0.?callback:function(_e9_){return loop(remain,_e9_)},
         t131=caml_js_wrap_callback(cb);
        id[1] = [0,_j_.setTimeout(t131,step$0)];
        return 0}
      loop(d,0);
      return id}
    function clearTimeout(id)
     {var _e8_=id[1];
      if(_e8_){var x=_e8_[1];id[1] = 0;return _j_.clearTimeout(x)}
      return 0}
    function js_array_of_collection(c){return [].slice.call(c)}
    var
     Js_of_ocaml_Dom_html=
      [0,
       d,
       t87,
       getElementById_opt,
       getElementById_exn,
       getElementById_coerce,
       getElementById,
       location_origin,
       _j_,
       no_handler,
       handler,
       full_handler,
       invoke_handler,
       eventTarget,
       eventRelatedTarget,
       Event$0,
       addEventListenerWithOptions,
       addEventListener,
       removeEventListener,
       addMousewheelEventListenerWith,
       addMousewheelEventListener,
       createCustomEvent,
       buttonPressed,
       eventAbsolutePosition$0,
       elementClientPosition,
       getDocumentScroll,
       [0,of_event,try_key_code_normal],
       [0,of_event$0],
       createHtml,
       createHead,
       createLink,
       createTitle,
       createMeta,
       createBase,
       createStyle,
       createBody,
       createForm,
       createOptgroup,
       createOption,
       createSelect,
       createInput,
       createTextarea,
       createButton,
       createLabel,
       createFieldset,
       createLegend,
       createUl,
       createOl,
       createDl,
       createLi,
       createDiv,
       createEmbed,
       createP,
       createH1,
       createH2,
       createH3,
       createH4,
       createH5,
       createH6,
       createQ,
       createBlockquote,
       createPre,
       createBr,
       createHr,
       createIns,
       createDel,
       createA,
       createImg,
       createObject,
       createParam,
       createMap,
       createArea,
       createScript,
       createTable,
       createCaption,
       createCol,
       createColgroup,
       createThead,
       createTfoot,
       createTbody,
       createTr,
       createTh,
       createTd,
       createSub,
       createSup,
       createSpan,
       createTt,
       createI,
       createB,
       createBig,
       createSmall,
       createEm,
       createStrong,
       createCite,
       createDfn,
       createCode,
       createSamp,
       createKbd,
       createVar,
       createAbbr,
       createDd,
       createDt,
       createNoscript,
       createAddress,
       createFrameset,
       createFrame,
       createIframe,
       createAudio,
       createVideo,
       Canvas_not_available,
       createCanvas,
       element$1,
       tagged,
       opt_tagged,
       taggedEvent,
       opt_taggedEvent,
       stopPropagation,
       [0,
        element$0,
        a,
        area,
        audio,
        base,
        blockquote,
        body,
        br,
        button,
        canvas,
        caption,
        col,
        colgroup,
        del,
        div,
        embed,
        dl,
        fieldset,
        form,
        frameset,
        frame,
        h1,
        h2,
        h3,
        h4,
        h5,
        h6,
        head,
        hr,
        html,
        iframe,
        img,
        input$0,
        ins,
        label,
        legend,
        li,
        link,
        map$2,
        meta,
        object,
        ol,
        optgroup,
        option$1,
        p,
        param,
        pre,
        q,
        script,
        select$0,
        style,
        table,
        tbody,
        td,
        textarea,
        tfoot,
        th,
        thead,
        title,
        tr,
        ul,
        video,
        mouseEvent,
        keyboardEvent,
        wheelEvent,
        mouseScrollEvent,
        popStateEvent,
        messageEvent],
       setTimeout,
       clearTimeout,
       js_array_of_collection,
       requestAnimationFrame,
       runtime.caml_js_html_entities,
       onIE,
       hasPushState,
       hasPlaceholder,
       hasRequired];
    caml_register_global(1651,Js_of_ocaml_Dom_html,"Js_of_ocaml__Dom_html");
    var formData=Unsafe[1].FormData,formData_form=Unsafe[1].FormData;
    function filter_map$0(f,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var q=param$0[2],v=param$0[1],match=caml_call1(f,v);
          if(match){var v$0=match[1];return [0,v$0,filter_map$0(f,q)]}
          var param$0=q;
          continue}
        return 0}}
    function have_content(elt)
     {var
       t3=elt.name,
       _e6_=caml_call2(symbol$9,t3.length,0),
       _e7_=_e6_?1 - (elt.disabled | 0):_e6_;
      return _e7_}
    function form_elements(get,form)
     {var t34=form.elements,i$2=t34.length - 1 | 0,acc=0,i=i$2;
      for(;;)
       {if(caml_call2(symbol$5,i,0))
         {var
           _eX_=
            function(v$2)
             {var match$3=tagged(v$2);
              switch(match$3[0])
               {case 31:
                 var v=match$3[1];
                 if(get)var sth=get[1],get$0=sth;else var get$0=0;
                 if(have_content(v))
                  {var
                    name$1=caml_string_of_jsstring(v.name),
                    value=v.value,
                    t20=v.type,
                    match=caml_string_of_jsbytes(t20.toLowerCase());
                   if(caml_string_notequal(match,cst_checkbox))
                    {if(! caml_string_notequal(match,cst_file))
                      {if(get$0)return [0,[0,name$1,[0,-976970511,value]],0];
                       var match$0=caml_call1(Optdef[10],v.files);
                       if(match$0)
                        {var list=match$0[1];
                         if(caml_call2(symbol$8,list.length,0))
                          return [0,[0,name$1,[0,-976970511,""]],0];
                         var match$1=caml_call1(Optdef[10],v.multiple);
                         if(match$1 && match$1[1])
                          {var
                            _e1_=function(t28){return list.item(t28)},
                            _e2_=caml_call2(Stdlib_Array[2],list.length,_e1_),
                            _e3_=caml_call1(Stdlib_Array[11],_e2_);
                           return filter_map$0
                                   (function(f)
                                     {var match=caml_call1(Opt[10],f);
                                      if(match)
                                       {var file=match[1];return [0,[0,name$1,[0,781515420,file]]]}
                                      return 0},
                                    _e3_)}
                         var _e4_=list.item(0),match$2=caml_call1(Opt[10],_e4_);
                         if(match$2)
                          {var file=match$2[1];
                           return [0,[0,name$1,[0,781515420,file]],0]}
                         return 0}
                       return 0}
                     var switch$0=0;
                     if(caml_string_notequal(match,cst_password))
                      {if(caml_string_notequal(match,cst_radio))
                        {var switch$1=0;
                         if
                          (caml_string_notequal(match,cst_reset)
                           &&
                           caml_string_notequal(match,cst_submit$0))
                          {if(caml_string_notequal(match,cst_text))
                            return [0,[0,name$1,[0,-976970511,value]],0];
                           switch$0 = 1;
                           switch$1 = 1}
                         if(! switch$1)return 0}}
                     else
                      switch$0 = 1;
                     if(switch$0)return [0,[0,name$1,[0,-976970511,value]],0]}
                   return v.checked | 0?[0,[0,name$1,[0,-976970511,value]],0]:0}
                 return 0;
                case 48:
                 var v$0=match$3[1];
                 if(have_content(v$0))
                  {var name$0=caml_string_of_jsstring(v$0.name);
                   if(v$0.multiple | 0)
                    {var
                      _eZ_=
                       function(i)
                        {var t13=v$0.options,_e5_=t13.item(i);
                         return caml_call1(Opt[10],_e5_)},
                      t10=v$0.options,
                      options=caml_call2(Stdlib_Array[2],t10.length,_eZ_),
                      _e0_=caml_call1(Stdlib_Array[11],options);
                     return filter_map$0
                             (function(param)
                               {if(param)
                                 {var e=param[1];
                                  return e.selected | 0
                                          ?[0,[0,name$0,[0,-976970511,e.value]]]
                                          :0}
                                return 0},
                              _e0_)}
                   return [0,[0,name$0,[0,-976970511,v$0.value]],0]}
                 return 0;
                case 53:
                 var v$1=match$3[1];
                 if(have_content(v$1))
                  {var name=caml_string_of_jsstring(v$1.name);
                   return [0,[0,name,[0,-976970511,v$1.value]],0]}
                 return 0;
                default:return 0}},
           _eY_=caml_call2(Stdlib_List[19],_eX_,acc);
          return caml_call1(Stdlib_List[14],_eY_)}
        var t32=form.elements,_eW_=t32.item(i),match=caml_call1(Opt[10],_eW_);
        if(match)
         {var x=match[1],i$0=i - 1 | 0,acc$0=[0,x,acc],acc=acc$0,i=i$0;
          continue}
        var i$1=i - i | 0,i=i$1;
        continue}}
    function append(form_contents,form_elt)
     {if(891486873 <= form_contents[1])
       {var list=form_contents[2];list[1] = [0,form_elt,list[1]];return 0}
      var f=form_contents[2],_eU_=form_elt[2],_eV_=form_elt[1];
      if(781515420 <= _eU_[1])
       {var file=_eU_[2],t38=caml_jsstring_of_string(_eV_);
        return f.append(t38,file)}
      var s=_eU_[2],t35=caml_jsstring_of_string(_eV_);
      return f.append(t35,s)}
    function empty_form_contents(param)
     {var match=caml_call1(Optdef[10],formData);
      if(match){var constr=match[1];return [0,808620462,new constr()]}
      return [0,891486873,[0,0]]}
    function post_form_contents(form)
     {var contents=empty_form_contents(0),_eR_=form_elements(0,form);
      function _eS_(_eT_){return append(contents,_eT_)}
      caml_call2(Stdlib_List[17],_eS_,_eR_);
      return contents}
    function get_form_contents(form)
     {var _eO_=form_elements(_n_,form);
      function _eP_(param)
       {var _eQ_=param[2];
        if(typeof _eQ_ !== "number" && -976970511 === _eQ_[1])
         {var s=_eQ_[2],name=param[1];
          return [0,name,caml_string_of_jsstring(s)]}
        throw [0,Assert_failure,_o_]}
      return caml_call2(Stdlib_List[19],_eP_,_eO_)}
    var
     Js_of_ocaml_Form=
      [0,
       formData,
       formData_form,
       append,
       post_form_contents,
       get_form_contents,
       empty_form_contents,
       form_elements];
    caml_register_global(1652,Js_of_ocaml_Form,"Js_of_ocaml__Form");
    var
     readystatechange=caml_call1(Event[1],cst_readystatechange),
     loadstart$1=caml_call1(Event[1],cst_loadstart$1),
     progress$1=caml_call1(Event[1],cst_progress$1),
     abort$1=caml_call1(Event[1],cst_abort$1),
     error$1=caml_call1(Event[1],cst_error$1),
     load$1=caml_call1(Event[1],cst_load$1),
     timeout=caml_call1(Event[1],cst_timeout),
     loadend$0=caml_call1(Event[1],cst_loadend$0),
     Event$1=
      [0,
       readystatechange,
       loadstart$1,
       progress$1,
       abort$1,
       error$1,
       load$1,
       timeout,
       loadend$0],
     Js_of_ocaml_XmlHttpRequest=[0,runtime.caml_xmlhttprequest_create,Event$1];
    caml_register_global
     (1653,Js_of_ocaml_XmlHttpRequest,"Js_of_ocaml__XmlHttpRequest");
    var t2=Unsafe[1].Worker;
    function create(script)
     {var t1=caml_jsstring_of_string(script);return new t2(t1)}
    function import_scripts(scripts)
     {if(Unsafe[1].importScripts === t39)
       caml_call1(Stdlib[1],cst_Worker_import_scripts_is_u);
      var _eL_=caml_call1(Stdlib_Array[12],scripts);
      function _eM_(s){return caml_jsstring_of_string(s)}
      var _eN_=caml_call2(Stdlib_Array[15],_eM_,_eL_);
      return runtime.caml_js_fun_call(Unsafe[1].importScripts,_eN_)}
    function set_onmessage(handler)
     {if(Unsafe[1].onmessage === t39)
       caml_call1(Stdlib[1],cst_Worker_onmessage_is_undefi);
      function js_handler(ev){return caml_call1(handler,ev.data)}
      var t7=caml_js_wrap_callback(js_handler);
      return Unsafe[1].onmessage = t7}
    function post_message(t10)
     {if(Unsafe[1].postMessage === t39)
       caml_call1(Stdlib[1],cst_Worker_onmessage_is_undefi$0);
      return Unsafe[1].postMessage(t10)}
    var
     Js_of_ocaml_Worker=
      [0,create,import_scripts,set_onmessage,post_message];
    caml_register_global(1654,Js_of_ocaml_Worker,"Js_of_ocaml__Worker");
    var webSocket=Unsafe[1].WebSocket;
    function is_supported(param){return caml_call1(Optdef[5],webSocket)}
    var Js_of_ocaml_WebSockets=[0,webSocket,webSocket,webSocket,is_supported];
    caml_register_global
     (1655,Js_of_ocaml_WebSockets,"Js_of_ocaml__WebSockets");
    var
     defaultContextAttributes=
      {"alpha":t25,
       "depth":t25,
       "stencil":t4,
       "antialias":t25,
       "premultipliedAlpha":t4,
       "preserveDrawingBuffer":t4,
       "preferLowPowerToHighPerformance":t4,
       "failIfMajorPerformanceCaveat":t4},
     webglcontextlost=caml_call1(Event$0[87],cst_webglcontextlost),
     webglcontextrestored=caml_call1(Event$0[87],cst_webglcontextrestored),
     webglcontextcreationerror=
      caml_call1(Event$0[87],cst_webglcontextcreationerror),
     Event$2=
      [0,webglcontextlost,webglcontextrestored,webglcontextcreationerror];
    function getContext(t3)
     {var ctx=t3.getContext("webgl");
      return caml_call1(Opt[5],ctx)?ctx:t3.getContext("experimental-webgl")}
    function getContextWithAttributes(t9,t8)
     {var ctx=t9.getContext("webgl",t8);
      return caml_call1(Opt[5],ctx)?ctx:t9.getContext("experimental-webgl",t8)}
    var
     Js_of_ocaml_WebGL=
      [0,defaultContextAttributes,Event$2,getContext,getContextWithAttributes];
    caml_register_global(1656,Js_of_ocaml_WebGL,"Js_of_ocaml__WebGL");
    function regexp(s)
     {var t0=caml_jsbytes_of_string(s);return new t11(t0,"g")}
    function regexp_case_fold(s)
     {var t3=caml_jsbytes_of_string(s);return new t11(t3,"gi")}
    function regexp_with_flag(s,f)
     {var
       t7=caml_jsstring_of_string(caml_call2(Stdlib[28],cst_g,f)),
       t6=caml_jsbytes_of_string(s);
      return new t11(t6,t7)}
    function blunt_str_array_get(a,i)
     {function _eK_(param){throw [0,Assert_failure,_p_]}
      return caml_string_of_jsbytes(caml_call2(Optdef[8],a[i],_eK_))}
    function string_match(r,s,i)
     {r.lastIndex = i;
      var
       t11=caml_jsbytes_of_string(s),
       _eI_=r.exec(t11),
       _eJ_=caml_call2(Opt[3],_eI_,match_result);
      return caml_call1(Opt[10],_eJ_)}
    function search_forward(r,s,i)
     {r.lastIndex = i;
      var t15=caml_jsbytes_of_string(s);
      function _eF_(t17){return [0,t17.index,t17]}
      var _eG_=r.exec(t15),_eH_=caml_call2(Opt[3],_eG_,_eF_);
      return caml_call1(Opt[10],_eH_)}
    function matched_string(r){return blunt_str_array_get(r,0)}
    function matched_group(r,i)
     {var _eE_=caml_call2(Optdef[3],r[i],caml_string_of_jsbytes);
      return caml_call1(Optdef[10],_eE_)}
    var t21=new t11("[$]","g");
    function quote_repl(s)
     {var t23=caml_jsbytes_of_string(s);return t23.replace(t21,"$$$$")}
    function global_replace(r,s,s_by)
     {r.lastIndex = 0;
      var t27=quote_repl(s_by),t28=caml_jsbytes_of_string(s);
      return caml_string_of_jsbytes(t28.replace(r,t27))}
    function replace_first(r,s,s_by)
     {var
       match=r.ignoreCase | 0,
       match$0=r.multiline | 0,
       flags=match?match$0?"mi":"i":match$0?"m":"",
       t32=r.source,
       t35=new t11(t32,flags),
       t36=quote_repl(s_by),
       t37=caml_jsbytes_of_string(s);
      return caml_string_of_jsbytes(t37.replace(t35,t36))}
    function list_of_js_array(a)
     {var idx$1=a.length - 1 | 0,accu=0,idx=idx$1;
      for(;;)
       {if(caml_call2(symbol$5,idx,0))return accu;
        var
         idx$0=idx - 1 | 0,
         accu$0=[0,blunt_str_array_get(a,idx),accu],
         accu=accu$0,
         idx=idx$0;
        continue}}
    function split(r,s)
     {r.lastIndex = 0;
      var t42=caml_jsbytes_of_string(s);
      return list_of_js_array(t42.split(r))}
    function bounded_split(r,s,i)
     {r.lastIndex = 0;
      var t47=caml_jsbytes_of_string(s);
      return list_of_js_array(t47.split(r,i))}
    var t48=regexp(cst);
    function quote(s)
     {var t50=caml_jsbytes_of_string(s);
      return caml_string_of_jsbytes(t50.replace(t48,"\\$&"))}
    function regexp_string(s){return regexp(quote(s))}
    function regexp_string_case_fold(s){return regexp_case_fold(quote(s))}
    var
     Js_of_ocaml_Regexp=
      [0,
       regexp,
       regexp_case_fold,
       regexp_with_flag,
       quote,
       regexp_string,
       regexp_string_case_fold,
       string_match,
       search_forward,
       search_forward,
       matched_string,
       matched_group,
       global_replace,
       replace_first,
       split,
       bounded_split];
    caml_register_global(1657,Js_of_ocaml_Regexp,"Js_of_ocaml__Regexp");
    var Local_exn=[248,cst_Js_of_ocaml_Url_Local_exn,caml_fresh_oo_id(0)];
    function interrupt(param){throw Local_exn}
    var plus_re=regexp_string(cst$0),t14=new t11("\\+","g");
    function urldecode_js_string_string(s)
     {t14.lastIndex = 0;
      return caml_string_of_jsbytes(unescape(s.replace(t14," ")))}
    function urldecode(s)
     {return caml_string_of_jsbytes
              (unescape
                (caml_jsbytes_of_string(global_replace(plus_re,s,cst$1))))}
    function urlencode(opt,s)
     {if(opt)var sth=opt[1],with_plus=sth;else var with_plus=1;
      if(with_plus)
       {var s$0=caml_string_of_jsbytes(escape(caml_jsbytes_of_string(s)));
        return global_replace(plus_re,s$0,cst_2B)}
      return caml_string_of_jsbytes(escape(caml_jsbytes_of_string(s)))}
    var
     Not_an_http_protocol=
      [248,cst_Js_of_ocaml_Url_Not_an_htt,caml_fresh_oo_id(0)],
     default_http_port=80,
     default_https_port=443;
    function path_of_path_string(s)
     {var l=caml_ml_string_length(s);
      function aux(i)
       {try
         {var _eC_=caml_call3(String[30],s,i,47),j=_eC_}
        catch(_eD_)
         {_eD_ = caml_wrap_exception(_eD_);
          if(_eD_ !== Stdlib[8])throw _eD_;
          var j=l}
        var word=caml_call3(String[14],s,i,j - i | 0);
        return caml_call2(symbol$10,j,l)?[0,word,0]:[0,word,aux(j + 1 | 0)]}
      var a=aux(0);
      if(a && ! caml_string_notequal(a[1],cst$2))
       {var _eB_=a[2];
        if(! _eB_)return 0;
        if(! caml_string_notequal(_eB_[1],cst$3) && ! _eB_[2])return _q_}
      return a}
    function encode_arguments(l)
     {function _ew_(param)
       {var
         v=param[2],
         n=param[1],
         _ey_=urlencode(0,v),
         _ez_=caml_call2(Stdlib[28],cst$4,_ey_),
         _eA_=urlencode(0,n);
        return caml_call2(Stdlib[28],_eA_,_ez_)}
      var _ex_=caml_call2(Stdlib_List[19],_ew_,l);
      return caml_call2(String[6],cst$5,_ex_)}
    function decode_arguments_js_string(s)
     {var
       t0=caml_jsstring_of_string(caml_call2(String[1],1,38)),
       t18=s.split(t0),
       len=t18.length;
      function aux(acc,idx)
       {var idx$0=idx;
        for(;;)
         {if(caml_call2(symbol$5,idx$0,0))return acc;
          try
           {var
             _eo_=idx$0 - 1 | 0,
             _ep_=
              function(s)
               {function _eu_(param)
                 {var
                   y=param[2],
                   x=param[1],
                   _ev_=urldecode_js_string_string(y);
                  return [0,urldecode_js_string_string(x),_ev_]}
                var
                 t2=caml_jsstring_of_string(caml_call2(String[1],1,61)),
                 t5=s.indexOf(t2);
                if(caml_call2(symbol$5,t5,0))
                 var _et_=t39;
                else
                 var
                  t7=t5 + 1 | 0,
                  _es_=s.slice(t7),
                  _et_=[0,s.slice(0,t5),_es_];
                return caml_call3(Optdef[7],_et_,interrupt,_eu_)},
             _eq_=
              aux
               ([0,caml_call3(Optdef[7],t18[idx$0],interrupt,_ep_),acc],_eo_);
            return _eq_}
          catch(_er_)
           {_er_ = caml_wrap_exception(_er_);
            if(_er_ === Local_exn)
             {var idx$1=idx$0 - 1 | 0,idx$0=idx$1;continue}
            throw _er_}}}
      return aux(0,len - 1 | 0)}
    function decode_arguments(s)
     {return decode_arguments_js_string(caml_jsbytes_of_string(s))}
    var
     t19=caml_jsbytes_of_string(cst_Hh_Tt_Tt_Pp_Ss_0_9a_zA_Z_0),
     t24=new t11(t19),
     t21$0=caml_jsbytes_of_string(cst_Ff_Ii_Ll_Ee),
     t26=new t11(t21$0);
    function url_of_js_string(s)
     {function _d7_(res)
       {var
         prot_string=caml_call2(Optdef[8],res[1],interrupt),
         match=caml_string_of_jsbytes(prot_string.toLowerCase());
        if
         (caml_string_notequal(match,cst_file$0)
          &&
          caml_string_notequal(match,cst_file$1))
         {var switch$0=0;
          if
           (caml_string_notequal(match,cst_http)
            &&
            caml_string_notequal(match,cst_http$0))
           {var switch$1=0;
            if
             (caml_string_notequal(match,cst_https)
              &&
              caml_string_notequal(match,cst_https$0))
             switch$1 = 1;
            if(! switch$1){var ssl=1;switch$0 = 2}}
          else
           switch$0 = 1;
          var switch$2=0;
          switch(switch$0)
           {case 1:var ssl=0;switch$2 = 1;break;
            case 0:break;
            default:switch$2 = 1}
          if(switch$2)
           {var
             _ef_=function(param){return caml_jsbytes_of_string(cst$7)},
             path_str=
              urldecode_js_string_string(caml_call2(Optdef[8],res[6],_ef_)),
             _eg_=function(param){return caml_jsbytes_of_string(cst$8)},
             _eh_=
              urldecode_js_string_string(caml_call2(Optdef[8],res[10],_eg_)),
             _ei_=function(param){return caml_jsbytes_of_string(cst$9)},
             _ej_=
              decode_arguments_js_string(caml_call2(Optdef[8],res[8],_ei_)),
             _ek_=path_of_path_string(path_str),
             _el_=function(param){return caml_jsbytes_of_string(cst$10)},
             s=caml_string_of_jsbytes(caml_call2(Optdef[8],res[4],_el_)),
             _em_=
              caml_string_notequal(s,cst$6)?caml_int_of_string(s):ssl?443:80,
             url=
              [0,
               urldecode_js_string_string
                (caml_call2(Optdef[8],res[2],interrupt)),
               _em_,
               _ek_,
               path_str,
               _ej_,
               _eh_],
             _en_=ssl?[1,url]:[0,url];
            return [0,_en_]}}
        throw Not_an_http_protocol}
      function _d8_(param)
       {function _d__(res)
         {var
           path_str=
            urldecode_js_string_string(caml_call2(Optdef[8],res[2],interrupt));
          function _eb_(param){return caml_jsbytes_of_string(cst$11)}
          var _ec_=caml_string_of_jsbytes(caml_call2(Optdef[8],res[6],_eb_));
          function _ed_(param){return caml_jsbytes_of_string(cst$12)}
          var
           _ee_=
            decode_arguments_js_string(caml_call2(Optdef[8],res[4],_ed_));
          return [0,[2,[0,path_of_path_string(path_str),path_str,_ee_,_ec_]]]}
        function _d$_(param){return 0}
        var _ea_=t26.exec(s);
        return caml_call3(Opt[7],_ea_,_d$_,_d__)}
      var _d9_=t24.exec(s);
      return caml_call3(Opt[7],_d9_,_d8_,_d7_)}
    function url_of_string(s)
     {return url_of_js_string(caml_jsbytes_of_string(s))}
    function string_of_url(param)
     {switch(param[0])
       {case 0:
         var
          match=param[1],
          frag=match[6],
          args=match[5],
          path=match[3],
          port=match[2],
          host=match[1];
         if(caml_string_notequal(frag,cst$13))
          var _du_=urlencode(0,frag),_dv_=caml_call2(Stdlib[28],cst$14,_du_);
         else
          var _dv_=cst$21;
         if(args)
          var
           _dw_=encode_arguments(args),
           _dx_=caml_call2(Stdlib[28],cst$15,_dw_);
         else
          var _dx_=cst$20;
         var
          _dy_=caml_call2(Stdlib[28],_dx_,_dv_),
          _dz_=function(x){return urlencode(0,x)},
          _dA_=caml_call2(Stdlib_List[19],_dz_,path),
          _dB_=caml_call2(String[6],cst$16,_dA_),
          _dC_=caml_call2(Stdlib[28],_dB_,_dy_),
          _dD_=caml_call2(Stdlib[28],cst$17,_dC_);
         if(80 === port)
          var _dE_=cst$18;
         else
          var
           _dI_=caml_call1(Stdlib[33],port),
           _dE_=caml_call2(Stdlib[28],cst$19,_dI_);
         var
          _dF_=caml_call2(Stdlib[28],_dE_,_dD_),
          _dG_=urlencode(0,host),
          _dH_=caml_call2(Stdlib[28],_dG_,_dF_);
         return caml_call2(Stdlib[28],cst_http$1,_dH_);
        case 1:
         var
          match$0=param[1],
          frag$0=match$0[6],
          args$0=match$0[5],
          path$0=match$0[3],
          port$0=match$0[2],
          host$0=match$0[1];
         if(caml_string_notequal(frag$0,cst$22))
          var
           _dJ_=urlencode(0,frag$0),
           _dK_=caml_call2(Stdlib[28],cst$23,_dJ_);
         else
          var _dK_=cst$30;
         if(args$0)
          var
           _dL_=encode_arguments(args$0),
           _dM_=caml_call2(Stdlib[28],cst$24,_dL_);
         else
          var _dM_=cst$29;
         var
          _dN_=caml_call2(Stdlib[28],_dM_,_dK_),
          _dO_=function(x){return urlencode(0,x)},
          _dP_=caml_call2(Stdlib_List[19],_dO_,path$0),
          _dQ_=caml_call2(String[6],cst$25,_dP_),
          _dR_=caml_call2(Stdlib[28],_dQ_,_dN_),
          _dS_=caml_call2(Stdlib[28],cst$26,_dR_);
         if(443 === port$0)
          var _dT_=cst$27;
         else
          var
           _dX_=caml_call1(Stdlib[33],port$0),
           _dT_=caml_call2(Stdlib[28],cst$28,_dX_);
         var
          _dU_=caml_call2(Stdlib[28],_dT_,_dS_),
          _dV_=urlencode(0,host$0),
          _dW_=caml_call2(Stdlib[28],_dV_,_dU_);
         return caml_call2(Stdlib[28],cst_https$1,_dW_);
        default:
         var
          match$1=param[1],
          frag$1=match$1[4],
          args$1=match$1[3],
          path$1=match$1[1];
         if(caml_string_notequal(frag$1,cst$31))
          var
           _dY_=urlencode(0,frag$1),
           _dZ_=caml_call2(Stdlib[28],cst$32,_dY_);
         else
          var _dZ_=cst$36;
         if(args$1)
          var
           _d0_=encode_arguments(args$1),
           _d1_=caml_call2(Stdlib[28],cst$33,_d0_);
         else
          var _d1_=cst$35;
         var
          _d2_=caml_call2(Stdlib[28],_d1_,_dZ_),
          _d3_=function(x){return urlencode(0,x)},
          _d4_=caml_call2(Stdlib_List[19],_d3_,path$1),
          _d5_=caml_call2(String[6],cst$34,_d4_),
          _d6_=caml_call2(Stdlib[28],_d5_,_d2_);
         return caml_call2(Stdlib[28],cst_file$2,_d6_)}}
    var _r_=caml_call1(Optdef[2],_j_.location);
    if(caml_call1(Optdef[5],_r_))
     var _s_=_j_.location;
    else
     var
      t42=function(param,_dt_){return 0},
      t41$0=function(param,_ds_){return 0},
      t40=function(param){return 0},
      _s_=
       {"href":"",
        "protocol":"",
        "host":"",
        "hostname":"",
        "port":"",
        "pathname":"",
        "search":"",
        "hash":"",
        "origin":t39,
        "reload":caml_js_wrap_meth_callback(t40),
        "replace":caml_js_wrap_meth_callback(t41$0),
        "assign":caml_js_wrap_meth_callback(t42)};
    var
     host=urldecode_js_string_string(_s_.hostname),
     protocol=urldecode_js_string_string(_s_.protocol),
     _t_=0,
     port=
      function(param)
        {try
          {var _dq_=[0,caml_int_of_string(caml_string_of_jsbytes(_s_.port))];
           return _dq_}
         catch(_dr_)
          {_dr_ = caml_wrap_exception(_dr_);
           if(_dr_[1] === Stdlib[7])return 0;
           throw _dr_}}
       (_t_),
     path_string=urldecode_js_string_string(_s_.pathname),
     path=path_of_path_string(path_string),
     t49=_s_.search;
    if(t49.charAt(0) === "?")
     var t52=_s_.search,_u_=t52.slice(1);
    else
     var _u_=_s_.search;
    var arguments$0=decode_arguments_js_string(_u_);
    function get_fragment(param)
     {function _dn_(res){return caml_string_of_jsstring(res[1])}
      function _do_(param){return cst$37}
      var t57=new t11("#(.*)"),t58=_s_.href,_dp_=t58.match(t57);
      return caml_call3(Opt[7],_dp_,_do_,_dn_)}
    function set_fragment(s)
     {var t59=caml_jsbytes_of_string(urlencode(0,s));return _s_.hash = t59}
    function get$2(param){return url_of_js_string(_s_.href)}
    function set$0(u)
     {var t62=caml_jsbytes_of_string(string_of_url(u));return _s_.href = t62}
    var
     as_string=urldecode_js_string_string(_s_.href),
     Js_of_ocaml_Url=
      [0,
       urldecode,
       urlencode,
       default_http_port,
       default_https_port,
       path_of_path_string,
       encode_arguments,
       decode_arguments,
       url_of_string,
       string_of_url,
       [0,
        host,
        port,
        protocol,
        path_string,
        path,
        arguments$0,
        get_fragment,
        set_fragment,
        get$2,
        set$0,
        as_string]];
    caml_register_global(1659,Js_of_ocaml_Url,"Js_of_ocaml__Url");
    var Js_of_ocaml_Lib_version=[0,s,git_version];
    caml_register_global
     (1660,Js_of_ocaml_Lib_version,"Js_of_ocaml__Lib_version");
    function update_file(name,content)
     {var oc=caml_call1(Stdlib[60],name);
      caml_call2(Stdlib[66],oc,content);
      return caml_call1(Stdlib[76],oc)}
    function set_channel_flusher(out_channel,f)
     {var
       f$0=
        caml_js_wrap_callback
         (function(s){return caml_call1(f,caml_string_of_jsbytes(s))});
      return runtime.caml_ml_set_channel_output(out_channel,f$0)}
    function set_channel_filler(in_channel,f)
     {var f$0=caml_js_wrap_callback(f);
      return runtime.caml_ml_set_channel_refill(in_channel,f$0)}
    function mount(path,f)
     {return runtime.caml_mount_autoload
              (path,
               caml_js_wrap_callback
                (function(prefix,path){return caml_call2(f,prefix,path)}))}
    function unmount(path){return runtime.caml_unmount(path)}
    if(caml_call2(String[68],git_version,cst$38))
     var js_of_ocaml_version=s;
    else
     var
      _co_=caml_call2(Stdlib[28],cst$41,git_version),
      js_of_ocaml_version=caml_call2(Stdlib[28],s,_co_);
    var
     _v_=runtime.caml_create_file,
     _w_=runtime.caml_read_file_content,
     Js_of_ocaml_Sys_js=
      [0,
       set_channel_flusher,
       set_channel_filler,
       function(_dm_){return runtime.caml_list_mount_point(_dm_)},
       unmount,
       mount,
       _w_,
       _v_,
       update_file,
       js_of_ocaml_version];
    caml_register_global(1661,Js_of_ocaml_Sys_js,"Js_of_ocaml__Sys_js");
    function empty_resize_observer_options(param){return {}}
    var t2$0=Unsafe[1].ResizeObserver;
    function is_supported$0(param){return caml_call1(Optdef[5],t2$0)}
    function observe(node,f,box,param)
     {var t1=caml_js_wrap_callback(f),t4=new t2$0(t1);
      if(box)
       {var box$0=box[1],t8={};t8.box = box$0;t4.observe(node,t8)}
      else
       t4.observe(node);
      return t4}
    var
     Js_of_ocaml_ResizeObserver=
      [0,empty_resize_observer_options,t2$0,is_supported$0,observe];
    caml_register_global
     (1662,Js_of_ocaml_ResizeObserver,"Js_of_ocaml__ResizeObserver");
    var t4$1=Unsafe[1].PerformanceObserver;
    function is_supported$1(param){return caml_call1(Optdef[5],t4$1)}
    function observe$0(entry_types,f)
     {var
       _dl_=
        caml_call1
         (caml_call1(Stdlib_List[19],caml_jsstring_of_string),entry_types),
       t1=caml_js_from_array(caml_call1(Stdlib_Array[12],_dl_)),
       t5={};
      t5.entryTypes = t1;
      var t3=caml_js_wrap_callback(f),t6=new t4$1(t3);
      t6.observe(t5);
      return t6}
    var Js_of_ocaml_PerformanceObserve=[0,t4$1,is_supported$1,observe$0];
    caml_register_global
     (1663,Js_of_ocaml_PerformanceObserve,"Js_of_ocaml__PerformanceObserver");
    function empty_mutation_observer_init(param){return {}}
    var t2$1=Unsafe[1].MutationObserver;
    function is_supported$2(param){return caml_call1(Optdef[5],t2$1)}
    function observe$1
     (node,
      f,
      child_list,
      attributes,
      character_data,
      subtree,
      attribute_old_value,
      character_data_old_value,
      attribute_filter,
      param)
     {function opt_iter(x,f)
       {if(x){var x$0=x[1];return caml_call1(f,x$0)}return 0}
      var t1=caml_js_wrap_callback(f),t19=new t2$1(t1),t18={};
      opt_iter(child_list,function(t3){return t18.childList = t3});
      opt_iter(attributes,function(t5){return t18.attributes = t5});
      opt_iter(character_data,function(t7){return t18.characterData = t7});
      opt_iter(subtree,function(t9){return t18.subtree = t9});
      opt_iter
       (attribute_old_value,function(t11){return t18.attributeOldValue = t11});
      opt_iter
       (character_data_old_value,
        function(t13){return t18.characterDataOldValue = t13});
      opt_iter
       (attribute_filter,
        function(l)
         {var t15=caml_js_from_array(caml_call1(Stdlib_Array[12],l));
          return t18.attributeFilter = t15});
      t19.observe(node,t18);
      return t19}
    var
     Js_of_ocaml_MutationObserver=
      [0,empty_mutation_observer_init,t2$1,is_supported$2,observe$1];
    caml_register_global
     (1664,Js_of_ocaml_MutationObserver,"Js_of_ocaml__MutationObserver");
    var t1=Unsafe[1].Object;
    function create$0(param){return new t1()}
    function add$0(t,k,v){return t[k.concat("_")] = v}
    function remove(t,k){return delete t[k.concat("_")]}
    function find(t,k){return t[k.concat("_")]}
    function keys(t)
     {var
       t10=Unsafe[1].Object,
       t11=t10.keys(t),
       res=[0,0],
       _dh_=t11.length - 1 | 0,
       _dg_=0;
      if(! (_dh_ < 0))
       {var i=_dg_;
        for(;;)
         {var
           _di_=function(param){return caml_call1(Stdlib[2],cst_Jstable_keys)},
           t15=caml_call2(Optdef[8],t11[i],_di_),
           t14=t15.length - 1 | 0,
           _dj_=res[1];
          res[1] = [0,t15.substring(0,t14),_dj_];
          var _dk_=i + 1 | 0;
          if(_dh_ !== i){var i=_dk_;continue}
          break}}
      return caml_call1(Stdlib_List[9],res[1])}
    var Js_of_ocaml_Jstable=[0,create$0,add$0,remove,find,keys];
    caml_register_global(1665,Js_of_ocaml_Jstable,"Js_of_ocaml__Jstable");
    var t11$1=Unsafe[1].JSON;
    function reviver(this$0,key,value)
     {if(typeof value === "string")return caml_string_of_jsbytes(value);
      if
       (value instanceof array_length
        &&
        4
        ===
        value.length
        &&
        255
        ===
        value[0])
       return runtime.caml_int64_create_lo_mi_hi(value[1],value[2],value[3]);
      return value}
    var t3$0=caml_js_wrap_meth_callback(reviver);
    function unsafe_input(t2){return t11$1.parse(t2,t3$0)}
    var mlInt64_constr=t5.constructor;
    function t10(key,value)
     {var _df_=Stdlib_Obj[13];
      return caml_call2(symbol$8,runtime.caml_obj_tag(value),_df_)
              ?caml_jsbytes_of_string(value)
              :value instanceof mlInt64_constr
                ?caml_js_from_array([0,255,value.lo,value.mi,value.hi])
                :value}
    function output(t9){return t11$1.stringify(t9,t10)}
    var Js_of_ocaml_Json=[0,output,unsafe_input];
    caml_register_global(1667,Js_of_ocaml_Json,"Js_of_ocaml__Json");
    function string_of_name(param)
     {var _de_=param;
      if(74 <= _de_)
       {if(111 <= _de_)
         switch(_de_)
          {case 111:return cst_palevioletred;
           case 112:return cst_papayawhip;
           case 113:return cst_peachpuff;
           case 114:return cst_peru;
           case 115:return cst_pink;
           case 116:return cst_plum;
           case 117:return cst_powderblue;
           case 118:return cst_purple;
           case 119:return cst_red;
           case 120:return cst_rosybrown;
           case 121:return cst_royalblue;
           case 122:return cst_saddlebrown;
           case 123:return cst_salmon;
           case 124:return cst_sandybrown;
           case 125:return cst_seagreen;
           case 126:return cst_seashell;
           case 127:return cst_sienna;
           case 128:return cst_silver;
           case 129:return cst_skyblue;
           case 130:return cst_slateblue;
           case 131:return cst_slategray;
           case 132:return cst_slategrey;
           case 133:return cst_snow;
           case 134:return cst_springgreen;
           case 135:return cst_steelblue;
           case 136:return cst_tan;
           case 137:return cst_teal;
           case 138:return cst_thistle;
           case 139:return cst_tomato;
           case 140:return cst_turquoise;
           case 141:return cst_violet;
           case 142:return cst_wheat;
           case 143:return cst_white;
           case 144:return cst_whitesmoke;
           case 145:return cst_yellow;
           default:return cst_yellowgreen}
        switch(_de_)
         {case 74:return cst_lightpink;
          case 75:return cst_lightsalmon;
          case 76:return cst_lightseagreen;
          case 77:return cst_lightskyblue;
          case 78:return cst_lightslategray;
          case 79:return cst_lightslategrey;
          case 80:return cst_lightsteelblue;
          case 81:return cst_lightyellow;
          case 82:return cst_lime;
          case 83:return cst_limegreen;
          case 84:return cst_linen;
          case 85:return cst_magenta;
          case 86:return cst_maroon;
          case 87:return cst_mediumaquamarine;
          case 88:return cst_mediumblue;
          case 89:return cst_mediumorchid;
          case 90:return cst_mediumpurple;
          case 91:return cst_mediumseagreen;
          case 92:return cst_mediumslateblue;
          case 93:return cst_mediumspringgreen;
          case 94:return cst_mediumturquoise;
          case 95:return cst_mediumvioletred;
          case 96:return cst_midnightblue;
          case 97:return cst_mintcream;
          case 98:return cst_mistyrose;
          case 99:return cst_moccasin;
          case 100:return cst_navajowhite;
          case 101:return cst_navy;
          case 102:return cst_oldlace;
          case 103:return cst_olive;
          case 104:return cst_olivedrab;
          case 105:return cst_orange;
          case 106:return cst_orangered;
          case 107:return cst_orchid;
          case 108:return cst_palegoldenrod;
          case 109:return cst_palegreen;
          default:return cst_paleturquoise}}
      if(37 <= _de_)
       switch(_de_)
        {case 37:return cst_darkslategrey;
         case 38:return cst_darkturquoise;
         case 39:return cst_darkviolet;
         case 40:return cst_deeppink;
         case 41:return cst_deepskyblue;
         case 42:return cst_dimgray;
         case 43:return cst_dimgrey;
         case 44:return cst_dodgerblue;
         case 45:return cst_firebrick;
         case 46:return cst_floralwhite;
         case 47:return cst_forestgreen;
         case 48:return cst_fuchsia;
         case 49:return cst_gainsboro;
         case 50:return cst_ghostwhite;
         case 51:return cst_gold;
         case 52:return cst_goldenrod;
         case 53:return cst_gray;
         case 54:return cst_grey;
         case 55:return cst_green;
         case 56:return cst_greenyellow;
         case 57:return cst_honeydew;
         case 58:return cst_hotpink;
         case 59:return cst_indianred;
         case 60:return cst_indigo;
         case 61:return cst_ivory;
         case 62:return cst_khaki;
         case 63:return cst_lavender;
         case 64:return cst_lavenderblush;
         case 65:return cst_lawngreen;
         case 66:return cst_lemonchiffon;
         case 67:return cst_lightblue;
         case 68:return cst_lightcoral;
         case 69:return cst_lightcyan;
         case 70:return cst_lightgoldenrodyellow;
         case 71:return cst_lightgray;
         case 72:return cst_lightgreen;
         default:return cst_lightgrey}
      switch(_de_)
       {case 0:return cst_aliceblue;
        case 1:return cst_antiquewhite;
        case 2:return cst_aqua;
        case 3:return cst_aquamarine;
        case 4:return cst_azure;
        case 5:return cst_beige;
        case 6:return cst_bisque;
        case 7:return cst_black;
        case 8:return cst_blanchedalmond;
        case 9:return cst_blue;
        case 10:return cst_blueviolet;
        case 11:return cst_brown;
        case 12:return cst_burlywood;
        case 13:return cst_cadetblue;
        case 14:return cst_chartreuse;
        case 15:return cst_chocolate;
        case 16:return cst_coral;
        case 17:return cst_cornflowerblue;
        case 18:return cst_cornsilk;
        case 19:return cst_crimson;
        case 20:return cst_cyan;
        case 21:return cst_darkblue;
        case 22:return cst_darkcyan;
        case 23:return cst_darkgoldenrod;
        case 24:return cst_darkgray;
        case 25:return cst_darkgreen;
        case 26:return cst_darkgrey;
        case 27:return cst_darkkhaki;
        case 28:return cst_darkmagenta;
        case 29:return cst_darkolivegreen;
        case 30:return cst_darkorange;
        case 31:return cst_darkorchid;
        case 32:return cst_darkred;
        case 33:return cst_darksalmon;
        case 34:return cst_darkseagreen;
        case 35:return cst_darkslateblue;
        default:return cst_darkslategray}}
    function name_of_string(s)
     {var switch$0=caml_string_compare(s,cst_lightgrey$0);
      if(0 <= switch$0)
       {if(! (0 < switch$0))return 73;
        var switch$1=caml_string_compare(s,cst_paleturquoise$0);
        if(0 <= switch$1)
         {if(! (0 < switch$1))return 110;
          var switch$2=caml_string_compare(s,cst_skyblue$0);
          if(0 <= switch$2)
           {if(! (0 < switch$2))return 129;
            var switch$3=caml_string_compare(s,cst_thistle$0);
            if(0 <= switch$3)
             {if(! (0 < switch$3))return 138;
              if(! caml_string_notequal(s,cst_tomato$0))return 139;
              if(! caml_string_notequal(s,cst_turquoise$0))return 140;
              if(! caml_string_notequal(s,cst_violet$0))return 141;
              if(! caml_string_notequal(s,cst_wheat$0))return 142;
              if(! caml_string_notequal(s,cst_white$0))return 143;
              if(! caml_string_notequal(s,cst_whitesmoke$0))return 144;
              if(! caml_string_notequal(s,cst_yellow$0))return 145;
              if(! caml_string_notequal(s,cst_yellowgreen$0))return 146}
            else
             {if(! caml_string_notequal(s,cst_slateblue$0))return 130;
              if(! caml_string_notequal(s,cst_slategray$0))return 131;
              if(! caml_string_notequal(s,cst_slategrey$0))return 132;
              if(! caml_string_notequal(s,cst_snow$0))return 133;
              if(! caml_string_notequal(s,cst_springgreen$0))return 134;
              if(! caml_string_notequal(s,cst_steelblue$0))return 135;
              if(! caml_string_notequal(s,cst_tan$0))return 136;
              if(! caml_string_notequal(s,cst_teal$0))return 137}}
          else
           {var switch$4=caml_string_compare(s,cst_rosybrown$0);
            if(0 <= switch$4)
             {if(! (0 < switch$4))return 120;
              if(! caml_string_notequal(s,cst_royalblue$0))return 121;
              if(! caml_string_notequal(s,cst_saddlebrown$0))return 122;
              if(! caml_string_notequal(s,cst_salmon$0))return 123;
              if(! caml_string_notequal(s,cst_sandybrown$0))return 124;
              if(! caml_string_notequal(s,cst_seagreen$0))return 125;
              if(! caml_string_notequal(s,cst_seashell$0))return 126;
              if(! caml_string_notequal(s,cst_sienna$0))return 127;
              if(! caml_string_notequal(s,cst_silver$0))return 128}
            else
             {if(! caml_string_notequal(s,cst_palevioletred$0))return 111;
              if(! caml_string_notequal(s,cst_papayawhip$0))return 112;
              if(! caml_string_notequal(s,cst_peachpuff$0))return 113;
              if(! caml_string_notequal(s,cst_peru$0))return 114;
              if(! caml_string_notequal(s,cst_pink$0))return 115;
              if(! caml_string_notequal(s,cst_plum$0))return 116;
              if(! caml_string_notequal(s,cst_powderblue$0))return 117;
              if(! caml_string_notequal(s,cst_purple$0))return 118;
              if(! caml_string_notequal(s,cst_red$0))return 119}}}
        else
         {var switch$5=caml_string_compare(s,cst_mediumslateblue$0);
          if(0 <= switch$5)
           {if(! (0 < switch$5))return 92;
            var switch$6=caml_string_compare(s,cst_navy$0);
            if(0 <= switch$6)
             {if(! (0 < switch$6))return 101;
              if(! caml_string_notequal(s,cst_oldlace$0))return 102;
              if(! caml_string_notequal(s,cst_olive$0))return 103;
              if(! caml_string_notequal(s,cst_olivedrab$0))return 104;
              if(! caml_string_notequal(s,cst_orange$0))return 105;
              if(! caml_string_notequal(s,cst_orangered$0))return 106;
              if(! caml_string_notequal(s,cst_orchid$0))return 107;
              if(! caml_string_notequal(s,cst_palegoldenrod$0))return 108;
              if(! caml_string_notequal(s,cst_palegreen$0))return 109}
            else
             {if(! caml_string_notequal(s,cst_mediumspringgreen$0))return 93;
              if(! caml_string_notequal(s,cst_mediumturquoise$0))return 94;
              if(! caml_string_notequal(s,cst_mediumvioletred$0))return 95;
              if(! caml_string_notequal(s,cst_midnightblue$0))return 96;
              if(! caml_string_notequal(s,cst_mintcream$0))return 97;
              if(! caml_string_notequal(s,cst_mistyrose$0))return 98;
              if(! caml_string_notequal(s,cst_moccasin$0))return 99;
              if(! caml_string_notequal(s,cst_navajowhite$0))return 100}}
          else
           {var switch$7=caml_string_compare(s,cst_limegreen$0);
            if(0 <= switch$7)
             {if(! (0 < switch$7))return 83;
              if(! caml_string_notequal(s,cst_linen$0))return 84;
              if(! caml_string_notequal(s,cst_magenta$0))return 85;
              if(! caml_string_notequal(s,cst_maroon$0))return 86;
              if(! caml_string_notequal(s,cst_mediumaquamarine$0))return 87;
              if(! caml_string_notequal(s,cst_mediumblue$0))return 88;
              if(! caml_string_notequal(s,cst_mediumorchid$0))return 89;
              if(! caml_string_notequal(s,cst_mediumpurple$0))return 90;
              if(! caml_string_notequal(s,cst_mediumseagreen$0))return 91}
            else
             {if(! caml_string_notequal(s,cst_lightpink$0))return 74;
              if(! caml_string_notequal(s,cst_lightsalmon$0))return 75;
              if(! caml_string_notequal(s,cst_lightseagreen$0))return 76;
              if(! caml_string_notequal(s,cst_lightskyblue$0))return 77;
              if(! caml_string_notequal(s,cst_lightslategray$0))return 78;
              if(! caml_string_notequal(s,cst_lightslategrey$0))return 79;
              if(! caml_string_notequal(s,cst_lightsteelblue$0))return 80;
              if(! caml_string_notequal(s,cst_lightyellow$0))return 81;
              if(! caml_string_notequal(s,cst_lime$0))return 82}}}}
      else
       {var switch$8=caml_string_compare(s,cst_darkslategray$0);
        if(0 <= switch$8)
         {if(! (0 < switch$8))return 36;
          var switch$9=caml_string_compare(s,cst_greenyellow$0);
          if(0 <= switch$9)
           {if(! (0 < switch$9))return 56;
            var switch$10=caml_string_compare(s,cst_lavenderblush$0);
            if(0 <= switch$10)
             {if(! (0 < switch$10))return 64;
              if(! caml_string_notequal(s,cst_lawngreen$0))return 65;
              if(! caml_string_notequal(s,cst_lemonchiffon$0))return 66;
              if(! caml_string_notequal(s,cst_lightblue$0))return 67;
              if(! caml_string_notequal(s,cst_lightcoral$0))return 68;
              if(! caml_string_notequal(s,cst_lightcyan$0))return 69;
              if(! caml_string_notequal(s,cst_lightgoldenrodyellow$0))
               return 70;
              if(! caml_string_notequal(s,cst_lightgray$0))return 71;
              if(! caml_string_notequal(s,cst_lightgreen$0))return 72}
            else
             {if(! caml_string_notequal(s,cst_grey$0))return 54;
              if(! caml_string_notequal(s,cst_honeydew$0))return 57;
              if(! caml_string_notequal(s,cst_hotpink$0))return 58;
              if(! caml_string_notequal(s,cst_indianred$0))return 59;
              if(! caml_string_notequal(s,cst_indigo$0))return 60;
              if(! caml_string_notequal(s,cst_ivory$0))return 61;
              if(! caml_string_notequal(s,cst_khaki$0))return 62;
              if(! caml_string_notequal(s,cst_lavender$0))return 63}}
          else
           {var switch$11=caml_string_compare(s,cst_floralwhite$0);
            if(0 <= switch$11)
             {if(! (0 < switch$11))return 46;
              if(! caml_string_notequal(s,cst_forestgreen$0))return 47;
              if(! caml_string_notequal(s,cst_fuchsia$0))return 48;
              if(! caml_string_notequal(s,cst_gainsboro$0))return 49;
              if(! caml_string_notequal(s,cst_ghostwhite$0))return 50;
              if(! caml_string_notequal(s,cst_gold$0))return 51;
              if(! caml_string_notequal(s,cst_goldenrod$0))return 52;
              if(! caml_string_notequal(s,cst_gray$0))return 53;
              if(! caml_string_notequal(s,cst_green$0))return 55}
            else
             {if(! caml_string_notequal(s,cst_darkslategrey$0))return 37;
              if(! caml_string_notequal(s,cst_darkturquoise$0))return 38;
              if(! caml_string_notequal(s,cst_darkviolet$0))return 39;
              if(! caml_string_notequal(s,cst_deeppink$0))return 40;
              if(! caml_string_notequal(s,cst_deepskyblue$0))return 41;
              if(! caml_string_notequal(s,cst_dimgray$0))return 42;
              if(! caml_string_notequal(s,cst_dimgrey$0))return 43;
              if(! caml_string_notequal(s,cst_dodgerblue$0))return 44;
              if(! caml_string_notequal(s,cst_firebrick$0))return 45}}}
        else
         {var switch$12=caml_string_compare(s,cst_cornsilk$0);
          if(0 <= switch$12)
           {if(! (0 < switch$12))return 18;
            var switch$13=caml_string_compare(s,cst_darkkhaki$0);
            if(0 <= switch$13)
             {if(! (0 < switch$13))return 27;
              if(! caml_string_notequal(s,cst_darkmagenta$0))return 28;
              if(! caml_string_notequal(s,cst_darkolivegreen$0))return 29;
              if(! caml_string_notequal(s,cst_darkorange$0))return 30;
              if(! caml_string_notequal(s,cst_darkorchid$0))return 31;
              if(! caml_string_notequal(s,cst_darkred$0))return 32;
              if(! caml_string_notequal(s,cst_darksalmon$0))return 33;
              if(! caml_string_notequal(s,cst_darkseagreen$0))return 34;
              if(! caml_string_notequal(s,cst_darkslateblue$0))return 35}
            else
             {if(! caml_string_notequal(s,cst_crimson$0))return 19;
              if(! caml_string_notequal(s,cst_cyan$0))return 20;
              if(! caml_string_notequal(s,cst_darkblue$0))return 21;
              if(! caml_string_notequal(s,cst_darkcyan$0))return 22;
              if(! caml_string_notequal(s,cst_darkgoldenrod$0))return 23;
              if(! caml_string_notequal(s,cst_darkgray$0))return 24;
              if(! caml_string_notequal(s,cst_darkgreen$0))return 25;
              if(! caml_string_notequal(s,cst_darkgrey$0))return 26}}
          else
           {var switch$14=caml_string_compare(s,cst_blue$0);
            if(0 <= switch$14)
             {if(! (0 < switch$14))return 9;
              if(! caml_string_notequal(s,cst_blueviolet$0))return 10;
              if(! caml_string_notequal(s,cst_brown$0))return 11;
              if(! caml_string_notequal(s,cst_burlywood$0))return 12;
              if(! caml_string_notequal(s,cst_cadetblue$0))return 13;
              if(! caml_string_notequal(s,cst_chartreuse$0))return 14;
              if(! caml_string_notequal(s,cst_chocolate$0))return 15;
              if(! caml_string_notequal(s,cst_coral$0))return 16;
              if(! caml_string_notequal(s,cst_cornflowerblue$0))return 17}
            else
             {if(! caml_string_notequal(s,cst_aliceblue$0))return 0;
              if(! caml_string_notequal(s,cst_antiquewhite$0))return 1;
              if(! caml_string_notequal(s,cst_aqua$0))return 2;
              if(! caml_string_notequal(s,cst_aquamarine$0))return 3;
              if(! caml_string_notequal(s,cst_azure$0))return 4;
              if(! caml_string_notequal(s,cst_beige$0))return 5;
              if(! caml_string_notequal(s,cst_bisque$0))return 6;
              if(! caml_string_notequal(s,cst_black$0))return 7;
              if(! caml_string_notequal(s,cst_blanchedalmond$0))return 8}}}}
      var _dd_=caml_call2(Stdlib[28],s,cst_is_not_a_valid_color_name);
      throw [0,Stdlib[6],_dd_]}
    function rgb_of_name(param)
     {var _dc_=param;
      if(74 <= _dc_)
       {if(111 <= _dc_)
         switch(_dc_)
          {case 111:return _bq_;
           case 112:return _br_;
           case 113:return _bs_;
           case 114:return _bt_;
           case 115:return _bu_;
           case 116:return _bv_;
           case 117:return _bw_;
           case 118:return _bx_;
           case 119:return _by_;
           case 120:return _bz_;
           case 121:return _bA_;
           case 122:return _bB_;
           case 123:return _bC_;
           case 124:return _bD_;
           case 125:return _bE_;
           case 126:return _bF_;
           case 127:return _bG_;
           case 128:return _bH_;
           case 129:return _bI_;
           case 130:return _bJ_;
           case 131:return _bK_;
           case 132:return _bL_;
           case 133:return _bM_;
           case 134:return _bN_;
           case 135:return _bO_;
           case 136:return _bP_;
           case 137:return _bQ_;
           case 138:return _bR_;
           case 139:return _bS_;
           case 140:return _bT_;
           case 141:return _bU_;
           case 142:return _bV_;
           case 143:return _bW_;
           case 144:return _bX_;
           case 145:return _bY_;
           default:return _bZ_}
        switch(_dc_)
         {case 74:return _aR_;
          case 75:return _aS_;
          case 76:return _aT_;
          case 77:return _aU_;
          case 78:return _aV_;
          case 79:return _aW_;
          case 80:return _aX_;
          case 81:return _aY_;
          case 82:return _aZ_;
          case 83:return _a0_;
          case 84:return _a1_;
          case 85:return _a2_;
          case 86:return _a3_;
          case 87:return _a4_;
          case 88:return _a5_;
          case 89:return _a6_;
          case 90:return _a7_;
          case 91:return _a8_;
          case 92:return _a9_;
          case 93:return _a__;
          case 94:return _a$_;
          case 95:return _ba_;
          case 96:return _bb_;
          case 97:return _bc_;
          case 98:return _bd_;
          case 99:return _be_;
          case 100:return _bf_;
          case 101:return _bg_;
          case 102:return _bh_;
          case 103:return _bi_;
          case 104:return _bj_;
          case 105:return _bk_;
          case 106:return _bl_;
          case 107:return _bm_;
          case 108:return _bn_;
          case 109:return _bo_;
          default:return _bp_}}
      if(37 <= _dc_)
       switch(_dc_)
        {case 37:return _ag_;
         case 38:return _ah_;
         case 39:return _ai_;
         case 40:return _aj_;
         case 41:return _ak_;
         case 42:return _al_;
         case 43:return _am_;
         case 44:return _an_;
         case 45:return _ao_;
         case 46:return _ap_;
         case 47:return _aq_;
         case 48:return _ar_;
         case 49:return _as_;
         case 50:return _at_;
         case 51:return _au_;
         case 52:return _av_;
         case 53:return _aw_;
         case 54:return _ax_;
         case 55:return _ay_;
         case 56:return _az_;
         case 57:return _aA_;
         case 58:return _aB_;
         case 59:return _aC_;
         case 60:return _aD_;
         case 61:return _aE_;
         case 62:return _aF_;
         case 63:return _aG_;
         case 64:return _aH_;
         case 65:return _aI_;
         case 66:return _aJ_;
         case 67:return _aK_;
         case 68:return _aL_;
         case 69:return _aM_;
         case 70:return _aN_;
         case 71:return _aO_;
         case 72:return _aP_;
         default:return _aQ_}
      switch(_dc_)
       {case 0:return _x_;
        case 1:return _y_;
        case 2:return _z_;
        case 3:return _A_;
        case 4:return _B_;
        case 5:return _C_;
        case 6:return _D_;
        case 7:return _E_;
        case 8:return _F_;
        case 9:return _G_;
        case 10:return _H_;
        case 11:return _I_;
        case 12:return _J_;
        case 13:return _K_;
        case 14:return _L_;
        case 15:return _M_;
        case 16:return _N_;
        case 17:return _O_;
        case 18:return _P_;
        case 19:return _Q_;
        case 20:return _R_;
        case 21:return _S_;
        case 22:return _T_;
        case 23:return _U_;
        case 24:return _V_;
        case 25:return _W_;
        case 26:return _X_;
        case 27:return _Y_;
        case 28:return _Z_;
        case 29:return ___;
        case 30:return _$_;
        case 31:return _aa_;
        case 32:return _ab_;
        case 33:return _ac_;
        case 34:return _ad_;
        case 35:return _ae_;
        default:return _af_}}
    function rgb(a,r,g,b)
     {if(a){var a$0=a[1];return [3,[0,r,g,b,a$0]]}return [1,[0,r,g,b]]}
    function hsl(a,h,s,l)
     {if(a){var a$0=a[1];return [6,[0,h,s,l,a$0]]}return [5,[0,h,s,l]]}
    function string_of_t(param)
     {switch(param[0])
       {case 0:var n=param[1];return string_of_name(n);
        case 1:
         var match=param[1],b=match[3],g=match[2],r=match[1];
         return caml_call4(Stdlib_Printf[4],_b0_,r,g,b);
        case 2:
         var match$0=param[1],b$0=match$0[3],g$0=match$0[2],r$0=match$0[1];
         return caml_call4(Stdlib_Printf[4],_b1_,r$0,g$0,b$0);
        case 3:
         var
          match$1=param[1],
          a=match$1[4],
          b$1=match$1[3],
          g$1=match$1[2],
          r$1=match$1[1];
         return caml_call5(Stdlib_Printf[4],_b2_,r$1,g$1,b$1,a);
        case 4:
         var
          match$2=param[1],
          a$0=match$2[4],
          b$2=match$2[3],
          g$2=match$2[2],
          r$2=match$2[1];
         return caml_call5(Stdlib_Printf[4],_b3_,r$2,g$2,b$2,a$0);
        case 5:
         var match$3=param[1],l=match$3[3],s=match$3[2],h=match$3[1];
         return caml_call4(Stdlib_Printf[4],_b4_,h,s,l);
        default:
         var
          match$4=param[1],
          a$1=match$4[4],
          l$0=match$4[3],
          s$0=match$4[2],
          h$0=match$4[1];
         return caml_call5(Stdlib_Printf[4],_b5_,h$0,s$0,l$0,a$1)}}
    function hex_of_rgb(param)
     {var blue=param[3],green=param[2],red=param[1];
      function in_range(i)
       {var
         _c__=caml_call2(symbol$5,i,0),
         _c$_=_c__ || caml_call2(symbol$9,i,255);
        if(_c$_)
         {var
           _da_=caml_call1(Stdlib[33],i),
           _db_=caml_call2(Stdlib[28],_da_,cst_is_out_of_valid_range);
          throw [0,Stdlib[6],_db_]}
        return _c$_}
      in_range(red);
      in_range(green);
      in_range(blue);
      return caml_call4(Stdlib_Printf[4],_b6_,red,green,blue)}
    function js_t_of_js_string(s)
     {var
       t0=caml_jsbytes_of_string(cst_rgb_s_d_s_d_s_d),
       t13=new t11(t0),
       t2=caml_jsbytes_of_string(cst_rgb_s_d_s_d_s_d$0),
       t17=new t11(t2),
       t4=caml_jsbytes_of_string(cst_rgba_s_d_s_d_s_d_d_d),
       t15=new t11(t4),
       t6=caml_jsbytes_of_string(cst_rgba_s_d_s_d_s_d_d_d$0),
       t19=new t11(t6),
       t8=caml_jsbytes_of_string(cst_hsl_s_d_s_d_s_d),
       t21=new t11(t8),
       t10=caml_jsbytes_of_string(cst_hsla_s_d_s_d_s_d_d_d),
       t23=new t11(t10);
      if
       (!
        (t13.test(s) | 0)
        &&
        !
        (t15.test(s) | 0)
        &&
        !
        (t17.test(s) | 0)
        &&
        !
        (t19.test(s) | 0)
        &&
        !
        (t21.test(s) | 0)
        &&
        !
        (t23.test(s) | 0))
       {var _c7_=caml_string_of_jsstring(s);
        if(caml_call2(Stdlib_List[36],_c7_,_b7_))return s;
        var
         _c8_=caml_string_of_jsstring(s),
         _c9_=caml_call2(Stdlib[28],_c8_,cst_is_not_a_valid_color);
        throw [0,Stdlib[6],_c9_]}
      return s}
    function js(c)
     {if(0 === c[0])
       {var n=c[1];return caml_jsstring_of_string(string_of_name(n))}
      return caml_jsstring_of_string(string_of_t(c))}
    function ml(c)
     {var s=caml_string_of_jsstring(c);
      try
       {var _cU_=[0,name_of_string(s)];return _cU_}
      catch(_cV_)
       {_cV_ = caml_wrap_exception(_cV_);
        if(_cV_[1] === Stdlib[6])
         {var
           fail=
            function(param)
             {var _c6_=caml_call2(Stdlib[28],s,cst_is_not_a_valid_color$0);
              throw [0,Stdlib[6],_c6_]},
           re_rgb=regexp(cst_rgba_d_d_d_d_d),
           re_rgb_pct=regexp(cst_rgba_d_d_d_d_d$0),
           re_hsl=regexp(cst_hsla_d_d_d_d_d),
           i_of_s_o=
            function(param)
             {if(param)
               {var i=param[1];
                try
                 {var _c4_=caml_int_of_string(i);return _c4_}
                catch(_c5_)
                 {_c5_ = caml_wrap_exception(_c5_);
                  if(_c5_[1] === Stdlib[6])
                   var s=_c5_[2];
                  else
                   {if(_c5_[1] !== Stdlib[7])throw _c5_;var s=_c5_[2]}
                  var
                   _c1_=caml_call2(Stdlib[28],cst$39,s),
                   _c2_=caml_call2(Stdlib[28],i,_c1_),
                   _c3_=caml_call2(Stdlib[28],cst_color_conversion_error,_c2_);
                  throw [0,Stdlib[6],_c3_]}}
              return fail(0)},
           f_of_s=
            function(f)
             {try
               {var _cZ_=caml_float_of_string(f);return _cZ_}
              catch(_c0_)
               {_c0_ = caml_wrap_exception(_c0_);
                if(_c0_[1] === Stdlib[6])
                 var s=_c0_[2];
                else
                 {if(_c0_[1] !== Stdlib[7])throw _c0_;var s=_c0_[2]}
                var
                 _cW_=caml_call2(Stdlib[28],cst$40,s),
                 _cX_=caml_call2(Stdlib[28],f,_cW_),
                 _cY_=caml_call2(Stdlib[28],cst_color_conversion_error$0,_cX_);
                throw [0,Stdlib[6],_cY_]}},
           match=string_match(re_rgb,s,0);
          if(match)
           {var
             r=match[1],
             red=matched_group(r,2),
             green=matched_group(r,3),
             blue=matched_group(r,4),
             alpha=matched_group(r,5),
             match$0=matched_group(r,1);
            if(match$0)
             {var _cC_=match$0[1];
              if(! caml_string_notequal(_cC_,cst_rgb))
               {if(alpha)return fail(0);
                var _cG_=i_of_s_o(blue),_cH_=i_of_s_o(green);
                return [1,[0,i_of_s_o(red),_cH_,_cG_]]}
              if(! caml_string_notequal(_cC_,cst_rgba))
               {if(alpha)
                 {var
                   a=alpha[1],
                   _cD_=f_of_s(a),
                   _cE_=i_of_s_o(blue),
                   _cF_=i_of_s_o(green);
                  return [3,[0,i_of_s_o(red),_cF_,_cE_,_cD_]]}
                return fail(0)}}
            return fail(0)}
          var match$1=string_match(re_rgb_pct,s,0);
          if(match$1)
           {var
             r$0=match$1[1],
             red$0=matched_group(r$0,2),
             green$0=matched_group(r$0,3),
             blue$0=matched_group(r$0,4),
             alpha$0=matched_group(r$0,5),
             match$2=matched_group(r$0,1);
            if(match$2)
             {var _cI_=match$2[1];
              if(! caml_string_notequal(_cI_,cst_rgb$0))
               {if(alpha$0)return fail(0);
                var _cM_=i_of_s_o(blue$0),_cN_=i_of_s_o(green$0);
                return [2,[0,i_of_s_o(red$0),_cN_,_cM_]]}
              if(! caml_string_notequal(_cI_,cst_rgba$0))
               {if(alpha$0)
                 {var
                   a$0=alpha$0[1],
                   _cJ_=f_of_s(a$0),
                   _cK_=i_of_s_o(blue$0),
                   _cL_=i_of_s_o(green$0);
                  return [4,[0,i_of_s_o(red$0),_cL_,_cK_,_cJ_]]}
                return fail(0)}}
            return fail(0)}
          var match$3=string_match(re_hsl,s,0);
          if(match$3)
           {var
             r$1=match$3[1],
             red$1=matched_group(r$1,2),
             green$1=matched_group(r$1,3),
             blue$1=matched_group(r$1,4),
             alpha$1=matched_group(r$1,5),
             match$4=matched_group(r$1,1);
            if(match$4)
             {var _cO_=match$4[1];
              if(! caml_string_notequal(_cO_,cst_hsl))
               {if(alpha$1)return fail(0);
                var _cS_=i_of_s_o(blue$1),_cT_=i_of_s_o(green$1);
                return [5,[0,i_of_s_o(red$1),_cT_,_cS_]]}
              if(! caml_string_notequal(_cO_,cst_hsla))
               {if(alpha$1)
                 {var
                   a$1=alpha$1[1],
                   _cP_=f_of_s(a$1),
                   _cQ_=i_of_s_o(blue$1),
                   _cR_=i_of_s_o(green$1);
                  return [6,[0,i_of_s_o(red$1),_cR_,_cQ_,_cP_]]}
                return fail(0)}}
            return fail(0)}
          return fail(0)}
        throw _cV_}}
    function string_of_t$0(param)
     {if(typeof param === "number")
       return cst_0;
      else
       switch(param[0])
        {case 0:
          var f=param[1];return caml_call3(Stdlib_Printf[4],_b8_,f,cst_em$0);
         case 1:
          var f$0=param[1];
          return caml_call3(Stdlib_Printf[4],_b9_,f$0,cst_ex);
         case 2:
          var f$1=param[1];
          return caml_call3(Stdlib_Printf[4],_b__,f$1,cst_px);
         case 3:
          var f$2=param[1];
          return caml_call3(Stdlib_Printf[4],_b$_,f$2,cst_gd);
         case 4:
          var f$3=param[1];
          return caml_call3(Stdlib_Printf[4],_ca_,f$3,cst_rem);
         case 5:
          var f$4=param[1];
          return caml_call3(Stdlib_Printf[4],_cb_,f$4,cst_vw);
         case 6:
          var f$5=param[1];
          return caml_call3(Stdlib_Printf[4],_cc_,f$5,cst_vh);
         case 7:
          var f$6=param[1];
          return caml_call3(Stdlib_Printf[4],_cd_,f$6,cst_vm);
         case 8:
          var f$7=param[1];
          return caml_call3(Stdlib_Printf[4],_ce_,f$7,cst_ch);
         case 9:
          var f$8=param[1];
          return caml_call3(Stdlib_Printf[4],_cf_,f$8,cst_mm);
         case 10:
          var f$9=param[1];
          return caml_call3(Stdlib_Printf[4],_cg_,f$9,cst_cm);
         case 11:
          var f$10=param[1];
          return caml_call3(Stdlib_Printf[4],_ch_,f$10,cst_in);
         case 12:
          var f$11=param[1];
          return caml_call3(Stdlib_Printf[4],_ci_,f$11,cst_pt);
         default:
          var f$12=param[1];
          return caml_call3(Stdlib_Printf[4],_cj_,f$12,cst_pc)}}
    function js$0(t){return caml_jsstring_of_string(string_of_t$0(t))}
    function ml$0(t)
     {var s=caml_string_of_jsstring(t);
      if(caml_call2(String[68],s,cst_0$0))return 0;
      function fail(param)
       {var _cB_=caml_call2(Stdlib[28],s,cst_is_not_a_valid_length);
        throw [0,Stdlib[6],_cB_]}
      var re=regexp(cst_d_d_s_S),match=string_match(re,s,0);
      if(match)
       {var r=match[1],match$0=matched_group(r,1);
        if(match$0)
         {var f=match$0[1];
          try
           {var _cz_=caml_float_of_string(f)}
          catch(exn)
           {exn = caml_wrap_exception(exn);
            if(exn[1] === Stdlib[6])
             {var
               s$0=exn[2],
               _cy_=caml_call2(Stdlib[28],cst_length_conversion_error,s$0);
              throw [0,Stdlib[6],_cy_]}
            throw exn}
          var f$0=_cz_}
        else
         var f$0=fail(0);
        var match$1=matched_group(r,2);
        if(match$1)
         {var _cA_=match$1[1],switch$0=caml_string_compare(_cA_,cst_pc$0);
          if(0 <= switch$0)
           {if(! (0 < switch$0))return [13,f$0];
            if(! caml_string_notequal(_cA_,cst_pt$0))return [12,f$0];
            if(! caml_string_notequal(_cA_,cst_px$0))return [2,f$0];
            if(! caml_string_notequal(_cA_,cst_rem$0))return [4,f$0];
            if(! caml_string_notequal(_cA_,cst_vh$0))return [6,f$0];
            if(! caml_string_notequal(_cA_,cst_vm$0))return [7,f$0];
            if(! caml_string_notequal(_cA_,cst_vw$0))return [5,f$0]}
          else
           {if(! caml_string_notequal(_cA_,cst_ch$0))return [8,f$0];
            if(! caml_string_notequal(_cA_,cst_cm$0))return [10,f$0];
            if(! caml_string_notequal(_cA_,cst_em$1))return [0,f$0];
            if(! caml_string_notequal(_cA_,cst_ex$0))return [1,f$0];
            if(! caml_string_notequal(_cA_,cst_gd$0))return [3,f$0];
            if(! caml_string_notequal(_cA_,cst_in$0))return [11,f$0];
            if(! caml_string_notequal(_cA_,cst_mm$0))return [9,f$0]}
          return fail(0)}
        return fail(0)}
      return fail(0)}
    var Length=[0,string_of_t$0,js$0,ml$0];
    function string_of_t$1(param)
     {switch(param[0])
       {case 0:
         var f=param[1];return caml_call3(Stdlib_Printf[4],_ck_,f,cst_deg);
        case 1:
         var f$0=param[1];
         return caml_call3(Stdlib_Printf[4],_cl_,f$0,cst_grad);
        case 2:
         var f$1=param[1];
         return caml_call3(Stdlib_Printf[4],_cm_,f$1,cst_rad);
        default:
         var f$2=param[1];
         return caml_call3(Stdlib_Printf[4],_cn_,f$2,cst_turns)}}
    function js$1(t){return caml_jsstring_of_string(string_of_t$1(t))}
    function ml$1(j)
     {var s=caml_string_of_jsstring(j),re=regexp(cst_d_d_deg_grad_rad_turns);
      function fail(param)
       {var _cx_=caml_call2(Stdlib[28],s,cst_is_not_a_valid_length$0);
        throw [0,Stdlib[6],_cx_]}
      var match=string_match(re,s,0);
      if(match)
       {var r=match[1],match$0=matched_group(r,1);
        if(match$0)
         {var f=match$0[1];
          try
           {var _cv_=caml_float_of_string(f)}
          catch(exn)
           {exn = caml_wrap_exception(exn);
            if(exn[1] === Stdlib[6])
             {var
               s$0=exn[2],
               _cu_=caml_call2(Stdlib[28],cst_length_conversion_error$0,s$0);
              throw [0,Stdlib[6],_cu_]}
            throw exn}
          var f$0=_cv_}
        else
         var f$0=fail(0);
        var match$1=matched_group(r,2);
        if(match$1)
         {var _cw_=match$1[1];
          if(! caml_string_notequal(_cw_,cst_deg$0))return [0,f$0];
          if(! caml_string_notequal(_cw_,cst_grad$0))return [1,f$0];
          if(! caml_string_notequal(_cw_,cst_rad$0))return [2,f$0];
          if(! caml_string_notequal(_cw_,cst_turns$0))return [3,f$0]}
        return fail(0)}
      return fail(0)}
    var
     Angle=[0,string_of_t$1,js$1,ml$1],
     Js_of_ocaml_CSS=
      [0,
       [0,
        string_of_name,
        rgb_of_name,
        hex_of_rgb,
        rgb,
        hsl,
        string_of_t,
        js,
        ml,
        js_t_of_js_string],
       Length,
       Angle];
    caml_register_global(1668,Js_of_ocaml_CSS,"Js_of_ocaml__CSS");
    function listen(opt,target,typ,cb)
     {if(opt)var sth=opt[1],capture=sth;else var capture=0;
      var _ct_=! ! capture;
      return addEventListener
              (target,
               typ,
               full_handler(function(n,e){return ! ! caml_call2(cb,n,e)}),
               _ct_)}
    var Js_of_ocaml_Dom_events=[0,Event$0,listen,removeEventListener];
    caml_register_global
     (1669,Js_of_ocaml_Dom_events,"Js_of_ocaml__Dom_events");
    var
     t0="http://www.w3.org/2000/svg",
     SVGError=[248,cst_Js_of_ocaml_Dom_svg_SVGErr,caml_fresh_oo_id(0)];
    function createElement$0(t2,name)
     {var t1=caml_jsstring_of_string(name);
      return t2.createElementNS("http://www.w3.org/2000/svg",t1)}
    function unsafeCreateElement$0(doc,name){return createElement$0(doc,name)}
    function createA$0(doc){return unsafeCreateElement$0(doc,cst_a$2)}
    function createAltGlyph(doc)
     {return unsafeCreateElement$0(doc,cst_altglyph)}
    function createAltGlyphDef(doc)
     {return unsafeCreateElement$0(doc,cst_altglyphdef)}
    function createAltGlyphItem(doc)
     {return unsafeCreateElement$0(doc,cst_altglyphitem)}
    function createAnimate(doc){return unsafeCreateElement$0(doc,cst_animate)}
    function createAnimateColor(doc)
     {return unsafeCreateElement$0(doc,cst_animatecolor)}
    function createAnimateMotion(doc)
     {return unsafeCreateElement$0(doc,cst_animatemotion)}
    function createAnimateTransform(doc)
     {return unsafeCreateElement$0(doc,cst_animatetransform)}
    function createCircle(doc){return unsafeCreateElement$0(doc,cst_circle)}
    function createClipPath(doc)
     {return unsafeCreateElement$0(doc,cst_clippath)}
    function createCursor(doc){return unsafeCreateElement$0(doc,cst_cursor)}
    function createDefs(doc){return unsafeCreateElement$0(doc,cst_defs)}
    function createDesc(doc){return unsafeCreateElement$0(doc,cst_desc)}
    function createEllipse(doc){return unsafeCreateElement$0(doc,cst_ellipse)}
    function createFilter(doc){return unsafeCreateElement$0(doc,cst_filter)}
    function createFont(doc){return unsafeCreateElement$0(doc,cst_font)}
    function createFontFace(doc)
     {return unsafeCreateElement$0(doc,cst_font_face)}
    function createFontFaceFormat(doc)
     {return unsafeCreateElement$0(doc,cst_font_face_format)}
    function createFontFaceName(doc)
     {return unsafeCreateElement$0(doc,cst_font_face_name)}
    function createFontFaceSrc(doc)
     {return unsafeCreateElement$0(doc,cst_font_face_src)}
    function createFontFaceUri(doc)
     {return unsafeCreateElement$0(doc,cst_font_face_uri)}
    function createForeignObject(doc)
     {return unsafeCreateElement$0(doc,cst_foreignObject)}
    function createG(doc){return unsafeCreateElement$0(doc,cst_g$0)}
    function createGlyph(doc){return unsafeCreateElement$0(doc,cst_glyph)}
    function createGlyphRef(doc)
     {return unsafeCreateElement$0(doc,cst_glyphref)}
    function createhkern(doc){return unsafeCreateElement$0(doc,cst_hkern)}
    function createImage(doc){return unsafeCreateElement$0(doc,cst_image)}
    function createLineElement(doc)
     {return unsafeCreateElement$0(doc,cst_line)}
    function createLinearElement(doc)
     {return unsafeCreateElement$0(doc,cst_lineargradient)}
    function createMask(doc){return unsafeCreateElement$0(doc,cst_mask)}
    function createMetaData(doc)
     {return unsafeCreateElement$0(doc,cst_metadata)}
    function createMissingGlyph(doc)
     {return unsafeCreateElement$0(doc,cst_missing_glyph)}
    function createMPath(doc){return unsafeCreateElement$0(doc,cst_mpath)}
    function createPath(doc){return unsafeCreateElement$0(doc,cst_path)}
    function createPattern(doc){return unsafeCreateElement$0(doc,cst_pattern)}
    function createPolygon(doc){return unsafeCreateElement$0(doc,cst_polygon)}
    function createPolyline(doc)
     {return unsafeCreateElement$0(doc,cst_polyline)}
    function createRadialgradient(doc)
     {return unsafeCreateElement$0(doc,cst_radialgradient)}
    function createRect(doc){return unsafeCreateElement$0(doc,cst_rect)}
    function createScript$0(doc)
     {return unsafeCreateElement$0(doc,cst_script$2)}
    function createSet(doc){return unsafeCreateElement$0(doc,cst_set)}
    function createStop(doc){return unsafeCreateElement$0(doc,cst_stop)}
    function createStyle$0(doc){return unsafeCreateElement$0(doc,cst_style$2)}
    function createSvg(doc){return unsafeCreateElement$0(doc,cst_svg)}
    function createSwitch(doc){return unsafeCreateElement$0(doc,cst_switch)}
    function createSymbol(doc){return unsafeCreateElement$0(doc,cst_symbol)}
    function createTextElement(doc)
     {return unsafeCreateElement$0(doc,cst_text$0)}
    function createTextpath(doc)
     {return unsafeCreateElement$0(doc,cst_textpath)}
    function createTitle$0(doc){return unsafeCreateElement$0(doc,cst_title$2)}
    function createTref(doc){return unsafeCreateElement$0(doc,cst_tref)}
    function createTspan(doc){return unsafeCreateElement$0(doc,cst_tspan)}
    function createUse(doc){return unsafeCreateElement$0(doc,cst_use)}
    function createView(doc){return unsafeCreateElement$0(doc,cst_view)}
    function createvkern(doc){return unsafeCreateElement$0(doc,cst_vkern)}
    var svg_element=Unsafe[1].SVGElement,document$0=Unsafe[1].document;
    function getElementById$0(id)
     {function _cq_(e){if(e instanceof svg_element)return e;throw Stdlib[8]}
      function _cr_(param){throw Stdlib[8]}
      var
       t6=caml_jsstring_of_string(id),
       t7=Unsafe[1].document,
       _cs_=t7.getElementById(t6);
      return caml_call3(Opt[7],_cs_,_cr_,_cq_)}
    function element$2(e){return e instanceof svg_element?e:no_handler}
    function unsafeCoerce$0(e,tag)
     {var t9=e.tagName,_cp_=caml_jsstring_of_string(tag);
      return t9.toLowerCase() === _cp_?e:no_handler}
    function a$0(e){return unsafeCoerce$0(e,cst_a$3)}
    function altGlyph(e){return unsafeCoerce$0(e,cst_altglyph$0)}
    function altGlyphDef(e){return unsafeCoerce$0(e,cst_altglyphdef$0)}
    function altGlyphItem(e){return unsafeCoerce$0(e,cst_altglyphitem$0)}
    function animate(e){return unsafeCoerce$0(e,cst_animate$0)}
    function animateColor(e){return unsafeCoerce$0(e,cst_animatecolor$0)}
    function animateMotion(e){return unsafeCoerce$0(e,cst_animatemotion$0)}
    function animateTransform(e)
     {return unsafeCoerce$0(e,cst_animatetransform$0)}
    function circle(e){return unsafeCoerce$0(e,cst_circle$0)}
    function clipPath(e){return unsafeCoerce$0(e,cst_clippath$0)}
    function cursor(e){return unsafeCoerce$0(e,cst_cursor$0)}
    function defs(e){return unsafeCoerce$0(e,cst_defs$0)}
    function desc(e){return unsafeCoerce$0(e,cst_desc$0)}
    function ellipse(e){return unsafeCoerce$0(e,cst_ellipse$0)}
    function filter(e){return unsafeCoerce$0(e,cst_filter$0)}
    function font(e){return unsafeCoerce$0(e,cst_font$0)}
    function fontFace(e){return unsafeCoerce$0(e,cst_font_face$0)}
    function fontFaceFormat(e)
     {return unsafeCoerce$0(e,cst_font_face_format$0)}
    function fontFaceName(e){return unsafeCoerce$0(e,cst_font_face_name$0)}
    function fontFaceSrc(e){return unsafeCoerce$0(e,cst_font_face_src$0)}
    function fontFaceUri(e){return unsafeCoerce$0(e,cst_font_face_uri$0)}
    function foreignObject(e){return unsafeCoerce$0(e,cst_foreignobject)}
    function g(e){return unsafeCoerce$0(e,cst_g$1)}
    function glyph(e){return unsafeCoerce$0(e,cst_glyph$0)}
    function glyphRef(e){return unsafeCoerce$0(e,cst_glyphref$0)}
    function hkern(e){return unsafeCoerce$0(e,cst_hkern$0)}
    function image(e){return unsafeCoerce$0(e,cst_image$0)}
    function lineElement(e){return unsafeCoerce$0(e,cst_line$0)}
    function linearElement(e){return unsafeCoerce$0(e,cst_lineargradient$0)}
    function mask(e){return unsafeCoerce$0(e,cst_mask$0)}
    function metaData(e){return unsafeCoerce$0(e,cst_metadata$0)}
    function missingGlyph(e){return unsafeCoerce$0(e,cst_missing_glyph$0)}
    function mPath(e){return unsafeCoerce$0(e,cst_mpath$0)}
    function path$0(e){return unsafeCoerce$0(e,cst_path$0)}
    function pattern(e){return unsafeCoerce$0(e,cst_pattern$0)}
    function polygon(e){return unsafeCoerce$0(e,cst_polygon$0)}
    function polyline(e){return unsafeCoerce$0(e,cst_polyline$0)}
    function radialgradient(e){return unsafeCoerce$0(e,cst_radialgradient$0)}
    function rect(e){return unsafeCoerce$0(e,cst_rect$0)}
    function script$0(e){return unsafeCoerce$0(e,cst_script$3)}
    function set$1(e){return unsafeCoerce$0(e,cst_set$0)}
    function stop(e){return unsafeCoerce$0(e,cst_stop$0)}
    function style$0(e){return unsafeCoerce$0(e,cst_style$3)}
    function svg(e){return unsafeCoerce$0(e,cst_svg$0)}
    function switch$0(e){return unsafeCoerce$0(e,cst_switch$0)}
    function symbol$12(e){return unsafeCoerce$0(e,cst_symbol$0)}
    function textElement(e){return unsafeCoerce$0(e,cst_text$1)}
    function textpath(e){return unsafeCoerce$0(e,cst_textpath$0)}
    function title$0(e){return unsafeCoerce$0(e,cst_title$3)}
    function tref(e){return unsafeCoerce$0(e,cst_tref$0)}
    function tspan(e){return unsafeCoerce$0(e,cst_tspan$0)}
    function use(e){return unsafeCoerce$0(e,cst_use$0)}
    function view(e){return unsafeCoerce$0(e,cst_view$0)}
    function vkern(e){return unsafeCoerce$0(e,cst_vkern$0)}
    var
     Js_of_ocaml_Dom_svg=
      [0,
       t0,
       SVGError,
       createElement$0,
       createA$0,
       createAltGlyph,
       createAltGlyphDef,
       createAltGlyphItem,
       createAnimate,
       createAnimateColor,
       createAnimateMotion,
       createAnimateTransform,
       createCircle,
       createClipPath,
       createCursor,
       createDefs,
       createDesc,
       createEllipse,
       createFilter,
       createFont,
       createFontFace,
       createFontFaceFormat,
       createFontFaceName,
       createFontFaceSrc,
       createFontFaceUri,
       createForeignObject,
       createG,
       createGlyph,
       createGlyphRef,
       createhkern,
       createImage,
       createLineElement,
       createLinearElement,
       createMask,
       createMetaData,
       createMissingGlyph,
       createMPath,
       createPath,
       createPattern,
       createPolygon,
       createPolyline,
       createRadialgradient,
       createRect,
       createScript$0,
       createSet,
       createStop,
       createStyle$0,
       createSvg,
       createSwitch,
       createSymbol,
       createTextElement,
       createTextpath,
       createTitle$0,
       createTref,
       createTspan,
       createUse,
       createView,
       createvkern,
       svg_element,
       document$0,
       getElementById$0,
       [0,
        element$2,
        a$0,
        altGlyph,
        altGlyphDef,
        altGlyphItem,
        animate,
        animateColor,
        animateMotion,
        animateTransform,
        circle,
        clipPath,
        cursor,
        defs,
        desc,
        ellipse,
        filter,
        font,
        fontFace,
        fontFaceFormat,
        fontFaceName,
        fontFaceSrc,
        fontFaceUri,
        foreignObject,
        g,
        glyph,
        glyphRef,
        hkern,
        image,
        lineElement,
        linearElement,
        mask,
        metaData,
        missingGlyph,
        mPath,
        path$0,
        pattern,
        polygon,
        polyline,
        radialgradient,
        rect,
        script$0,
        set$1,
        stop,
        style$0,
        svg,
        switch$0,
        symbol$12,
        textElement,
        textpath,
        title$0,
        tref,
        tspan,
        use,
        view,
        vkern]];
    caml_register_global(1670,Js_of_ocaml_Dom_svg,"Js_of_ocaml__Dom_svg");
    function withCredentials(b)
     {var t1={},t0=! ! b;t1.withCredentials = t0;return t1}
    var
     eventSource=Unsafe[1].EventSource,
     eventSource_options=Unsafe[1].EventSource,
     Js_of_ocaml_EventSource=
      [0,withCredentials,eventSource,eventSource_options,addEventListener];
    caml_register_global
     (1671,Js_of_ocaml_EventSource,"Js_of_ocaml__EventSource");
    var
     console=runtime.caml_js_get_console(0),
     Js_of_ocaml_Firebug=[0,console];
    caml_register_global(1672,Js_of_ocaml_Firebug,"Js_of_ocaml__Firebug");
    function empty_position_options(param){return {}}
    var
     t1$0=Unsafe[1].navigator,
     geolocation=caml_call1(Optdef[5],t1$0)?t1$0.geolocation:t1$0;
    function is_supported$3(param){return caml_call1(Optdef[5],geolocation)}
    var
     Js_of_ocaml_Geolocation=
      [0,empty_position_options,geolocation,is_supported$3];
    caml_register_global
     (1673,Js_of_ocaml_Geolocation,"Js_of_ocaml__Geolocation");
    function empty_intersection_observer_op(param){return {}}
    var intersectionObserver_unsafe=Unsafe[1].IntersectionObserver;
    function is_supported$4(param)
     {return caml_call1(Optdef[5],intersectionObserver_unsafe)}
    var
     Js_of_ocaml_IntersectionObserv=
      [0,
       empty_intersection_observer_op,
       is_supported$4,
       intersectionObserver_unsafe];
    caml_register_global
     (1674,Js_of_ocaml_IntersectionObserv,"Js_of_ocaml__IntersectionObserver");
    function object_options(param){return {"localeMatcher":"best fit"}}
    function options(param)
     {return {"localeMatcher":"best fit",
              "usage":"sort",
              "sensitivity":"variant",
              "ignorePunctuation":t4,
              "numeric":t4,
              "caseFirst":"false"}}
    var Collator=[0,object_options,options];
    function options$0(param)
     {return {"localeMatcher":"best fit",
              "timeZone":t39,
              "hour12":t39,
              "hourCycle":t39,
              "formatMatcher":"best fit",
              "weekday":t39,
              "era":t39,
              "year":t39,
              "month":t39,
              "day":t39,
              "hour":t39,
              "minute":t39,
              "second":t39,
              "timeZoneName":t39}}
    var DateTimeFormat=[0,object_options,options$0];
    function options$1(param)
     {return {"localeMatcher":"best fit",
              "style":"decimal",
              "currency":t39,
              "currencyDisplay":t39,
              "useGrouping":t25,
              "minimumIntegerDigits":t39,
              "minimumFractionDigits":t39,
              "maximumFractionDigits":t39,
              "minimumSignificantDigits":t39,
              "maximumSignificantDigits":t39}}
    var NumberFormat=[0,object_options,options$1];
    function options$2(param)
     {return {"localeMatcher":"best fit","type":"cardinal"}}
    var
     PluralRules=[0,object_options,options$2],
     intl=Unsafe[1].Intl,
     t35=Unsafe[1].Intl,
     collator_constr=t35.Collator,
     t37=Unsafe[1].Intl,
     dateTimeFormat_constr=t37.DateTimeFormat,
     t39$0=Unsafe[1].Intl,
     numberFormat_constr=t39$0.NumberFormat,
     t41=Unsafe[1].Intl,
     pluralRules_constr=t41.PluralRules;
    function is_supported$5(param){return caml_call1(Optdef[5],intl)}
    var
     Js_of_ocaml_Intl=
      [0,
       Collator,
       DateTimeFormat,
       NumberFormat,
       PluralRules,
       intl,
       collator_constr,
       dateTimeFormat_constr,
       numberFormat_constr,
       pluralRules_constr,
       is_supported$5];
    caml_register_global(1675,Js_of_ocaml_Intl,"Js_of_ocaml__Intl");
    var Js_of_ocaml$0=[0];
    caml_register_global(1676,Js_of_ocaml$0,"Js_of_ocaml");
    return}
  (globalThis));


//# 1 "../.js/uutf/uutf.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_blit_bytes=runtime.caml_blit_bytes,
     caml_bytes_unsafe_get=runtime.caml_bytes_unsafe_get,
     caml_check_bound=runtime.caml_check_bound,
     caml_create_bytes=runtime.caml_create_bytes,
     caml_ml_bytes_length=runtime.caml_ml_bytes_length,
     caml_ml_string_length=runtime.caml_ml_string_length,
     caml_string_compare=runtime.caml_string_compare,
     caml_string_get=runtime.caml_string_get,
     caml_string_notequal=runtime.caml_string_notequal,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_UTF_8$0=caml_string_of_jsbytes("UTF-8"),
     cst_US_ASCII$0=caml_string_of_jsbytes("US-ASCII"),
     cst_ISO_8859_1$1=caml_string_of_jsbytes("ISO-8859-1"),
     cst_UTF_16$0=caml_string_of_jsbytes("UTF-16"),
     cst_UTF_16LE$0=caml_string_of_jsbytes("UTF-16LE"),
     cst_UTF_16BE$0=caml_string_of_jsbytes("UTF-16BE"),
     cst_ISO646_US=caml_string_of_jsbytes("ISO646-US"),
     cst_CSISOLATIN1=caml_string_of_jsbytes("CSISOLATIN1"),
     cst_ANSI_X3_4_1968=caml_string_of_jsbytes("ANSI_X3.4-1968"),
     cst_ANSI_X3_4_1986=caml_string_of_jsbytes("ANSI_X3.4-1986"),
     cst_ASCII=caml_string_of_jsbytes("ASCII"),
     cst_CP367=caml_string_of_jsbytes("CP367"),
     cst_CP819=caml_string_of_jsbytes("CP819"),
     cst_CSASCII=caml_string_of_jsbytes("CSASCII"),
     cst_IBM367=caml_string_of_jsbytes("IBM367"),
     cst_IBM819=caml_string_of_jsbytes("IBM819"),
     cst_ISO_8859_1$0=caml_string_of_jsbytes("ISO-8859-1"),
     cst_ISO_IR_100=caml_string_of_jsbytes("ISO-IR-100"),
     cst_ISO_IR_6=caml_string_of_jsbytes("ISO-IR-6"),
     cst_US=caml_string_of_jsbytes("US"),
     cst_ISO_646_IRV_1991=caml_string_of_jsbytes("ISO_646.IRV:1991"),
     cst_ISO_8859_1=caml_string_of_jsbytes("ISO_8859-1"),
     cst_ISO_8859_1_1987=caml_string_of_jsbytes("ISO_8859-1:1987"),
     cst_L1=caml_string_of_jsbytes("L1"),
     cst_LATIN1=caml_string_of_jsbytes("LATIN1"),
     cst_US_ASCII=caml_string_of_jsbytes("US-ASCII"),
     cst_UTF_16=caml_string_of_jsbytes("UTF-16"),
     cst_UTF_16BE=caml_string_of_jsbytes("UTF-16BE"),
     cst_UTF_16LE=caml_string_of_jsbytes("UTF-16LE"),
     cst_UTF_8=caml_string_of_jsbytes("UTF-8"),
     cst_expected_Await_encode=
      caml_string_of_jsbytes("expected `Await encode"),
     Stdlib_Uchar=global_data.Stdlib__Uchar,
     Stdlib_Buffer=global_data.Stdlib__Buffer,
     Stdlib_Bytes=global_data.Stdlib__Bytes,
     Stdlib=global_data.Stdlib,
     Assert_failure=global_data.Assert_failure,
     Stdlib_String=global_data.Stdlib__String,
     Stdlib_Printf=global_data.Stdlib__Printf,
     Stdlib_Format=global_data.Stdlib__Format,
     _a_=Stdlib_Format[129],
     _B_=[0,caml_string_of_jsbytes("src/uutf.ml"),363,9],
     _u_=
      [0,
       [11,caml_string_of_jsbytes("`Await"),0],
       caml_string_of_jsbytes("`Await")],
     _v_=
      [0,[11,caml_string_of_jsbytes("`End"),0],caml_string_of_jsbytes("`End")],
     _w_=
      [0,
       [18,
        [1,[0,0,caml_string_of_jsbytes("")]],
        [11,caml_string_of_jsbytes("`Uchar U+"),[4,8,[0,2,4],0,[17,0,0]]]],
       caml_string_of_jsbytes("@[`Uchar U+%04X@]")],
     _x_=
      [0,
       [18,
        [1,[0,0,caml_string_of_jsbytes("")]],
        [11,caml_string_of_jsbytes("`Malformed ("),0]],
       caml_string_of_jsbytes("@[`Malformed (")],
     _y_=[0,[4,8,[0,2,2],0,0],caml_string_of_jsbytes("%02X")],
     _A_=[0,[12,32,[4,8,[0,2,2],0,0]],caml_string_of_jsbytes(" %02X")],
     _z_=[0,[12,41,[17,0,0]],caml_string_of_jsbytes(")@]")],
     _p_=[0,-211555818,3299808],
     _k_=[0,-211558048,3299808],
     _q_=[0,684370880,3299808],
     _o_=[0,684370880,427938126],
     _l_=[0,-211558048,427938126],
     _m_=[0,caml_string_of_jsbytes("src/uutf.ml"),153,55],
     _n_=[0,684370880,427938126],
     _r_=[0,caml_string_of_jsbytes("src/uutf.ml"),152,55],
     _s_=[0,caml_string_of_jsbytes("src/uutf.ml"),154,55],
     _t_=[0,684370880,3455931],
     _j_=[0,caml_string_of_jsbytes("src/uutf.ml"),120,9],
     _c_=[0,684370880],
     _d_=[0,-211555818],
     _e_=[0,-211558048],
     _f_=[0,143365725],
     _g_=[0,423112016],
     _h_=[0,338302576],
     _b_=
      [0,
       [11,
        caml_string_of_jsbytes("invalid bounds (index "),
        [4,0,0,0,[11,caml_string_of_jsbytes(", length "),[4,0,0,0,[12,41,0]]]]],
       caml_string_of_jsbytes("invalid bounds (index %d, length %d)")],
     _i_=
      [0,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       1,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       2,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       3,
       4,
       4,
       4,
       4,
       4,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0,
       0];
    function invalid_bounds(j,l)
     {var _aF_=caml_call3(Stdlib_Printf[4],_b_,j,l);
      return caml_call1(Stdlib[1],_aF_)}
    function unsafe_set_byte(s,j,byte$0)
     {runtime.caml_bytes_unsafe_set(s,j,byte$0);return 0}
    var
     u_bom=caml_call1(Stdlib_Uchar[9],65279),
     u_rep=caml_call1(Stdlib_Uchar[9],65533);
    function encoding_of_string(s)
     {var
       match=caml_call1(Stdlib_String[25],s),
       _aD_=caml_string_compare(match,cst_ISO646_US),
       switch$1=0;
      if(0 <= _aD_)
       {if(0 < _aD_)
         {var switch$0=caml_string_compare(match,cst_US);
          if(0 <= switch$0)
           {if(0 < switch$0 && caml_string_notequal(match,cst_US_ASCII))
             {if(! caml_string_notequal(match,cst_UTF_16))return _f_;
              if(! caml_string_notequal(match,cst_UTF_16BE))return _e_;
              if(! caml_string_notequal(match,cst_UTF_16LE))return _d_;
              if(! caml_string_notequal(match,cst_UTF_8))return _c_;
              switch$1 = 2}}
          else
           if(caml_string_notequal(match,cst_ISO_646_IRV_1991))
            if
             (caml_string_notequal(match,cst_ISO_8859_1)
              &&
              caml_string_notequal(match,cst_ISO_8859_1_1987)
              &&
              caml_string_notequal(match,cst_L1)
              &&
              caml_string_notequal(match,cst_LATIN1))
             switch$1 = 2;
            else
             switch$1 = 1}}
      else
       {var _aE_=caml_string_compare(match,cst_CSISOLATIN1);
        if(0 <= _aE_)
         if(0 < _aE_)
          {if(caml_string_notequal(match,cst_IBM367))
            if
             (caml_string_notequal(match,cst_IBM819)
              &&
              caml_string_notequal(match,cst_ISO_8859_1$0)
              &&
              caml_string_notequal(match,cst_ISO_IR_100))
             {if(caml_string_notequal(match,cst_ISO_IR_6))switch$1 = 2}
            else
             switch$1 = 1}
         else
          switch$1 = 1;
        else
         if
          (caml_string_notequal(match,cst_ANSI_X3_4_1968)
           &&
           caml_string_notequal(match,cst_ANSI_X3_4_1986)
           &&
           caml_string_notequal(match,cst_ASCII)
           &&
           caml_string_notequal(match,cst_CP367))
          if(caml_string_notequal(match,cst_CP819))
           {if(caml_string_notequal(match,cst_CSASCII))switch$1 = 2}
          else
           switch$1 = 1}
      switch(switch$1){case 2:return 0;case 0:return _g_;default:return _h_}}
    function encoding_to_string(param)
     {return 143365725 <= param
              ?423112016 <= param
                ?684370880 <= param?cst_UTF_8$0:cst_US_ASCII$0
                :338302576 <= param?cst_ISO_8859_1$1:cst_UTF_16$0
              :-211555818 <= param?cst_UTF_16LE$0:cst_UTF_16BE$0}
    function malformed(s,j,l)
     {return [0,659980059,caml_call3(Stdlib_Bytes[8],s,j,l)]}
    function malformed_pair(be,hi,s,j,l)
     {var bs1=caml_call3(Stdlib_Bytes[7],s,j,l),bs0=caml_create_bytes(2);
      if(be)var j1=1,j0=0;else var j1=0,j0=1;
      unsafe_set_byte(bs0,j0,hi >>> 8 | 0);
      unsafe_set_byte(bs0,j1,hi & 255);
      var _aC_=caml_call2(Stdlib_Bytes[14],bs0,bs1);
      return [0,659980059,caml_call1(Stdlib_Bytes[48],_aC_)]}
    var utf_8_len=_i_.slice();
    function r_utf_8(s,j,l)
     {function uchar(c){return [0,852405675,caml_call1(Stdlib_Uchar[9],c)]}
      var switcher=l - 1 | 0;
      if(3 < switcher >>> 0)throw [0,Assert_failure,_j_];
      switch(switcher)
       {case 0:return uchar(caml_bytes_unsafe_get(s,j));
        case 1:
         var
          b0=caml_bytes_unsafe_get(s,j),
          b1=caml_bytes_unsafe_get(s,j + 1 | 0);
         return 2 === (b1 >>> 6 | 0)
                 ?uchar((b0 & 31) << 6 | b1 & 63)
                 :malformed(s,j,l);
        case 2:
         var
          b0$0=caml_bytes_unsafe_get(s,j),
          b1$0=caml_bytes_unsafe_get(s,j + 1 | 0),
          b2=caml_bytes_unsafe_get(s,j + 2 | 0),
          c=(b0$0 & 15) << 12 | (b1$0 & 63) << 6 | b2 & 63;
         if(2 === (b2 >>> 6 | 0))
          {if(224 === b0$0)
            {if(160 <= b1$0 && ! (191 < b1$0))return uchar(c);
             return malformed(s,j,l)}
           if(237 === b0$0)
            {if(128 <= b1$0 && ! (159 < b1$0))return uchar(c);
             return malformed(s,j,l)}
           return 2 === (b1$0 >>> 6 | 0)?uchar(c):malformed(s,j,l)}
         return malformed(s,j,l);
        default:
         var
          b0$1=caml_bytes_unsafe_get(s,j),
          b1$1=caml_bytes_unsafe_get(s,j + 1 | 0),
          b2$0=caml_bytes_unsafe_get(s,j + 2 | 0),
          b3=caml_bytes_unsafe_get(s,j + 3 | 0),
          c$0=
           (b0$1 & 7)
           <<
           18
           |
           (b1$1 & 63)
           <<
           12
           |
           (b2$0 & 63)
           <<
           6
           |
           b3
           &
           63;
         if(2 === (b3 >>> 6 | 0) && 2 === (b2$0 >>> 6 | 0))
          {if(240 === b0$1)
            {if(144 <= b1$1 && ! (191 < b1$1))return uchar(c$0);
             return malformed(s,j,l)}
           if(244 === b0$1)
            {if(128 <= b1$1 && ! (143 < b1$1))return uchar(c$0);
             return malformed(s,j,l)}
           return 2 === (b1$1 >>> 6 | 0)?uchar(c$0):malformed(s,j,l)}
         return malformed(s,j,l)}}
    function r_utf_16(s,j0,j1)
     {var
       b0=caml_bytes_unsafe_get(s,j0),
       b1=caml_bytes_unsafe_get(s,j1),
       u=b0 << 8 | b1;
      if(55296 <= u && ! (57343 < u))
       return 56319 < u
               ?malformed(s,caml_call2(Stdlib[16],j0,j1),2)
               :[0,16161,u];
      return [0,852405675,caml_call1(Stdlib_Uchar[9],u)]}
    function r_utf_16_lo(hi,s,j0,j1)
     {var
       b0=caml_bytes_unsafe_get(s,j0),
       b1=caml_bytes_unsafe_get(s,j1),
       lo=b0 << 8 | b1;
      if(56320 <= lo && ! (57343 < lo))
       return [0,
               852405675,
               caml_call1
                (Stdlib_Uchar[9],((hi & 1023) << 10 | lo & 1023) + 65536 | 0)];
      return malformed_pair(j0 < j1?1:0,hi,s,caml_call2(Stdlib[16],j0,j1),2)}
    function r_encoding(s,j,l)
     {function some(i){return i < l?[0,caml_bytes_unsafe_get(s,j + i | 0)]:0}
      var match=some(0),match$0=some(1),match$1=some(2);
      if(match)
       {var _aB_=match[1],switch$0=0;
        if(240 <= _aB_)
         if(254 === _aB_)
          {if(match$0){if(255 === match$0[1])return _k_;switch$0 = 1}}
         else
          if(255 === _aB_)
           {if(match$0){if(254 === match$0[1])return _p_;switch$0 = 1}}
          else
           switch$0 = 1;
        else
         if(0 === _aB_)
          {if(match$0)
            {var p=match$0[1];
             if(0 < p)return [0,-211558048,[0,605782321,p]];
             switch$0 = 1}}
         else
          if(239 <= _aB_)
           {if(match$0)
             if(187 === match$0[1])
              {if(match$1 && 191 === match$1[1])return _q_}
             else
              switch$0 = 1}
          else
           switch$0 = 1;
        if(switch$0 && match$0 && 0 === match$0[1] && 0 < _aB_)
         return [0,-211555818,[0,605782321,_aB_]];
        if(0 === caml_check_bound(utf_8_len,_aB_)[1 + _aB_])
         {if(match$0)return _l_;
          if(match$1)throw [0,Assert_failure,_m_];
          return _n_}
        return _o_}
      if(match$0)throw [0,Assert_failure,_r_];
      if(match$1)throw [0,Assert_failure,_s_];
      return _t_}
    function pp_decode(ppf,param)
     {if(typeof param === "number")
       return 1006505782 <= param
               ?caml_call2(_a_,ppf,_u_)
               :caml_call2(_a_,ppf,_v_);
      if(852405675 <= param[1])
       {var u=param[2];
        return caml_call3(_a_,ppf,_w_,caml_call1(Stdlib_Uchar[10],u))}
      var bs=param[2],l=caml_ml_string_length(bs);
      caml_call2(_a_,ppf,_x_);
      if(0 < l)caml_call3(_a_,ppf,_y_,caml_string_get(bs,0));
      var _az_=l - 1 | 0,_ay_=1;
      if(! (_az_ < 1))
       {var i=_ay_;
        for(;;)
         {caml_call3(_a_,ppf,_A_,caml_string_get(bs,i));
          var _aA_=i + 1 | 0;
          if(_az_ !== i){var i=_aA_;continue}
          break}}
      return caml_call2(_a_,ppf,_z_)}
    function i_rem(d){return (d[7] - d[6] | 0) + 1 | 0}
    function eoi(d)
     {d[5] = Stdlib_Bytes[3];d[6] = 0;d[7] = Stdlib[20];return 0}
    function src(d,s,j,l)
     {if(0 <= j && 0 <= l && ! (caml_ml_bytes_length(s) < (j + l | 0)))
       return 0 === l?eoi(d):(d[5] = s,d[6] = j,d[7] = (j + l | 0) - 1 | 0,0);
      return invalid_bounds(j,l)}
    function refill(k,d)
     {var _ax_=d[1];
      if(typeof _ax_ === "number"){d[18] = k;return 1006505782}
      if(438511779 <= _ax_[1])
       {var
         ic=_ax_[2],
         rc=caml_call4(Stdlib[84],ic,d[5],0,caml_ml_bytes_length(d[5]));
        src(d,d[5],0,rc);
        return caml_call1(k,d)}
      eoi(d);
      return caml_call1(k,d)}
    function t_need(d,need){d[9] = 0;d[10] = need;return 0}
    function t_fill(k,d)
     {function blit(d,l)
       {caml_blit_bytes(d[5],d[6],d[8],d[9],l);
        d[6] = d[6] + l | 0;
        d[9] = d[9] + l | 0;
        return 0}
      var rem=i_rem(d);
      if(0 <= rem)
       {var need=d[10] - d[9] | 0;
        return rem < need
                ?(blit(d,rem),refill(function(_aw_){return t_fill(k,_aw_)},d))
                :(blit(d,need),caml_call1(k,d))}
      return caml_call1(k,d)}
    function ret(k,v,byte_count,d)
     {d[18] = k;d[15] = d[15] + byte_count | 0;return caml_call2(d[17],d,v)}
    function decode_us_ascii(d)
     {var rem=i_rem(d);
      if(0 < rem)
       {var j=d[6];
        d[6] = d[6] + 1 | 0;
        var
         _au_=d[5],
         b0=caml_bytes_unsafe_get(_au_,j),
         _at_=1,
         _av_=
          127 < b0
           ?malformed(_au_,j,1)
           :[0,852405675,caml_call1(Stdlib_Uchar[9],b0)];
        return ret(decode_us_ascii,_av_,_at_,d)}
      return 0 <= rem?refill(decode_us_ascii,d):3455931}
    function decode_iso_8859_1(d)
     {var rem=i_rem(d);
      if(0 < rem)
       {var j=d[6];
        d[6] = d[6] + 1 | 0;
        return ret
                (decode_iso_8859_1,
                 [0,
                  852405675,
                  caml_call1(Stdlib_Uchar[9],caml_bytes_unsafe_get(d[5],j))],
                 1,
                 d)}
      return 0 <= rem?refill(decode_iso_8859_1,d):3455931}
    function t_decode_utf_8(d)
     {if(d[9] < d[10])
       {var _ar_=d[9];return ret(decode_utf_8,malformed(d[8],0,d[9]),_ar_,d)}
      var _as_=d[9];
      return ret(decode_utf_8,r_utf_8(d[8],0,d[9]),_as_,d)}
    function decode_utf_8(d)
     {var rem=i_rem(d);
      if(0 < rem)
       {var need=utf_8_len[1 + caml_bytes_unsafe_get(d[5],d[6])];
        if(rem < need){t_need(d,need);return t_fill(t_decode_utf_8,d)}
        var j=d[6];
        return 0 === need
                ?(d[6]
                  =
                  d[6]
                  +
                  1
                  |
                  0,
                  ret(decode_utf_8,malformed(d[5],j,1),1,d))
                :(d[6]
                  =
                  d[6]
                  +
                  need
                  |
                  0,
                  ret(decode_utf_8,r_utf_8(d[5],j,need),need,d))}
      return 0 <= rem?refill(decode_utf_8,d):3455931}
    function t_decode_utf_16be_lo(hi,d)
     {var bcount=d[9] + 2 | 0;
      return d[9] < d[10]
              ?ret(decode_utf_16be,malformed_pair(1,hi,d[8],0,d[9]),bcount,d)
              :ret(decode_utf_16be,r_utf_16_lo(hi,d[8],0,1),bcount,d)}
    function decode_utf_16be_lo(v,d)
     {if(659980059 <= v[1])return ret(decode_utf_16be,v,2,d);
      var hi=v[2],rem=i_rem(d);
      if(2 <= rem)
       {var j=d[6];
        d[6] = d[6] + 2 | 0;
        return ret(decode_utf_16be,r_utf_16_lo(hi,d[5],j,j + 1 | 0),4,d)}
      t_need(d,2);
      return t_fill(function(_aq_){return t_decode_utf_16be_lo(hi,_aq_)},d)}
    function t_decode_utf_16be(d)
     {if(d[9] < d[10])
       {var _ap_=d[9];
        return ret(decode_utf_16be,malformed(d[8],0,d[9]),_ap_,d)}
      return decode_utf_16be_lo(r_utf_16(d[8],0,1),d)}
    function decode_utf_16be(d)
     {var rem=i_rem(d);
      if(0 < rem)
       {if(2 <= rem)
         {var j=d[6];
          d[6] = d[6] + 2 | 0;
          return decode_utf_16be_lo(r_utf_16(d[5],j,j + 1 | 0),d)}
        t_need(d,2);
        return t_fill(t_decode_utf_16be,d)}
      return 0 <= rem?refill(decode_utf_16be,d):3455931}
    function t_decode_utf_16_lo(hi,d)
     {var bcount=d[9] + 2 | 0;
      return d[9] < d[10]
              ?ret(decode_utf_16,malformed_pair(0,hi,d[8],0,d[9]),bcount,d)
              :ret(decode_utf_16,r_utf_16_lo(hi,d[8],1,0),bcount,d)}
    function decode_utf_16le_lo(v,d)
     {if(659980059 <= v[1])return ret(decode_utf_16,v,2,d);
      var hi=v[2],rem=i_rem(d);
      if(2 <= rem)
       {var j=d[6];
        d[6] = d[6] + 2 | 0;
        return ret(decode_utf_16,r_utf_16_lo(hi,d[5],j + 1 | 0,j),4,d)}
      t_need(d,2);
      return t_fill(function(_ao_){return t_decode_utf_16_lo(hi,_ao_)},d)}
    function t_decode_utf_16(d)
     {if(d[9] < d[10])
       {var _an_=d[9];return ret(decode_utf_16,malformed(d[8],0,d[9]),_an_,d)}
      return decode_utf_16le_lo(r_utf_16(d[8],1,0),d)}
    function decode_utf_16(d)
     {var rem=i_rem(d);
      if(0 < rem)
       {if(2 <= rem)
         {var j=d[6];
          d[6] = d[6] + 2 | 0;
          return decode_utf_16le_lo(r_utf_16(d[5],j + 1 | 0,j),d)}
        t_need(d,2);
        return t_fill(t_decode_utf_16,d)}
      return 0 <= rem?refill(decode_utf_16,d):3455931}
    function guessed_utf_16(d,be,v)
     {if(be)
       var
        j1=1,
        j0=0,
        t_decode_utf_16_lo$0=t_decode_utf_16be_lo,
        t_decode_utf_16$0=t_decode_utf_16be,
        decode_utf_16$0=decode_utf_16be;
      else
       var
        j1=0,
        j0=1,
        t_decode_utf_16_lo$0=t_decode_utf_16_lo,
        t_decode_utf_16$0=t_decode_utf_16,
        decode_utf_16$0=decode_utf_16;
      function b3(k,d)
       {return 3 <= d[9]
                ?(d[10]
                  =
                  2,
                  d[9]
                  =
                  1,
                  unsafe_set_byte(d[8],0,caml_bytes_unsafe_get(d[8],2)),
                  t_fill(k,d))
                :decode_utf_16$0(d)}
      if(typeof v === "number")
       {if(427938126 <= v)
         {var v$0=r_utf_16(d[8],j0,j1);
          if(659980059 <= v$0[1])
           {var _ad_=2;
            return ret
                    (function(_am_){return b3(t_decode_utf_16$0,_am_)},
                     v$0,
                     _ad_,
                     d)}
          var hi=v$0[2];
          if(3 <= d[9])
           return b3(function(_al_){return t_decode_utf_16_lo$0(hi,_al_)},d);
          var _ae_=d[9];
          return ret
                  (decode_utf_16$0,
                   malformed_pair(be,hi,Stdlib_Bytes[3],0,0),
                   _ae_,
                   d)}
        var _af_=2,_ag_=[0,852405675,u_bom];
        return ret
                (function(_ak_){return b3(t_decode_utf_16$0,_ak_)},
                 _ag_,
                 _af_,
                 d)}
      var u=v[2],_ah_=2,_ai_=[0,852405675,caml_call1(Stdlib_Uchar[9],u)];
      return ret
              (function(_aj_){return b3(t_decode_utf_16$0,_aj_)},_ai_,_ah_,d)}
    function k(d)
     {function setup(d)
       {var match=r_encoding(d[8],0,d[9]),_ac_=match[1];
        if(-211555818 === _ac_)
         {var r=match[2];
          d[2] = -211555818;
          d[18] = decode_utf_16;
          return guessed_utf_16(d,0,r)}
        if(684370880 <= _ac_)
         {var r$0=match[2];
          d[2] = 684370880;
          d[18] = decode_utf_8;
          if(3455931 === r$0)return 3455931;
          if(427938126 <= r$0)
           {var
             b3=
              function(d)
               {var
                 b3=caml_bytes_unsafe_get(d[8],2),
                 n=caml_check_bound(utf_8_len,b3)[1 + b3];
                return 0 === n
                        ?ret(decode_utf_8,malformed(d[8],2,1),1,d)
                        :(d[10]
                          =
                          n,
                          d[9]
                          =
                          1,
                          unsafe_set_byte(d[8],0,b3),
                          t_fill(t_decode_utf_8,d))},
             b2=
              function(d)
               {var
                 b2=caml_bytes_unsafe_get(d[8],1),
                 b3$0=2 < d[9]?b3:decode_utf_8,
                 n=caml_check_bound(utf_8_len,b2)[1 + b2];
                if(0 === n)return ret(b3$0,malformed(d[8],1,1),1,d);
                if(1 === n)return ret(b3$0,r_utf_8(d[8],1,1),1,d);
                d[10] = n;
                unsafe_set_byte(d[8],0,b2);
                if(3 <= d[9])
                 {d[9] = 2;
                  unsafe_set_byte(d[8],1,caml_bytes_unsafe_get(d[8],2))}
                else
                 d[9] = 1;
                return t_fill(t_decode_utf_8,d)},
             b1=caml_bytes_unsafe_get(d[8],0),
             b2$0=1 < d[9]?b2:decode_utf_8,
             n=caml_check_bound(utf_8_len,b1)[1 + b1];
            if(4 < n >>> 0)throw [0,Assert_failure,_B_];
            switch(n)
             {case 0:return ret(b2$0,malformed(d[8],0,1),1,d);
              case 1:return ret(b2$0,r_utf_8(d[8],0,1),1,d);
              case 2:
               return 2 <= d[9]
                       ?3 <= d[9]
                         ?ret(b3,r_utf_8(d[8],0,2),2,d)
                         :ret(decode_utf_8,r_utf_8(d[8],0,2),2,d)
                       :ret(decode_utf_8,malformed(d[8],0,1),1,d);
              case 3:
               if(3 <= d[9])return ret(decode_utf_8,r_utf_8(d[8],0,3),3,d);
               var _aa_=d[9];
               return ret(decode_utf_8,malformed(d[8],0,d[9]),_aa_,d);
              default:
               if(3 <= d[9]){d[10] = 4;return t_fill(t_decode_utf_8,d)}
               var _ab_=d[9];
               return ret(decode_utf_8,malformed(d[8],0,d[9]),_ab_,d)}}
          return ret(decode_utf_8,[0,852405675,u_bom],3,d)}
        var r$1=match[2];
        d[2] = -211558048;
        d[18] = decode_utf_16be;
        return guessed_utf_16(d,1,r$1)}
      t_need(d,3);
      return t_fill(setup,d)}
    function nline(d){d[14] = 0;d[13] = d[13] + 1 | 0;return 0}
    function ncol(d){d[14] = d[14] + 1 | 0;return 0}
    function ncount(d){d[16] = d[16] + 1 | 0;return 0}
    function cr(d,b){d[12] = b;return 0}
    function pp(d,v)
     {if(852405675 <= v[1])
       {var
         u=v[2],
         match=caml_call1(Stdlib_Uchar[10],u),
         _$_=match - 133 | 0,
         switch$0=0;
        if(8100 < _$_ >>> 0)
         {var switcher=_$_ + 123 | 0;
          if(! (3 < switcher >>> 0))
           switch(switcher)
            {case 0:
              var last_cr=d[12];
              cr(d,0);
              ncount(d);
              return last_cr?v:(nline(d),v);
             case 1:break;
             case 2:switch$0 = 1;break;
             default:cr(d,1);ncount(d);nline(d);return v}}
        else
         if(8097 < _$_ - 1 >>> 0)switch$0 = 1;
        return switch$0
                ?(cr(d,0),ncount(d),nline(d),v)
                :(cr(d,0),ncount(d),ncol(d),v)}
      cr(d,0);
      ncount(d);
      ncol(d);
      return v}
    function pp_nln_readline(d,v)
     {if(852405675 <= v[1])
       {var
         u=v[2],
         match=caml_call1(Stdlib_Uchar[10],u),
         ___=match - 133 | 0,
         switch$0=0;
        if(8100 < ___ >>> 0)
         {var switcher=___ + 123 | 0;
          if(! (3 < switcher >>> 0))
           switch(switcher)
            {case 0:
              var last_cr=d[12];
              cr(d,0);
              return last_cr
                      ?caml_call1(d[18],d)
                      :(ncount(d),nline(d),[0,852405675,d[4]]);
             case 1:break;
             case 2:switch$0 = 1;break;
             default:cr(d,1);ncount(d);nline(d);return [0,852405675,d[4]]}}
        else
         if(8097 < ___ - 1 >>> 0)switch$0 = 1;
        return switch$0
                ?(cr(d,0),ncount(d),nline(d),[0,852405675,d[4]])
                :(cr(d,0),ncount(d),ncol(d),v)}
      cr(d,0);
      ncount(d);
      ncol(d);
      return v}
    function pp_nln_nlf(d,v)
     {if(852405675 <= v[1])
       {var u=v[2],match=caml_call1(Stdlib_Uchar[10],u),switch$0=0;
        if(14 <= match)
         {if(8232 <= match)
           {if(! (8234 <= match))switch$0 = 1}
          else
           if(133 === match)
            {cr(d,0);ncount(d);nline(d);return [0,852405675,d[4]]}}
        else
         if(10 <= match)
          switch(match - 10 | 0)
           {case 0:
             var last_cr=d[12];
             cr(d,0);
             return last_cr
                     ?caml_call1(d[18],d)
                     :(ncount(d),nline(d),[0,852405675,d[4]]);
            case 1:break;
            case 2:switch$0 = 1;break;
            default:cr(d,1);ncount(d);nline(d);return [0,852405675,d[4]]}
        return switch$0
                ?(cr(d,0),ncount(d),nline(d),v)
                :(cr(d,0),ncount(d),ncol(d),v)}
      cr(d,0);
      ncount(d);
      ncol(d);
      return v}
    function pp_nln_ascii(d,v)
     {if(852405675 <= v[1])
       {var
         u=v[2],
         match=caml_call1(Stdlib_Uchar[10],u),
         _Z_=match - 133 | 0,
         switch$0=0;
        if(8100 < _Z_ >>> 0)
         {var switcher=_Z_ + 123 | 0;
          if(! (3 < switcher >>> 0))
           switch(switcher)
            {case 0:
              var last_cr=d[12];
              cr(d,0);
              return last_cr
                      ?caml_call1(d[18],d)
                      :(ncount(d),nline(d),[0,852405675,d[4]]);
             case 1:break;
             case 2:switch$0 = 1;break;
             default:cr(d,1);ncount(d);nline(d);return [0,852405675,d[4]]}}
        else
         if(8097 < _Z_ - 1 >>> 0)switch$0 = 1;
        return switch$0
                ?(cr(d,0),ncount(d),nline(d),v)
                :(cr(d,0),ncount(d),ncol(d),v)}
      cr(d,0);
      ncount(d);
      ncol(d);
      return v}
    function decode_fun(param)
     {return 143365725 <= param
              ?423112016 <= param
                ?684370880 <= param?decode_utf_8:decode_us_ascii
                :338302576 <= param?decode_iso_8859_1:decode_utf_16be
              :-211555818 <= param?decode_utf_16:decode_utf_16be}
    function decoder(nln,encoding,src)
     {if(nln)
       {var _X_=nln[1],_Y_=_X_[1];
        if(3895880 === _Y_)
         var nl=_X_[2],nl$0=nl,pp$0=pp_nln_nlf;
        else
         if(605782321 <= _Y_)
          var nl$1=_X_[2],nl$0=nl$1,pp$0=pp_nln_ascii;
         else
          var nl$2=_X_[2],nl$0=nl$2,pp$0=pp_nln_readline}
      else
       var nl$3=caml_call1(Stdlib_Uchar[9],10),nl$0=nl$3,pp$0=pp;
      if(encoding)
       var e=encoding[1],k$0=decode_fun(e),encoding$0=e;
      else
       var k$0=k,encoding$0=684370880;
      if(typeof src === "number")
       var i_max=0,i_pos=1,i=Stdlib_Bytes[3];
      else
       if(438511779 <= src[1])
        var i_max=0,i_pos=1,i=caml_create_bytes(65536);
       else
        var
         s=src[2],
         i_max$0=caml_ml_string_length(s) - 1 | 0,
         i$0=caml_call1(Stdlib_Bytes[49],s),
         i_max=i_max$0,
         i_pos=0,
         i=i$0;
      var utf16=143365725 === encoding$0?1:0;
      return [0,
              src,
              encoding$0,
              nln,
              nl$0,
              i,
              i_pos,
              i_max,
              caml_create_bytes(4),
              0,
              0,
              0,
              0,
              1,
              0,
              0,
              0,
              function(d,v)
               {if(852405675 <= v[1])
                 {var u=v[2],match=caml_call1(Stdlib_Uchar[10],u);
                  if(65279 === match)
                   {if(utf16){d[2] = -211558048;d[18] = decode_utf_16be}
                    d[11] = 1;
                    d[17] = pp$0;
                    return caml_call1(d[18],d)}
                  if(65534 === match && utf16)
                   {d[2] = -211555818;
                    d[18] = decode_utf_16;
                    d[11] = 1;
                    d[17] = pp$0;
                    return caml_call1(d[18],d)}
                  d[11] = 0;
                  d[17] = pp$0;
                  return caml_call2(d[17],d,v)}
                d[11] = 0;
                d[17] = pp$0;
                return caml_call2(d[17],d,v)},
              k$0]}
    function decode(d){return caml_call1(d[18],d)}
    function decoder_line(d){return d[13]}
    function decoder_col(d){return d[14]}
    function decoder_byte_count(d){return d[15]}
    function decoder_count(d){return d[16]}
    function decoder_removed_bom(d){return d[11]}
    function decoder_src(d){return d[1]}
    function decoder_nln(d){return d[3]}
    function decoder_encoding(d){return d[2]}
    function set_decoder_encoding(d,e)
     {d[2] = e;d[18] = decode_fun(e);return 0}
    function o_rem(e){return (e[5] - e[4] | 0) + 1 | 0}
    function dst(e,s,j,l)
     {var _U_=j < 0?1:0;
      if(_U_)
       var _V_=_U_;
      else
       var
        _W_=l < 0?1:0,
        _V_=_W_ || (caml_ml_bytes_length(s) < (j + l | 0)?1:0);
      if(_V_)invalid_bounds(j,l);
      e[3] = s;
      e[4] = j;
      e[5] = (j + l | 0) - 1 | 0;
      return 0}
    function flush(k,e)
     {var _T_=e[1];
      if(typeof _T_ === "number")
       {e[9]
        =
        function(e,param)
         {if(typeof param === "number" && 1006505782 <= param)
           return caml_call1(k,e);
          return caml_call1(Stdlib[1],cst_expected_Await_encode)};
        return 939392865}
      if(438511779 <= _T_[1])
       {var oc=_T_[2];
        caml_call4(Stdlib[68],oc,e[3],0,e[4]);
        e[4] = 0;
        return caml_call1(k,e)}
      var b=_T_[2],o=caml_call1(Stdlib_Bytes[48],e[3]);
      caml_call4(Stdlib_Buffer[18],b,o,0,e[4]);
      e[4] = 0;
      return caml_call1(k,e)}
    function t_range(e,max){e[7] = 0;e[8] = max;return 0}
    function t_flush(k,e)
     {function blit(e,l)
       {caml_blit_bytes(e[6],e[7],e[3],e[4],l);
        e[4] = e[4] + l | 0;
        e[7] = e[7] + l | 0;
        return 0}
      var rem=o_rem(e),len=(e[8] - e[7] | 0) + 1 | 0;
      return rem < len
              ?(blit(e,rem),flush(function(_S_){return t_flush(k,_S_)},e))
              :(blit(e,len),caml_call1(k,e))}
    function encode_utf_8(e,v)
     {function k(e){e[9] = encode_utf_8;return 17724}
      if(typeof v === "number")return 1006505782 <= v?k(e):flush(k,e);
      var u=v[2],u$0=caml_call1(Stdlib_Uchar[10],u),rem=o_rem(e);
      if(127 < u$0)
       {if(2047 < u$0)
         {if(65535 < u$0)
           {if(4 <= rem)
             {var j=e[4];e[4] = e[4] + 4 | 0;var k$0=k,j$0=j,s=e[3]}
            else
             {t_range(e,3);
              var
               _M_=function(_R_){return t_flush(k,_R_)},
               k$0=_M_,
               j$0=0,
               s=e[6]}
            unsafe_set_byte(s,j$0,240 | u$0 >>> 18 | 0);
            unsafe_set_byte(s,j$0 + 1 | 0,128 | (u$0 >>> 12 | 0) & 63);
            unsafe_set_byte(s,j$0 + 2 | 0,128 | (u$0 >>> 6 | 0) & 63);
            unsafe_set_byte(s,j$0 + 3 | 0,128 | u$0 & 63);
            return k$0(e)}
          if(3 <= rem)
           {var j$1=e[4];e[4] = e[4] + 3 | 0;var k$1=k,j$2=j$1,s$0=e[3]}
          else
           {t_range(e,2);
            var
             _N_=function(_Q_){return t_flush(k,_Q_)},
             k$1=_N_,
             j$2=0,
             s$0=e[6]}
          unsafe_set_byte(s$0,j$2,224 | u$0 >>> 12 | 0);
          unsafe_set_byte(s$0,j$2 + 1 | 0,128 | (u$0 >>> 6 | 0) & 63);
          unsafe_set_byte(s$0,j$2 + 2 | 0,128 | u$0 & 63);
          return k$1(e)}
        if(2 <= rem)
         {var j$3=e[4];e[4] = e[4] + 2 | 0;var k$2=k,j$4=j$3,s$1=e[3]}
        else
         {t_range(e,1);
          var _O_=function(_P_){return t_flush(k,_P_)},k$2=_O_,j$4=0,s$1=e[6]}
        unsafe_set_byte(s$1,j$4,192 | u$0 >>> 6 | 0);
        unsafe_set_byte(s$1,j$4 + 1 | 0,128 | u$0 & 63);
        return k$2(e)}
      return 1 <= rem
              ?(unsafe_set_byte(e[3],e[4],u$0),e[4] = e[4] + 1 | 0,k(e))
              :flush(function(e){return encode_utf_8(e,v)},e)}
    function encode_utf_16be(e,v)
     {function k(e){e[9] = encode_utf_16be;return 17724}
      if(typeof v === "number")return 1006505782 <= v?k(e):flush(k,e);
      var u=v[2],u$0=caml_call1(Stdlib_Uchar[10],u),rem=o_rem(e);
      if(65536 <= u$0)
       {if(4 <= rem)
         {var j=e[4];e[4] = e[4] + 4 | 0;var k$0=k,j$0=j,s=e[3]}
        else
         {t_range(e,3);
          var _I_=function(_L_){return t_flush(k,_L_)},k$0=_I_,j$0=0,s=e[6]}
        var
         u$1=u$0 - 65536 | 0,
         hi=55296 | u$1 >>> 10 | 0,
         lo=56320 | u$1 & 1023;
        unsafe_set_byte(s,j$0,hi >>> 8 | 0);
        unsafe_set_byte(s,j$0 + 1 | 0,hi & 255);
        unsafe_set_byte(s,j$0 + 2 | 0,lo >>> 8 | 0);
        unsafe_set_byte(s,j$0 + 3 | 0,lo & 255);
        return k$0(e)}
      if(2 <= rem)
       {var j$1=e[4];e[4] = e[4] + 2 | 0;var k$1=k,j$2=j$1,s$0=e[3]}
      else
       {t_range(e,1);
        var _J_=function(_K_){return t_flush(k,_K_)},k$1=_J_,j$2=0,s$0=e[6]}
      unsafe_set_byte(s$0,j$2,u$0 >>> 8 | 0);
      unsafe_set_byte(s$0,j$2 + 1 | 0,u$0 & 255);
      return k$1(e)}
    function encode_utf_16le(e,v)
     {function k(e){e[9] = encode_utf_16le;return 17724}
      if(typeof v === "number")return 1006505782 <= v?k(e):flush(k,e);
      var u=v[2],u$0=caml_call1(Stdlib_Uchar[10],u),rem=o_rem(e);
      if(65536 <= u$0)
       {if(4 <= rem)
         {var j=e[4];e[4] = e[4] + 4 | 0;var k$0=k,j$0=j,s=e[3]}
        else
         {t_range(e,3);
          var _E_=function(_H_){return t_flush(k,_H_)},k$0=_E_,j$0=0,s=e[6]}
        var
         u$1=u$0 - 65536 | 0,
         hi=55296 | u$1 >>> 10 | 0,
         lo=56320 | u$1 & 1023;
        unsafe_set_byte(s,j$0,hi & 255);
        unsafe_set_byte(s,j$0 + 1 | 0,hi >>> 8 | 0);
        unsafe_set_byte(s,j$0 + 2 | 0,lo & 255);
        unsafe_set_byte(s,j$0 + 3 | 0,lo >>> 8 | 0);
        return k$0(e)}
      if(2 <= rem)
       {var j$1=e[4];e[4] = e[4] + 2 | 0;var k$1=k,j$2=j$1,s$0=e[3]}
      else
       {t_range(e,1);
        var _F_=function(_G_){return t_flush(k,_G_)},k$1=_F_,j$2=0,s$0=e[6]}
      unsafe_set_byte(s$0,j$2,u$0 & 255);
      unsafe_set_byte(s$0,j$2 + 1 | 0,u$0 >>> 8 | 0);
      return k$1(e)}
    function encoder(encoding,dst)
     {if(typeof dst === "number")
       var o_max=0,o_pos=1,o=Stdlib_Bytes[3];
      else
       var o$0=caml_create_bytes(65536),o_max=65535,o_pos=0,o=o$0;
      var
       _D_=
        143365725 <= encoding
         ?684370880 <= encoding?encode_utf_8:encode_utf_16be
         :-211555818 <= encoding?encode_utf_16le:encode_utf_16be;
      return [0,dst,encoding,o,o_pos,o_max,caml_create_bytes(4),1,0,_D_]}
    function encode(e,v){return caml_call2(e[9],e,v)}
    function encoder_encoding(e){return e[2]}
    function encoder_dst(e){return e[1]}
    var Manual=[0,src,dst,o_rem];
    function encoding_guess(s)
     {var
       s$0=caml_call1(Stdlib_Bytes[49],s),
       match=
        r_encoding(s$0,0,caml_call2(Stdlib[17],caml_ml_bytes_length(s$0),3)),
       _C_=match[1];
      if(-211555818 === _C_)
       {var d=match[2];return [0,-211555818,3299808 === d?1:0]}
      if(684370880 <= _C_)
       {var d$0=match[2];return [0,684370880,3299808 === d$0?1:0]}
      var d$1=match[2];
      return [0,-211558048,3299808 === d$1?1:0]}
    function fold_utf_8(opt,len,f,acc,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(len)
       var l=len[1],len$0=l;
      else
       var len$0=caml_ml_string_length(s) - pos | 0;
      var
       last=(pos + len$0 | 0) - 1 | 0,
       s$0=caml_call1(Stdlib_Bytes[49],s),
       acc$0=acc,
       i=pos;
      for(;;)
       {if(last < i)return acc$0;
        var need=utf_8_len[1 + caml_bytes_unsafe_get(s$0,i)];
        if(0 === need)
         {var
           i$0=i + 1 | 0,
           acc$1=caml_call3(f,acc$0,i,malformed(s$0,i,1)),
           acc$0=acc$1,
           i=i$0;
          continue}
        var rem=(last - i | 0) + 1 | 0;
        if(rem < need)return caml_call3(f,acc$0,i,malformed(s$0,i,rem));
        var
         i$1=i + need | 0,
         acc$2=caml_call3(f,acc$0,i,r_utf_8(s$0,i,need)),
         acc$0=acc$2,
         i=i$1;
        continue}}
    function fold_utf_16be(opt,len,f,acc,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(len)
       var l=len[1],len$0=l;
      else
       var len$0=caml_ml_string_length(s) - pos | 0;
      var
       last=(pos + len$0 | 0) - 1 | 0,
       s$0=caml_call1(Stdlib_Bytes[49],s),
       acc$0=acc,
       i=pos;
      for(;;)
       {if(last < i)return acc$0;
        var rem=(last - i | 0) + 1 | 0;
        if(2 <= rem)
         {var v=r_utf_16(s$0,i,i + 1 | 0);
          if(659980059 <= v[1])
           {var i$0=i + 2 | 0,acc$1=caml_call3(f,acc$0,i,v),acc$0=acc$1,i=i$0;
            continue}
          var hi=v[2];
          if(4 <= rem)
           {var
             i$1=i + 4 | 0,
             acc$2=
              caml_call3(f,acc$0,i,r_utf_16_lo(hi,s$0,i + 2 | 0,i + 3 | 0)),
             acc$0=acc$2,
             i=i$1;
            continue}
          return caml_call3(f,acc$0,i,malformed(s$0,i,rem))}
        return caml_call3(f,acc$0,i,malformed(s$0,i,1))}}
    function fold_utf_16le(opt,len,f,acc,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(len)
       var l=len[1],len$0=l;
      else
       var len$0=caml_ml_string_length(s) - pos | 0;
      var
       last=(pos + len$0 | 0) - 1 | 0,
       s$0=caml_call1(Stdlib_Bytes[49],s),
       acc$0=acc,
       i=pos;
      for(;;)
       {if(last < i)return acc$0;
        var rem=(last - i | 0) + 1 | 0;
        if(2 <= rem)
         {var v=r_utf_16(s$0,i + 1 | 0,i);
          if(659980059 <= v[1])
           {var i$0=i + 2 | 0,acc$1=caml_call3(f,acc$0,i,v),acc$0=acc$1,i=i$0;
            continue}
          var hi=v[2];
          if(4 <= rem)
           {var
             i$1=i + 4 | 0,
             acc$2=
              caml_call3(f,acc$0,i,r_utf_16_lo(hi,s$0,i + 3 | 0,i + 2 | 0)),
             acc$0=acc$2,
             i=i$1;
            continue}
          return caml_call3(f,acc$0,i,malformed(s$0,i,rem))}
        return caml_call3(f,acc$0,i,malformed(s$0,i,1))}}
    var String=[0,encoding_guess,fold_utf_8,fold_utf_16be,fold_utf_16le];
    function add_utf_8(b,u)
     {var u$0=caml_call1(Stdlib_Uchar[10],u);
      function w(byte$0){return caml_call2(Stdlib_Buffer[12],b,byte$0)}
      return 127 < u$0
              ?2047 < u$0
                ?65535 < u$0
                  ?(w(240 | u$0 >>> 18 | 0),
                    w(128 | (u$0 >>> 12 | 0) & 63),
                    w(128 | (u$0 >>> 6 | 0) & 63),
                    w(128 | u$0 & 63))
                  :(w(224 | u$0 >>> 12 | 0),
                    w(128 | (u$0 >>> 6 | 0) & 63),
                    w(128 | u$0 & 63))
                :(w(192 | u$0 >>> 6 | 0),w(128 | u$0 & 63))
              :w(u$0)}
    function add_utf_16be(b,u)
     {var u$0=caml_call1(Stdlib_Uchar[10],u);
      function w(byte$0){return caml_call2(Stdlib_Buffer[12],b,byte$0)}
      if(65536 <= u$0)
       {var
         u$1=u$0 - 65536 | 0,
         hi=55296 | u$1 >>> 10 | 0,
         lo=56320 | u$1 & 1023;
        w(hi >>> 8 | 0);
        w(hi & 255);
        w(lo >>> 8 | 0);
        return w(lo & 255)}
      w(u$0 >>> 8 | 0);
      return w(u$0 & 255)}
    function add_utf_16le(b,u)
     {var u$0=caml_call1(Stdlib_Uchar[10],u);
      function w(byte$0){return caml_call2(Stdlib_Buffer[12],b,byte$0)}
      if(65536 <= u$0)
       {var
         u$1=u$0 - 65536 | 0,
         hi=55296 | u$1 >>> 10 | 0,
         lo=56320 | u$1 & 1023;
        w(hi & 255);
        w(hi >>> 8 | 0);
        w(lo & 255);
        return w(lo >>> 8 | 0)}
      w(u$0 & 255);
      return w(u$0 >>> 8 | 0)}
    var
     Buffer=[0,add_utf_8,add_utf_16be,add_utf_16le],
     Uutf=
      [0,
       u_bom,
       u_rep,
       encoding_of_string,
       encoding_to_string,
       decoder,
       decode,
       decoder_encoding,
       set_decoder_encoding,
       decoder_line,
       decoder_col,
       decoder_byte_count,
       decoder_count,
       decoder_removed_bom,
       decoder_src,
       decoder_nln,
       pp_decode,
       encoder,
       encode,
       encoder_encoding,
       encoder_dst,
       Manual,
       String,
       Buffer];
    runtime.caml_register_global(66,Uutf,"Uutf");
    return}
  (globalThis));


//# 1 "../.js/re/re.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_bytes_get=runtime.caml_bytes_get,
     caml_bytes_set=runtime.caml_bytes_set,
     caml_bytes_unsafe_set=runtime.caml_bytes_unsafe_set,
     caml_check_bound=runtime.caml_check_bound,
     caml_compare=runtime.caml_compare,
     caml_create_bytes=runtime.caml_create_bytes,
     caml_equal=runtime.caml_equal,
     caml_fresh_oo_id=runtime.caml_fresh_oo_id,
     caml_int_compare=runtime.caml_int_compare,
     caml_lessthan=runtime.caml_lessthan,
     caml_list_of_js_array=runtime.caml_list_of_js_array,
     caml_make_vect=runtime.caml_make_vect,
     caml_ml_string_length=runtime.caml_ml_string_length,
     caml_obj_tag=runtime.caml_obj_tag,
     caml_register_global=runtime.caml_register_global,
     caml_string_get=runtime.caml_string_get,
     caml_string_notequal=runtime.caml_string_notequal,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes,
     caml_trampoline=runtime.caml_trampoline,
     caml_trampoline_return=runtime.caml_trampoline_return,
     caml_wrap_exception=runtime.caml_wrap_exception;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    function caml_call5(f,a0,a1,a2,a3,a4)
     {return f.length == 5
              ?f(a0,a1,a2,a3,a4)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4])}
    function caml_call7(f,a0,a1,a2,a3,a4,a5,a6)
     {return f.length == 7
              ?f(a0,a1,a2,a3,a4,a5,a6)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5,a6])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_Re_cset_pick=caml_string_of_jsbytes("Re_cset.pick"),
     cany=[0,[0,0,255],0],
     cst_eps=caml_string_of_jsbytes("eps"),
     cst_cst=caml_string_of_jsbytes("cst"),
     cst_alt=caml_string_of_jsbytes("alt"),
     cst_seq=caml_string_of_jsbytes("seq"),
     cst_rep=caml_string_of_jsbytes("rep"),
     cst_mark=caml_string_of_jsbytes("mark"),
     cst_erase=caml_string_of_jsbytes("erase"),
     cst_before=caml_string_of_jsbytes("before"),
     cst_after=caml_string_of_jsbytes("after"),
     cst_pmark=caml_string_of_jsbytes("pmark"),
     partial=[17,0,0],
     partial$0=[12,41,[17,0,0]],
     cst_Non_greedy=caml_string_of_jsbytes("Non_greedy"),
     cst_Greedy=caml_string_of_jsbytes("Greedy"),
     cst_first=caml_string_of_jsbytes("first"),
     cst_short=caml_string_of_jsbytes("short"),
     cst_long=caml_string_of_jsbytes("long"),
     eps_expr=[0,0,0],
     cst_Group=caml_string_of_jsbytes("Group"),
     dummy_offset=[0,-1,-1],
     dummy_string=caml_string_of_jsbytes(""),
     cst_Beg_of_line=caml_string_of_jsbytes("Beg_of_line"),
     cst_End_of_line=caml_string_of_jsbytes("End_of_line"),
     cst_Beg_of_word=caml_string_of_jsbytes("Beg_of_word"),
     cst_End_of_word=caml_string_of_jsbytes("End_of_word"),
     cst_Not_bound=caml_string_of_jsbytes("Not_bound"),
     cst_Beg_of_str=caml_string_of_jsbytes("Beg_of_str"),
     cst_End_of_str=caml_string_of_jsbytes("End_of_str"),
     cst_Last_end_of_line=caml_string_of_jsbytes("Last_end_of_line"),
     cst_Start=caml_string_of_jsbytes("Start"),
     cst_Stop=caml_string_of_jsbytes("Stop"),
     cst_Set=caml_string_of_jsbytes("Set"),
     cst_Sequence=caml_string_of_jsbytes("Sequence"),
     cst_Alternative=caml_string_of_jsbytes("Alternative"),
     cst_Repeat=caml_string_of_jsbytes("Repeat"),
     cst_Sem=caml_string_of_jsbytes("Sem"),
     cst_Sem_greedy=caml_string_of_jsbytes("Sem_greedy"),
     cst_Group$0=caml_string_of_jsbytes("Group"),
     cst_No_group=caml_string_of_jsbytes("No_group"),
     cst_Nest=caml_string_of_jsbytes("Nest"),
     cst_Case=caml_string_of_jsbytes("Case"),
     cst_No_case=caml_string_of_jsbytes("No_case"),
     cst_Intersection=caml_string_of_jsbytes("Intersection"),
     cst_Complement=caml_string_of_jsbytes("Complement"),
     cst_Difference=caml_string_of_jsbytes("Difference"),
     cst_Pmark=caml_string_of_jsbytes("Pmark"),
     cst$1=caml_string_of_jsbytes(""),
     cst$2=caml_string_of_jsbytes(""),
     cst_Re_replace=caml_string_of_jsbytes("Re.replace"),
     cst_Re_replace$0=caml_string_of_jsbytes("Re.replace"),
     cst_Re_split=caml_string_of_jsbytes("Re.split"),
     cst_Re_split$0=caml_string_of_jsbytes("Re.split"),
     cst_Re_all=caml_string_of_jsbytes("Re.all"),
     cst_Re_all$0=caml_string_of_jsbytes("Re.all"),
     cst_Re_exec_partial=caml_string_of_jsbytes("Re.exec_partial"),
     cst_Re_execp=caml_string_of_jsbytes("Re.execp"),
     cst_Re_exec_opt=caml_string_of_jsbytes("Re.exec_opt"),
     cst_Re_exec=caml_string_of_jsbytes("Re.exec"),
     cst_Re_diff=caml_string_of_jsbytes("Re.diff"),
     cst_Re_compl=caml_string_of_jsbytes("Re.compl"),
     cst_Re_inter=caml_string_of_jsbytes("Re.inter"),
     cst_Re_repn=caml_string_of_jsbytes("Re.repn"),
     cst_Re_repn$0=caml_string_of_jsbytes("Re.repn"),
     cst$0=caml_string_of_jsbytes("\t "),
     cst_Re_Emacs_Parse_error=caml_string_of_jsbytes("Re__Emacs.Parse_error"),
     cst_Re_Emacs_Not_supported=
      caml_string_of_jsbytes("Re__Emacs.Not_supported"),
     cst_Str_replace_illegal_backsl=
      caml_string_of_jsbytes("Str.replace: illegal backslash sequence"),
     cst$5=caml_string_of_jsbytes(""),
     cst$4=caml_string_of_jsbytes(""),
     cst$3=caml_string_of_jsbytes(""),
     cst_Str_group_end=caml_string_of_jsbytes("Str.group_end"),
     cst_Str_group_beginning=caml_string_of_jsbytes("Str.group_beginning"),
     beg=[0,caml_string_of_jsbytes(""),0],
     cst$6=caml_string_of_jsbytes("/**"),
     cst_Re_Glob_Parse_error=caml_string_of_jsbytes("Re__Glob.Parse_error"),
     cst$7=caml_string_of_jsbytes(":]"),
     cst_lower=caml_string_of_jsbytes("lower"),
     cst_alnum=caml_string_of_jsbytes("alnum"),
     cst_alpha=caml_string_of_jsbytes("alpha"),
     cst_ascii=caml_string_of_jsbytes("ascii"),
     cst_blank=caml_string_of_jsbytes("blank"),
     cst_cntrl=caml_string_of_jsbytes("cntrl"),
     cst_digit=caml_string_of_jsbytes("digit"),
     cst_graph=caml_string_of_jsbytes("graph"),
     cst_print=caml_string_of_jsbytes("print"),
     cst_punct=caml_string_of_jsbytes("punct"),
     cst_space=caml_string_of_jsbytes("space"),
     cst_upper=caml_string_of_jsbytes("upper"),
     cst_word=caml_string_of_jsbytes("word"),
     cst_xdigit=caml_string_of_jsbytes("xdigit"),
     cst_Invalid_pcre_class=caml_string_of_jsbytes("Invalid pcre class: "),
     cst_Re_Perl_Parse_error=caml_string_of_jsbytes("Re__Perl.Parse_error"),
     cst_Re_Perl_Not_supported=
      caml_string_of_jsbytes("Re__Perl.Not_supported"),
     posix_class_strings=
      caml_list_of_js_array
       ([caml_string_of_jsbytes("alpha"),
         caml_string_of_jsbytes("alnum"),
         caml_string_of_jsbytes("ascii"),
         caml_string_of_jsbytes("blank"),
         caml_string_of_jsbytes("cntrl"),
         caml_string_of_jsbytes("digit"),
         caml_string_of_jsbytes("lower"),
         caml_string_of_jsbytes("print"),
         caml_string_of_jsbytes("space"),
         caml_string_of_jsbytes("upper"),
         caml_string_of_jsbytes("word"),
         caml_string_of_jsbytes("punct"),
         caml_string_of_jsbytes("graph"),
         caml_string_of_jsbytes("xdigit")]),
     cst_Re_Posix_Parse_error=caml_string_of_jsbytes("Re__Posix.Parse_error"),
     cst_Re_Posix_Not_supported=
      caml_string_of_jsbytes("Re__Posix.Not_supported"),
     include=global_data.Stdlib__Format,
     Stdlib_Buffer=global_data.Stdlib__Buffer,
     Stdlib=global_data.Stdlib,
     Assert_failure=global_data.Assert_failure,
     Stdlib_List=global_data.Stdlib__List,
     Stdlib_Map=global_data.Stdlib__Map,
     Stdlib_Set=global_data.Stdlib__Set,
     Stdlib_Array=global_data.Stdlib__Array,
     Stdlib_Hashtbl=global_data.Stdlib__Hashtbl,
     Stdlib_Char=global_data.Stdlib__Char,
     Stdlib_Bytes=global_data.Stdlib__Bytes,
     Stdlib_String=global_data.Stdlib__String,
     Stdlib_Seq=global_data.Stdlib__Seq,
     CamlinternalLazy=global_data.CamlinternalLazy,
     Re=[0];
    caml_register_global(138,Re,"Re__");
    var
     _bN_=
      [0,
       [12,59,[17,[0,caml_string_of_jsbytes("@ "),1,0],0]],
       caml_string_of_jsbytes(";@ ")],
     _bO_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<3>"),0],
          caml_string_of_jsbytes("<3>")]],
        [12,
         91,
         [17,
          [0,caml_string_of_jsbytes("@ "),1,0],
          [15,[17,[0,caml_string_of_jsbytes("@ "),1,0],[12,93,[17,0,0]]]]]]],
       caml_string_of_jsbytes("@[<3>[@ %a@ ]@]")],
     _bM_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _bL_=
      [0,
       [17,[0,caml_string_of_jsbytes("@ "),1,0],[4,0,0,0,0]],
       caml_string_of_jsbytes("@ %d")],
     _bK_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<3>"),0],
          caml_string_of_jsbytes("<3>")]],
        [12,
         40,
         [2,0,[17,[0,caml_string_of_jsbytes("@ "),1,0],[15,[12,41,[17,0,0]]]]]]],
       caml_string_of_jsbytes("@[<3>(%s@ %a)@]")],
     _bR_=[0,caml_string_of_jsbytes("lib/cset.ml"),153,9],
     _bP_=[0,[4,0,0,0,0],caml_string_of_jsbytes("%d")],
     _bQ_=[0,[4,0,0,0,[12,45,[4,0,0,0,0]]],caml_string_of_jsbytes("%d-%d")],
     _b5_=[0,caml_string_of_jsbytes("lib/automata.ml"),360,21],
     _bW_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<2>"),0],
          caml_string_of_jsbytes("<2>")]],
        [11,
         caml_string_of_jsbytes("(Seq"),
         [17,[0,caml_string_of_jsbytes("@ "),1,0],0]]],
       caml_string_of_jsbytes("@[<2>(Seq@ ")],
     _bX_=
      [0,
       [17,[0,caml_string_of_jsbytes("@ "),1,0],[15,[12,41,[17,0,0]]]],
       caml_string_of_jsbytes("@ %a)@]")],
     _bY_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<2>"),0],
          caml_string_of_jsbytes("<2>")]],
        [11,
         caml_string_of_jsbytes("(Exp"),
         [17,
          [0,caml_string_of_jsbytes("@ "),1,0],
          [4,
           0,
           0,
           0,
           [17,
            [0,caml_string_of_jsbytes("@ "),1,0],
            [12,
             40,
             [15,
              [12,
               41,
               [17,
                [0,caml_string_of_jsbytes("@ "),1,0],
                [11,caml_string_of_jsbytes("(eps))"),partial]]]]]]]]]],
       caml_string_of_jsbytes("@[<2>(Exp@ %d@ (%a)@ (eps))@]")],
     _bZ_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<2>"),0],
          caml_string_of_jsbytes("<2>")]],
        [11,
         caml_string_of_jsbytes("(Exp"),
         [17,
          [0,caml_string_of_jsbytes("@ "),1,0],
          [4,
           0,
           0,
           0,
           [17,
            [0,caml_string_of_jsbytes("@ "),1,0],
            [12,
             40,
             [15,
              [12,41,[17,[0,caml_string_of_jsbytes("@ "),1,0],[15,partial$0]]]]]]]]]],
       caml_string_of_jsbytes("@[<2>(Exp@ %d@ (%a)@ %a)@]")],
     _b0_=
      [0,
       [18,
        [1,
         [0,
          [11,caml_string_of_jsbytes("<2>"),0],
          caml_string_of_jsbytes("<2>")]],
        [11,
         caml_string_of_jsbytes("(Match"),
         [17,[0,caml_string_of_jsbytes("@ "),1,0],[15,[12,41,[17,0,0]]]]]],
       caml_string_of_jsbytes("@[<2>(Match@ %a)@]")],
     _b1_=
      [0,
       [17,
        [0,caml_string_of_jsbytes("@ "),1,0],
        [11,caml_string_of_jsbytes("| "),0]],
       caml_string_of_jsbytes("@ | ")],
     _b2_=[0,[11,caml_string_of_jsbytes("()"),0],caml_string_of_jsbytes("()")],
     _b3_=[0,0,0],
     _bV_=[1,0],
     _bU_=
      [0,
       [12,32,[4,0,0,0,[12,45,[4,0,0,0,0]]]],
       caml_string_of_jsbytes(" %d-%d")],
     _bT_=[0,[4,0,0,0,[12,45,[4,0,0,0,0]]],caml_string_of_jsbytes("%d-%d")],
     _b8_=
      [0,
       [18,
        [1,[0,0,caml_string_of_jsbytes("")]],
        [12,
         40,
         [2,
          0,
          [11,
           caml_string_of_jsbytes(" ("),
           [4,
            0,
            0,
            0,
            [12,32,[4,0,0,0,[11,caml_string_of_jsbytes("))"),[17,0,0]]]]]]]]],
       caml_string_of_jsbytes("@[(%s (%d %d))@]")],
     _b__=
      [0,
       [15,[17,[0,caml_string_of_jsbytes("@ "),1,0],[4,0,0,0,[15,0]]]],
       caml_string_of_jsbytes("%a@ %d%a")],
     _ce_=[0,caml_string_of_jsbytes("lib/core.ml"),690,4],
     _cB_=[0,caml_string_of_jsbytes("lib/core.ml"),1149,24],
     _cC_=[0,caml_string_of_jsbytes("lib/core.ml"),1160,27],
     _cg_=[0,1],
     _cf_=[0,caml_string_of_jsbytes("lib/core.ml"),723,13],
     _cd_=[0,caml_string_of_jsbytes("lib/core.ml"),493,35],
     _b9_=[0,0,0,0,0,0,0,0,0,0,0],
     _cc_=[0,170,[0,181,[0,186,[0,223,[0,255,0]]]]],
     _cJ_=[0,1],
     _cI_=[0,1],
     _cG_=[0,47,[0,92,0]],
     _cH_=[0,47,0],
     _cE_=[0,caml_string_of_jsbytes(""),0],
     _cF_=[0,caml_string_of_jsbytes(""),0],
     _cD_=[0,45],
     _cK_=[0,748194550,8],
     _cL_=[0,748194550,10],
     _cM_=[0,748194550,13],
     _cN_=[0,748194550,9],
     _cO_=[0,-1,-1];
    function equal(x,y){return x === y?1:0}
    var compare=caml_int_compare;
    function to_int(x){return x}
    var pp=include[19];
    function intersect(x,y){return 0 !== (x & y)?1:0}
    function symbol(x,y){return x | y}
    var
     dummy=-1,
     inexistant=1,
     letter=2,
     not_letter=4,
     newline=8,
     lastnewline=16,
     search_boundary=32;
    function from_char(param)
     {var switch$0=0;
      if(170 <= param)
       if(187 <= param)
        {var _jf_=param - 192 | 0;
         if(54 < _jf_ >>> 0)
          {if(56 <= _jf_)switch$0 = 1}
         else
          if(23 !== _jf_)switch$0 = 1}
       else
        {var _jg_=param - 171 | 0;
         if(14 < _jg_ >>> 0 || 10 === _jg_)switch$0 = 1}
      else
       if(65 <= param)
        {var _jh_=param - 91 | 0;
         if(5 < _jh_ >>> 0)
          {if(! (32 <= _jh_))switch$0 = 1}
         else
          if(4 === _jh_)switch$0 = 1}
       else
        if(48 <= param)
         {if(! (58 <= param))switch$0 = 1}
        else
         if(10 === param)return 12;
      return switch$0?letter:not_letter}
    var
     Re_Category=
      [0,
       symbol,
       from_char,
       dummy,
       inexistant,
       letter,
       not_letter,
       newline,
       lastnewline,
       search_boundary,
       to_int,
       equal,
       compare,
       intersect,
       pp];
    caml_register_global(140,Re_Category,"Re__Category");
    var
     _m_=include[13],
     _s_=include[19],
     _A_=include[27],
     _be_=include[123],
     _bk_=include[129],
     _a_=include[1],
     _b_=include[2],
     _c_=include[3],
     _d_=include[4],
     _e_=include[5],
     _f_=include[6],
     _g_=include[7],
     _h_=include[8],
     _i_=include[9],
     _j_=include[10],
     _k_=include[11],
     _l_=include[12],
     _n_=include[14],
     _o_=include[15],
     _p_=include[16],
     _q_=include[17],
     _r_=include[18],
     _t_=include[20],
     _u_=include[21],
     _v_=include[22],
     _w_=include[23],
     _x_=include[24],
     _y_=include[25],
     _z_=include[26],
     _B_=include[28],
     _C_=include[29],
     _D_=include[30],
     _E_=include[31],
     _F_=include[32],
     _G_=include[33],
     _H_=include[34],
     _I_=include[35],
     _J_=include[36],
     _K_=include[37],
     _L_=include[38],
     _M_=include[39],
     _N_=include[40],
     _O_=include[41],
     _P_=include[42],
     _Q_=include[43],
     _R_=include[44],
     _S_=include[45],
     _T_=include[46],
     _U_=include[47],
     _V_=include[48],
     _W_=include[49],
     _X_=include[50],
     _Y_=include[51],
     _Z_=include[52],
     ___=include[53],
     _$_=include[54],
     _aa_=include[55],
     _ab_=include[56],
     _ac_=include[57],
     _ad_=include[58],
     _ae_=include[59],
     _af_=include[60],
     _ag_=include[61],
     _ah_=include[62],
     _ai_=include[63],
     _aj_=include[64],
     _ak_=include[65],
     _al_=include[66],
     _am_=include[67],
     _an_=include[68],
     _ao_=include[69],
     _ap_=include[70],
     _aq_=include[71],
     _ar_=include[72],
     _as_=include[73],
     _at_=include[74],
     _au_=include[75],
     _av_=include[76],
     _aw_=include[77],
     _ax_=include[78],
     _ay_=include[79],
     _az_=include[80],
     _aA_=include[81],
     _aB_=include[82],
     _aC_=include[83],
     _aD_=include[84],
     _aE_=include[85],
     _aF_=include[86],
     _aG_=include[87],
     _aH_=include[88],
     _aI_=include[89],
     _aJ_=include[90],
     _aK_=include[91],
     _aL_=include[92],
     _aM_=include[93],
     _aN_=include[94],
     _aO_=include[95],
     _aP_=include[96],
     _aQ_=include[97],
     _aR_=include[98],
     _aS_=include[99],
     _aT_=include[100],
     _aU_=include[101],
     _aV_=include[102],
     _aW_=include[103],
     _aX_=include[104],
     _aY_=include[105],
     _aZ_=include[106],
     _a0_=include[107],
     _a1_=include[108],
     _a2_=include[109],
     _a3_=include[110],
     _a4_=include[111],
     _a5_=include[112],
     _a6_=include[113],
     _a7_=include[114],
     _a8_=include[115],
     _a9_=include[116],
     _a__=include[117],
     _a$_=include[118],
     _ba_=include[119],
     _bb_=include[120],
     _bc_=include[121],
     _bd_=include[122],
     _bf_=include[124],
     _bg_=include[125],
     _bh_=include[126],
     _bi_=include[127],
     _bj_=include[128],
     _bl_=include[130],
     _bm_=include[131],
     _bn_=include[132],
     _bo_=include[133],
     _bp_=include[134],
     _bq_=include[135],
     _br_=include[136],
     _bs_=include[137],
     _bt_=include[138],
     _bu_=include[139],
     _bv_=include[140],
     _bw_=include[141],
     _bx_=include[142],
     _by_=include[143],
     _bz_=include[144],
     _bA_=include[145],
     _bB_=include[146],
     _bC_=include[147],
     _bD_=include[148],
     _bE_=include[149],
     _bF_=include[150],
     _bG_=include[151],
     _bH_=include[152],
     _bI_=include[153],
     _bJ_=include[154];
    function sexp(fmt,s,pp,x){return caml_call5(_bk_,fmt,_bK_,s,pp,x)}
    function pair(pp1,pp2,fmt,param)
     {var v2=param[2],v1=param[1];
      caml_call2(pp1,fmt,v1);
      caml_call2(_A_,fmt,0);
      return caml_call2(pp2,fmt,v2)}
    function triple(pp1,pp2,pp3,fmt,param)
     {var v3=param[3],v2=param[2],v1=param[1];
      caml_call2(pp1,fmt,v1);
      caml_call2(_A_,fmt,0);
      caml_call2(pp2,fmt,v2);
      caml_call2(_A_,fmt,0);
      return caml_call2(pp3,fmt,v3)}
    function optint(fmt,param)
     {if(param){var i=param[1];return caml_call3(_bk_,fmt,_bL_,i)}return 0}
    function quote(fmt,s){return caml_call3(include[129],fmt,_bM_,s)}
    function pp_olist(pp_elem,fmt)
     {var
       _je_=
        caml_call2
         (_be_,
          [0,function(fmt,param){return caml_call2(_bk_,fmt,_bN_)}],
          pp_elem);
      return caml_call3(include[129],fmt,_bO_,_je_)}
    function pp_str_list(_jd_){return pp_olist(quote,_jd_)}
    function to_to_string(pp,x)
     {var b=caml_call1(Stdlib_Buffer[1],16),fmt=caml_call1(include[111],b);
      caml_call2(pp,fmt,x);
      return caml_call1(Stdlib_Buffer[2],b)}
    var
     Re_Fmt=
      [0,
       _a_,
       _b_,
       _c_,
       _d_,
       _e_,
       _f_,
       _g_,
       _h_,
       _i_,
       _j_,
       _k_,
       _l_,
       _m_,
       _n_,
       _o_,
       _p_,
       _q_,
       _r_,
       _s_,
       _t_,
       _u_,
       _v_,
       _w_,
       _x_,
       _y_,
       _z_,
       _A_,
       _B_,
       _C_,
       _D_,
       _E_,
       _F_,
       _G_,
       _H_,
       _I_,
       _J_,
       _K_,
       _L_,
       _M_,
       _N_,
       _O_,
       _P_,
       _Q_,
       _R_,
       _S_,
       _T_,
       _U_,
       _V_,
       _W_,
       _X_,
       _Y_,
       _Z_,
       ___,
       _$_,
       _aa_,
       _ab_,
       _ac_,
       _ad_,
       _ae_,
       _af_,
       _ag_,
       _ah_,
       _ai_,
       _aj_,
       _ak_,
       _al_,
       _am_,
       _an_,
       _ao_,
       _ap_,
       _aq_,
       _ar_,
       _as_,
       _at_,
       _au_,
       _av_,
       _aw_,
       _ax_,
       _ay_,
       _az_,
       _aA_,
       _aB_,
       _aC_,
       _aD_,
       _aE_,
       _aF_,
       _aG_,
       _aH_,
       _aI_,
       _aJ_,
       _aK_,
       _aL_,
       _aM_,
       _aN_,
       _aO_,
       _aP_,
       _aQ_,
       _aR_,
       _aS_,
       _aT_,
       _aU_,
       _aV_,
       _aW_,
       _aX_,
       _aY_,
       _aZ_,
       _a0_,
       _a1_,
       _a2_,
       _a3_,
       _a4_,
       _a5_,
       _a6_,
       _a7_,
       _a8_,
       _a9_,
       _a__,
       _a$_,
       _ba_,
       _bb_,
       _bc_,
       _bd_,
       _be_,
       _bf_,
       _bg_,
       _bh_,
       _bi_,
       _bj_,
       _bk_,
       _bl_,
       _bm_,
       _bn_,
       _bo_,
       _bp_,
       _bq_,
       _br_,
       _bs_,
       _bt_,
       _bu_,
       _bv_,
       _bw_,
       _bx_,
       _by_,
       _bz_,
       _bA_,
       _bB_,
       _bC_,
       _bD_,
       _bE_,
       _bF_,
       _bG_,
       _bH_,
       _bI_,
       _bJ_,
       _be_,
       _m_,
       sexp,
       pair,
       triple,
       _s_,
       optint,
       quote,
       pp_olist,
       pp_str_list,
       to_to_string];
    caml_register_global(142,Re_Fmt,"Re__Fmt");
    function union(l$0,l)
     {var l$2=l$0,l$1=l;
      for(;;)
       {if(l$1)
         {if(l$2)
           {var
             r=l$1[2],
             _jc_=l$1[1],
             c2=_jc_[2],
             c1=_jc_[1],
             r$0=l$2[2],
             match=l$2[1],
             c2$0=match[2],
             c1$0=match[1];
            if((c2$0 + 1 | 0) < c1)return [0,[0,c1$0,c2$0],union(r$0,l$1)];
            if((c2 + 1 | 0) < c1$0)return [0,[0,c1,c2],union(l$2,r)];
            if(c2$0 < c2)
             {var
               l$3=[0,[0,caml_call2(Stdlib[16],c1$0,c1),c2],r],
               l$2=r$0,
               l$1=l$3;
              continue}
            var
             l$4=[0,[0,caml_call2(Stdlib[16],c1$0,c1),c2$0],r$0],
             l$2=l$4,
             l$1=r;
            continue}
          return l$1}
        return l$2}}
    function inter(l$0,l)
     {var l$2=l$0,l$1=l;
      for(;;)
       {if(l$1)
         {if(l$2)
           {var
             r=l$1[2],
             _i$_=l$1[1],
             c2=_i$_[2],
             c1=_i$_[1],
             r$0=l$2[2],
             match=l$2[1],
             c2$0=match[2],
             c1$0=match[1];
            if(caml_lessthan(c2$0,c1)){var l$2=r$0;continue}
            if(caml_lessthan(c2,c1$0)){var l$1=r;continue}
            if(caml_lessthan(c2$0,c2))
             {var _ja_=inter(r$0,l$1);
              return [0,[0,caml_call2(Stdlib[17],c1$0,c1),c2$0],_ja_]}
            var _jb_=inter(l$2,r);
            return [0,[0,caml_call2(Stdlib[17],c1$0,c1),c2],_jb_]}
          return 0}
        return 0}}
    function diff(l$0,l)
     {var l$2=l$0,l$1=l;
      for(;;)
       {if(l$1)
         {if(l$2)
           {var
             r=l$1[2],
             _i__=l$1[1],
             c2=_i__[2],
             c1=_i__[1],
             r$0=l$2[2],
             match=l$2[1],
             c2$0=match[2],
             c1$0=match[1];
            if(c2$0 < c1)return [0,[0,c1$0,c2$0],diff(r$0,l$1)];
            if(c2 < c1$0){var l$1=r;continue}
            var r$1=c2 < c2$0?[0,[0,c2 + 1 | 0,c2$0],r$0]:r$0;
            if(c1$0 < c1)return [0,[0,c1$0,c1 - 1 | 0],diff(r$1,r)];
            var l$2=r$1,l$1=r;
            continue}
          return 0}
        return l$2}}
    function single(c){return [0,[0,c,c],0]}
    function add(c,l){return union(single(c),l)}
    function seq(c$0,c)
     {return runtime.caml_lessequal(c$0,c)?[0,[0,c$0,c],0]:[0,[0,c,c$0],0]}
    function offset(o,l)
     {if(l)
       {var r=l[2],match=l[1],c2=match[2],c1=match[1];
        return [0,[0,c1 + o | 0,c2 + o | 0],offset(o,r)]}
      return 0}
    var empty=0;
    function mem(c,s)
     {var s$0=s;
      for(;;)
       {if(s$0)
         {var rem=s$0[2],match=s$0[1],c2=match[2],c1=match[1];
          if(c <= c2)return c1 <= c?1:0;
          var s$0=rem;
          continue}
        return 0}}
    function hash_rec(param)
     {if(param)
       {var r=param[2],match=param[1],j=match[2],i=match[1];
        return (i + (13 * j | 0) | 0) + (257 * hash_rec(r) | 0) | 0}
      return 0}
    function hash(l){return hash_rec(l) & 1073741823}
    function print_one(ch,param)
     {var c2=param[2],c1=param[1];
      return c1 === c2
              ?caml_call3(include[129],ch,_bP_,c1)
              :caml_call4(include[129],ch,_bQ_,c1,c2)}
    var pp$0=caml_call2(_be_,0,print_one);
    function iter(t,f)
     {var t$0=t;
      for(;;)
       {if(t$0)
         {var xs=t$0[2],match=t$0[1],y=match[2],x=match[1];
          caml_call2(f,x,y);
          var t$0=xs;
          continue}
        return 0}}
    function one_char(param)
     {if(param && ! param[2])
       {var match=param[1],j=match[2],i=match[1];
        if(caml_equal(i,j))return [0,i]}
      return 0}
    function compare$0(param,_i9_)
     {var v=_i9_[2],j=_i9_[1],u=param[2],i=param[1],c=caml_compare(i,j);
      return 0 === c?caml_compare(u,v):c}
    var CSetMap=caml_call1(Stdlib_Map[1],[0,compare$0]);
    function fold_right(t,init,f){return caml_call3(Stdlib_List[26],f,t,init)}
    function csingle(c){return single(c)}
    function is_empty(param){return param?0:1}
    function prepend(s,x,l)
     {var s$0=s;
      for(;;)
       {if(s$0)
         {if(l)
           {var _i4_=l[1],_i5_=_i4_[1];
            if(_i5_ && ! _i5_[2])
             {var
               x$0=_i4_[2],
               _i6_=_i5_[1],
               d=_i6_[2],
               d$0=_i6_[1],
               r=s$0[2],
               match=s$0[1],
               c=match[2],
               c$0=match[1];
              if(c < d$0){var s$0=r;continue}
              var r$0=l[2];
              if(c$0 <= d$0)
               {if(c < d)
                 {var _i7_=prepend(r,x,[0,[0,[0,[0,c + 1 | 0,d],0],x$0],r$0]);
                  return [0,
                          [0,[0,[0,d$0,c],0],caml_call2(Stdlib[37],x,x$0)],
                          _i7_]}
                var _i8_=prepend(s$0,x,r$0);
                return [0,
                        [0,[0,[0,d$0,d],0],caml_call2(Stdlib[37],x,x$0)],
                        _i8_]}
              return d < c$0
                      ?[0,[0,[0,[0,d$0,d],0],x$0],prepend(s$0,x,r$0)]
                      :[0,
                        [0,[0,[0,d$0,c$0 - 1 | 0],0],x$0],
                        prepend(s$0,x,[0,[0,[0,[0,c$0,d],0],x$0],r$0])]}
            throw [0,Assert_failure,_bR_]}
          return 0}
        return l}}
    function pick(param)
     {if(param){var match=param[1],x=match[1];return x}
      return caml_call1(Stdlib[1],cst_Re_cset_pick)}
    var
     Re_Cset=
      [0,
       iter,
       union,
       inter,
       diff,
       offset,
       empty,
       single,
       seq,
       add,
       mem,
       hash,
       pp$0,
       one_char,
       fold_right,
       hash_rec,
       CSetMap,
       cany,
       csingle,
       is_empty,
       prepend,
       pick];
    caml_register_global(147,Re_Cset,"Re__Cset");
    function equal$0(x,y){return x === y?1:0}
    var compare$1=caml_int_compare,r=[0,0];
    function gen(param){r[1]++;return r[1]}
    var
     pp$1=include[19],
     Set=caml_call1(Stdlib_Set[1],[0,compare$1]),
     Re_Pmark=[0,equal$0,compare$1,gen,pp$1,Set];
    caml_register_global(149,Re_Pmark,"Re__Pmark");
    function hash_combine(h,accu){return (accu * 65599 | 0) + h | 0}
    var empty$0=[0,0,Set[1]];
    function merge_marks_offset(old,param)
     {if(param)
       {var
         rem=param[2],
         match=param[1],
         v=match[2],
         i=match[1],
         nw=merge_marks_offset(caml_call2(Stdlib_List[53],i,old),rem);
        return -2 === v?nw:[0,[0,i,v],nw]}
      return old}
    function merge(old,nw)
     {var _i3_=caml_call2(Set[7],old[2],nw[2]);
      return [0,merge_marks_offset(old[1],nw[1]),_i3_]}
    function hash$0(m,accu$1)
     {var
       accu$2=hash_combine(caml_call1(Stdlib_Hashtbl[28],m[2]),accu$1),
       l=m[1],
       accu=accu$2;
      for(;;)
       {if(l)
         {var
           r=l[2],
           match=l[1],
           i=match[2],
           a=match[1],
           accu$0=hash_combine(a,hash_combine(i,accu)),
           l=r,
           accu=accu$0;
          continue}
        return accu}}
    function _bS_(idx,marks)
     {if(marks)
       {var _i2_=marks[1];
        if(-1 === _i2_[2])
         {var rem=marks[2],a=_i2_[1];return [0,[0,a,idx],_bS_(idx,rem)]}}
      return marks}
    function marks_set_idx(marks,idx)
     {var _i1_=marks[2];return [0,_bS_(idx,marks[1]),_i1_]}
    function pp_marks(ch,t)
     {var _iZ_=t[1];
      if(_iZ_)
       {var r=_iZ_[2],match=_iZ_[1],i=match[2],a=match[1];
        caml_call4(include[129],ch,_bT_,a,i);
        var
         _i0_=
          function(param)
           {var i=param[2],a=param[1];
            return caml_call4(include[129],ch,_bU_,a,i)};
        return caml_call2(Stdlib_List[17],_i0_,r)}
      return 0}
    function pp_sem(ch,k)
     {var _iY_=-730718166 === k?cst_long:332064784 <= k?cst_first:cst_short;
      return caml_call2(include[13],ch,_iY_)}
    function pp_rep_kind(fmt,param)
     {return 620821490 <= param
              ?caml_call2(include[13],fmt,cst_Non_greedy)
              :caml_call2(include[13],fmt,cst_Greedy)}
    function pp$2(ch,e)
     {var _iO_=e[2];
      if(typeof _iO_ === "number")
       return caml_call2(_m_,ch,cst_eps);
      else
       switch(_iO_[0])
        {case 0:var l=_iO_[1];return sexp(ch,cst_cst,pp$0,l);
         case 1:
          var l$0=_iO_[1];return sexp(ch,cst_alt,caml_call2(_be_,0,pp$2),l$0);
         case 2:
          var e$0=_iO_[3],e$1=_iO_[2],k=_iO_[1],_iP_=[0,k,e$1,e$0];
          return sexp
                  (ch,
                   cst_seq,
                   function(_iW_,_iX_)
                    {return triple(pp_sem,pp$2,pp$2,_iW_,_iX_)},
                   _iP_);
         case 3:
          var e$2=_iO_[3],k$0=_iO_[2],_iQ_=[0,k$0,e$2];
          return sexp
                  (ch,
                   cst_rep,
                   function(_iU_,_iV_){return pair(pp_sem,pp$2,_iU_,_iV_)},
                   _iQ_);
         case 4:var i=_iO_[1];return sexp(ch,cst_mark,_s_,i);
         case 5:
          var e$3=_iO_[2],b=_iO_[1],_iR_=[0,b,e$3];
          return sexp
                  (ch,
                   cst_erase,
                   function(_iS_,_iT_){return pair(_s_,_s_,_iS_,_iT_)},
                   _iR_);
         case 6:var c=_iO_[1];return sexp(ch,cst_before,pp,c);
         case 7:var c$0=_iO_[1];return sexp(ch,cst_after,pp,c$0);
         default:var i$0=_iO_[1];return sexp(ch,cst_pmark,_s_,i$0)}}
    function first(f,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var r=param$0[2],x=param$0[1],res=caml_call1(f,x);
          if(res)return res;
          var param$0=r;
          continue}
        return 0}}
    function create_ids(param){return [0,0]}
    function mk_expr(ids,def){ids[1]++;return [0,ids[1],def]}
    function empty$1(ids){return mk_expr(ids,_bV_)}
    function cst(ids,s){return is_empty(s)?empty$1(ids):mk_expr(ids,[0,s])}
    function alt(ids,l)
     {if(l){if(l[2])return mk_expr(ids,[1,l]);var c=l[1];return c}
      return empty$1(ids)}
    function seq$0(ids,kind,x,y)
     {var _iM_=x[2],_iN_=y[2];
      if(typeof _iM_ !== "number" && 1 === _iM_[0] && ! _iM_[1])return x;
      if(typeof _iN_ !== "number" && 1 === _iN_[0] && ! _iN_[1])return y;
      if(typeof _iM_ === "number")return y;
      if(typeof _iN_ === "number" && 332064784 === kind)return x;
      return mk_expr(ids,[2,kind,x,y])}
    function is_eps(expr){return typeof expr[2] === "number"?1:0}
    function eps(ids){return mk_expr(ids,0)}
    function rep(ids,kind,sem,x){return mk_expr(ids,[3,kind,sem,x])}
    function mark(ids,m){return mk_expr(ids,[4,m])}
    function pmark(ids,i){return mk_expr(ids,[8,i])}
    function erase(ids,m$0,m){return mk_expr(ids,[5,m$0,m])}
    function before(ids,c){return mk_expr(ids,[6,c])}
    function after(ids,c){return mk_expr(ids,[7,c])}
    function rename(ids,x)
     {var _iI_=x[2];
      if(typeof _iI_ !== "number")
       switch(_iI_[0])
        {case 1:
          var l=_iI_[1],_iJ_=function(_iL_){return rename(ids,_iL_)};
          return mk_expr(ids,[1,caml_call2(Stdlib_List[19],_iJ_,l)]);
         case 2:
          var z=_iI_[3],y=_iI_[2],k=_iI_[1],_iK_=rename(ids,z);
          return mk_expr(ids,[2,k,rename(ids,y),_iK_]);
         case 3:
          var y$0=_iI_[3],k$0=_iI_[2],g=_iI_[1];
          return mk_expr(ids,[3,g,k$0,rename(ids,y$0)])
         }
      return mk_expr(ids,x[2])}
    function equal$1(l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {var _ip_=l1$0[1];
          switch(_ip_[0])
           {case 0:
             if(l2$0)
              {var _iq_=l2$0[1],_ir_=l1$0[2],_is_=_ip_[2],_it_=_ip_[1];
               if(0 === _iq_[0])
                {var
                  r2=l2$0[2],
                  e2=_iq_[2],
                  l2$1=_iq_[1],
                  _iu_=_is_[1] === e2[1]?1:0;
                 if(_iu_)
                  {var _iv_=equal$1(_it_,l2$1);
                   if(_iv_){var l1$0=_ir_,l2$0=r2;continue}
                   var _iw_=_iv_}
                 else
                  var _iw_=_iu_;
                 return _iw_}}
             break;
            case 1:
             if(l2$0)
              {var _ix_=l2$0[1],_iy_=l1$0[2],_iz_=_ip_[2],_iA_=_ip_[1];
               if(1 === _ix_[0])
                {var
                  r2$0=l2$0[2],
                  e2$0=_ix_[2],
                  marks2=_ix_[1],
                  _iB_=_iz_[1] === e2$0[1]?1:0;
                 if(_iB_)
                  {var _iC_=caml_equal(_iA_,marks2);
                   if(_iC_){var l1$0=_iy_,l2$0=r2$0;continue}
                   var _iD_=_iC_}
                 else
                  var _iD_=_iB_;
                 return _iD_}}
             break;
            default:
             if(l2$0)
              {var _iE_=l2$0[1],_iF_=l1$0[2],_iG_=_ip_[1];
               if(2 === _iE_[0])
                {var
                  r2$1=l2$0[2],
                  marks2$0=_iE_[1],
                  _iH_=caml_equal(_iG_,marks2$0);
                 if(_iH_){var l1$0=_iF_,l2$0=r2$1;continue}
                 return _iH_}}}}
        else
         if(! l2$0)return 1;
        return 0}}
    function hash$1(l,accu)
     {var l$0=l,accu$0=accu;
      for(;;)
       {if(l$0)
         {var _im_=l$0[1];
          switch(_im_[0])
           {case 0:
             var
              r=l$0[2],
              e=_im_[2],
              l$1=_im_[1],
              _in_=hash$1(l$1,accu$0),
              accu$1=hash_combine(388635598,hash_combine(e[1],_in_)),
              l$0=r,
              accu$0=accu$1;
             continue;
            case 1:
             var
              r$0=l$0[2],
              e$0=_im_[2],
              marks=_im_[1],
              _io_=hash$0(marks,accu$0),
              accu$2=hash_combine(726404471,hash_combine(e$0[1],_io_)),
              l$0=r$0,
              accu$0=accu$2;
             continue;
            default:
             var
              r$1=l$0[2],
              marks$0=_im_[1],
              accu$3=hash_combine(471882453,hash$0(marks$0,accu$0)),
              l$0=r$1,
              accu$0=accu$3;
             continue}}
        return accu$0}}
    function tseq(kind,x,y,rem)
     {if(x)
       {var _il_=x[1];
        if(1 === _il_[0] && typeof _il_[2][2] === "number" && ! x[2])
         {var marks=_il_[1];return [0,[1,marks,y],rem]}
        return [0,[0,x,y,kind],rem]}
      return rem}
    function print_state_lst(ch,l,y)
     {if(l)
       {var rem=l[2],e=l[1];
        print_state_rec(ch,e,y);
        var
         _ik_=
          function(e)
           {caml_call2(include[129],ch,_b1_);return print_state_rec(ch,e,y)};
        return caml_call2(Stdlib_List[17],_ik_,rem)}
      return caml_call2(include[129],ch,_b2_)}
    function print_state_rec(ch,e,y)
     {switch(e[0])
       {case 0:
         var x=e[2],l=e[1];
         caml_call2(include[129],ch,_bW_);
         print_state_lst(ch,l,x);
         return caml_call4(include[129],ch,_bX_,pp$2,x);
        case 1:
         var _ij_=e[1];
         if(typeof e[2][2] === "number")
          return caml_call5(include[129],ch,_bY_,y[1],pp_marks,_ij_);
         var x$0=e[2];
         return caml_call7(include[129],ch,_bZ_,x$0[1],pp_marks,_ij_,pp$2,x$0);
        default:
         var marks=e[1];return caml_call4(include[129],ch,_b0_,pp_marks,marks)}}
    function pp$3(ch,t){return print_state_lst(ch,[0,t,0],_b3_)}
    var dummy$0=[0,-1,dummy,0,0,-1];
    function mk(idx,cat,desc)
     {return [0,
              idx,
              cat,
              desc,
              0,
              hash$1(desc,hash_combine(idx,hash_combine(cat,0))) & 1073741823]}
    function create(cat,e){return mk(0,cat,[0,[1,empty$0,e],0])}
    function equal$2(x,y)
     {var _if_=x[5] === y[5]?1:0;
      if(_if_)
       {var _ig_=x[1] === y[1]?1:0;
        if(_ig_)
         {var _ih_=x[2] === y[2]?1:0;
          if(_ih_)return equal$1(x[3],y[3]);
          var _ii_=_ih_}
        else
         var _ii_=_ig_}
      else
       var _ii_=_if_;
      return _ii_}
    function hash$2(t){return t[5]}
    var Table=caml_call1(Stdlib_Hashtbl[26],[0,equal$2,hash$2]);
    function create_working_area(param){return [0,[0,0]]}
    function index_count(w){return w[1].length - 1}
    function mark_used_indices(tbl)
     {function _ia_(param)
       {if(0 === param[0])
         {var l=param[1];return caml_call1(mark_used_indices(tbl),l)}
        var marks=param[1],_ib_=marks[1];
        function _ic_(param)
         {var
           i=param[2],
           _id_=0 <= i?1:0,
           _ie_=_id_?(caml_check_bound(tbl,i)[1 + i] = 1,0):_id_;
          return _ie_}
        return caml_call2(Stdlib_List[17],_ic_,_ib_)}
      return caml_call1(Stdlib_List[17],_ia_)}
    function free_index(tbl_ref,l)
     {var tbl=tbl_ref[1];
      caml_call4(Stdlib_Array[9],tbl,0,tbl.length - 1,0);
      caml_call1(mark_used_indices(tbl),l);
      var len=tbl.length - 1,idx=0;
      for(;;)
       {if(idx !== len && caml_check_bound(tbl,idx)[1 + idx])
         {var idx$0=idx + 1 | 0,idx=idx$0;continue}
        if(idx === len)tbl_ref[1] = caml_make_vect(2 * len | 0,0);
        return idx}}
    function _b4_(param){return 2 === param[0]?0:1}
    var remove_matches=caml_call1(Stdlib_List[41],_b4_);
    function split_at_match(l$1)
     {var l=0,param=l$1;
      for(;;)
       {if(param)
         {var _h__=param[1];
          if(2 === _h__[0])
           {var r=param[2],_h$_=caml_call1(remove_matches,r);
            return [0,caml_call1(Stdlib_List[9],l),_h$_]}
          var param$0=param[2],l$0=[0,_h__,l],l=l$0,param=param$0;
          continue}
        throw [0,Assert_failure,_b5_]}}
    function remove_duplicates(prev,l,y)
     {var l$0=l;
      for(;;)
       {if(l$0)
         {var _h9_=l$0[1];
          switch(_h9_[0])
           {case 0:
             var
              r=l$0[2],
              kind=_h9_[3],
              x=_h9_[2],
              l$1=_h9_[1],
              match=remove_duplicates(prev,l$1,x),
              prev$0=match[2],
              l$2=match[1],
              match$0=remove_duplicates(prev$0,r,y),
              prev$1=match$0[2],
              r$0=match$0[1];
             return [0,tseq(kind,l$2,x,r$0),prev$1];
            case 1:
             if(typeof _h9_[2][2] === "number")
              {var r$1=l$0[2];
               if(caml_call2(Stdlib_List[37],y[1],prev)){var l$0=r$1;continue}
               var
                match$1=remove_duplicates([0,y[1],prev],r$1,y),
                prev$2=match$1[2],
                r$2=match$1[1];
               return [0,[0,_h9_,r$2],prev$2]}
             var r$3=l$0[2],x$0=_h9_[2];
             if(caml_call2(Stdlib_List[37],x$0[1],prev)){var l$0=r$3;continue}
             var
              match$2=remove_duplicates([0,x$0[1],prev],r$3,y),
              prev$3=match$2[2],
              r$4=match$2[1];
             return [0,[0,_h9_,r$4],prev$3];
            default:return [0,[0,_h9_,0],prev]}}
        return [0,0,prev]}}
    function set_idx(idx,param)
     {if(param)
       {var _h5_=param[1];
        switch(_h5_[0])
         {case 0:
           var
            r=param[2],
            kind=_h5_[3],
            x=_h5_[2],
            l=_h5_[1],
            _h6_=set_idx(idx,r);
           return [0,[0,set_idx(idx,l),x,kind],_h6_];
          case 1:
           var r$0=param[2],x$0=_h5_[2],marks=_h5_[1],_h7_=set_idx(idx,r$0);
           return [0,[1,marks_set_idx(marks,idx),x$0],_h7_];
          default:
           var r$1=param[2],marks$0=_h5_[1],_h8_=set_idx(idx,r$1);
           return [0,[2,marks_set_idx(marks$0,idx)],_h8_]}}
      return 0}
    function filter_marks(b,e,marks)
     {var _h0_=marks[2],_h1_=marks[1];
      function _h2_(param)
       {var i=param[1],_h3_=i < b?1:0,_h4_=_h3_ || (e < i?1:0);return _h4_}
      return [0,caml_call2(Stdlib_List[41],_h2_,_h1_),_h0_]}
    function delta_1$0(counter,init,c,next_cat,prev_cat,x,rem)
     {var _hX_=x[2];
      if(typeof _hX_ === "number")
       return [0,[2,init],rem];
      else
       switch(_hX_[0])
        {case 0:var s=_hX_[1];return mem(c,s)?[0,[1,init,eps_expr],rem]:rem;
         case 1:
          var l=_hX_[1];
          if(counter < 50)
           {var counter$1=counter + 1 | 0;
            return delta_2$0(counter$1,init,c,next_cat,prev_cat,l,rem)}
          return caml_trampoline_return
                  (delta_2$0,[0,init,c,next_cat,prev_cat,l,rem]);
         case 2:
          var
           z=_hX_[3],
           y=_hX_[2],
           kind=_hX_[1],
           y$0=delta_1(init,c,next_cat,prev_cat,y,0);
          if(counter < 50)
           {var counter$0=counter + 1 | 0;
            return delta_seq$0(counter$0,c,next_cat,prev_cat,kind,y$0,z,rem)}
          return caml_trampoline_return
                  (delta_seq$0,[0,c,next_cat,prev_cat,kind,y$0,z,rem]);
         case 3:
          var
           y$1=_hX_[3],
           kind$0=_hX_[2],
           rep_kind=_hX_[1],
           y$2=delta_1(init,c,next_cat,prev_cat,y$1,0),
           match=
            first
             (function(param)
               {if(2 === param[0]){var marks=param[1];return [0,marks]}
                return 0},
              y$2);
          if(match)
           var
            marks=match[1],
            marks$0=marks,
            y$3=caml_call1(remove_matches,y$2);
          else
           var marks$0=init,y$3=y$2;
          return 620821490 <= rep_kind
                  ?[0,[2,init],tseq(kind$0,y$3,x,rem)]
                  :tseq(kind$0,y$3,x,[0,[2,marks$0],rem]);
         case 4:
          var
           i=_hX_[1],
           _hY_=init[2],
           marks$1=[0,[0,[0,i,-1],caml_call2(Stdlib_List[53],i,init[1])],_hY_];
          return [0,[2,marks$1],rem];
         case 5:
          var e=_hX_[2],b=_hX_[1];return [0,[2,filter_marks(b,e,init)],rem];
         case 6:
          var cat=_hX_[1];return intersect(next_cat,cat)?[0,[2,init],rem]:rem;
         case 7:
          var cat$0=_hX_[1];
          return intersect(prev_cat,cat$0)?[0,[2,init],rem]:rem;
         default:
          var
           i$0=_hX_[1],
           _hZ_=caml_call2(Set[4],i$0,init[2]),
           marks$2=[0,init[1],_hZ_];
          return [0,[2,marks$2],rem]}}
    function delta_2$0(counter,marks,c,next_cat,prev_cat,l,rem)
     {if(l)
       {var r=l[2],y=l[1],_hW_=delta_2(marks,c,next_cat,prev_cat,r,rem);
        if(counter < 50)
         {var counter$0=counter + 1 | 0;
          return delta_1$0(counter$0,marks,c,next_cat,prev_cat,y,_hW_)}
        return caml_trampoline_return
                (delta_1$0,[0,marks,c,next_cat,prev_cat,y,_hW_])}
      return rem}
    function delta_seq$0(counter,c,next_cat,prev_cat,kind,y,z,rem)
     {var
       match=
        first
         (function(param)
           {if(2 === param[0]){var marks=param[1];return [0,marks]}return 0},
          y);
      if(match)
       {var marks=match[1];
        if(-730718166 === kind)
         {var _hU_=delta_1(marks,c,next_cat,prev_cat,z,rem);
          return tseq(kind,caml_call1(remove_matches,y),z,_hU_)}
        if(332064784 <= kind)
         {var match$0=split_at_match(y),y$0=match$0[2],y$1=match$0[1];
          return tseq
                  (kind,
                   y$1,
                   z,
                   delta_1(marks,c,next_cat,prev_cat,z,tseq(kind,y$0,z,rem)))}
        var _hV_=tseq(kind,caml_call1(remove_matches,y),z,rem);
        if(counter < 50)
         {var counter$0=counter + 1 | 0;
          return delta_1$0(counter$0,marks,c,next_cat,prev_cat,z,_hV_)}
        return caml_trampoline_return
                (delta_1$0,[0,marks,c,next_cat,prev_cat,z,_hV_])}
      return tseq(kind,y,z,rem)}
    function delta_1(init,c,next_cat,prev_cat,x,rem)
     {return caml_trampoline(delta_1$0(0,init,c,next_cat,prev_cat,x,rem))}
    function delta_2(marks,c,next_cat,prev_cat,l,rem)
     {return caml_trampoline(delta_2$0(0,marks,c,next_cat,prev_cat,l,rem))}
    function delta_seq(c,next_cat,prev_cat,kind,y,z,rem)
     {return caml_trampoline(delta_seq$0(0,c,next_cat,prev_cat,kind,y,z,rem))}
    function delta_4(c,next_cat,prev_cat,l,rem)
     {if(l)
       {var r=l[2],y$1=l[1],rem$0=delta_4(c,next_cat,prev_cat,r,rem);
        switch(y$1[0])
         {case 0:
           var
            kind=y$1[3],
            z=y$1[2],
            y=y$1[1],
            y$0=delta_4(c,next_cat,prev_cat,y,0);
           return delta_seq(c,next_cat,prev_cat,kind,y$0,z,rem$0);
          case 1:
           var e=y$1[2],marks=y$1[1];
           return delta_1(marks,c,next_cat,prev_cat,e,rem$0);
          default:return [0,y$1,rem$0]}}
      return rem}
    function delta(tbl_ref,next_cat,char$0,st)
     {var
       prev_cat=st[2],
       match=
        remove_duplicates
         (0,delta_4(char$0,next_cat,prev_cat,st[3],0),eps_expr),
       expr=match[1],
       idx=free_index(tbl_ref,expr),
       expr$0=set_idx(idx,expr);
      return mk(idx,next_cat,expr$0)}
    function red_tr(l)
     {var l$0=l;
      for(;;)
       {if(l$0)
         {var _hT_=l$0[2];
          if(_hT_)
           {var
             rem=_hT_[2],
             tr2=_hT_[1],
             st2=tr2[2],
             s2=tr2[1],
             tr1=l$0[1],
             st1=tr1[2],
             s1=tr1[1];
            if(equal$2(st1,st2))
             {var l$1=[0,[0,union(s1,s2),st1],rem],l$0=l$1;continue}
            return [0,tr1,red_tr([0,tr2,rem])]}}
        return l$0}}
    function _b6_(param,l){var x=param[2],s=param[1];return prepend(s,x,l)}
    var prepend_deriv=caml_call1(Stdlib_List[26],_b6_);
    function restrict(s,param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var
           rem=param$0[2],
           match=param$0[1],
           x=match[2],
           s$0=match[1],
           s$1=inter(s,s$0);
          if(is_empty(s$1)){var param$0=rem;continue}
          return [0,[0,s$1,x],restrict(s,rem)]}
        return 0}}
    function prepend_marks_expr_lst(m,l)
     {function _hS_(param)
       {switch(param[0])
         {case 0:
           var s=param[3],e=param[2],l=param[1];
           return [0,prepend_marks_expr_lst(m,l),e,s];
          case 1:var e$0=param[2],m$0=param[1];return [1,merge(m,m$0),e$0];
          default:var m$1=param[1];return [2,merge(m,m$1)]}}
      return caml_call2(Stdlib_List[19],_hS_,l)}
    function deriv_seq(all_chars,categories,cat,kind,y,z,rem)
     {function _hJ_(param)
       {var xl=param[2];
        function _hR_(param){return 2 === param[0]?1:0}
        return caml_call2(Stdlib_List[33],_hR_,xl)}
      if(caml_call2(Stdlib_List[33],_hJ_,y))
       {var
         z$0=deriv_1(all_chars,categories,empty$0,cat,z,[0,[0,all_chars,0],0]),
         _hK_=
          function(param,rem)
           {var
             y=param[2],
             s=param[1],
             match=
              first
               (function(param)
                 {if(2 === param[0]){var marks=param[1];return [0,marks]}
                  return 0},
                y);
            if(match)
             {var
               marks=match[1],
               _hM_=
                function(param)
                 {var x=param[2],s=param[1];
                  return [0,s,prepend_marks_expr_lst(marks,x)]},
               z$1=caml_call1(caml_call1(Stdlib_List[19],_hM_),z$0);
              if(-730718166 === kind)
               {var _hN_=caml_call2(prepend_deriv,restrict(s,z$1),rem);
                return prepend
                        (s,tseq(kind,caml_call1(remove_matches,y),z,0),_hN_)}
              if(332064784 <= kind)
               {var
                 match$0=split_at_match(y),
                 y$0=match$0[2],
                 y$1=match$0[1],
                 _hO_=prepend(s,tseq(kind,y$0,z,0),rem),
                 _hP_=caml_call2(prepend_deriv,restrict(s,z$1),_hO_);
                return prepend(s,tseq(kind,y$1,z,0),_hP_)}
              var
               _hQ_=
                prepend(s,tseq(kind,caml_call1(remove_matches,y),z,0),rem);
              return caml_call2(prepend_deriv,restrict(s,z$1),_hQ_)}
            return prepend(s,tseq(kind,y,z,0),rem)};
        return caml_call3(Stdlib_List[26],_hK_,y,rem)}
      function _hL_(param,rem)
       {var xl=param[2],s=param[1];return prepend(s,tseq(kind,xl,z,0),rem)}
      return caml_call3(Stdlib_List[26],_hL_,y,rem)}
    function deriv_1$0(counter,all_chars,categories,marks,cat,x,rem$1)
     {var _hD_=x[2];
      if(typeof _hD_ === "number")
       return prepend(all_chars,[0,[2,marks],0],rem$1);
      else
       switch(_hD_[0])
        {case 0:
          var s=_hD_[1];return prepend(s,[0,[1,marks,eps_expr],0],rem$1);
         case 1:
          var l=_hD_[1];
          if(counter < 50)
           {var counter$0=counter + 1 | 0;
            return deriv_2$0(counter$0,all_chars,categories,marks,cat,l,rem$1)}
          return caml_trampoline_return
                  (deriv_2$0,[0,all_chars,categories,marks,cat,l,rem$1]);
         case 2:
          var
           z=_hD_[3],
           y=_hD_[2],
           kind=_hD_[1],
           y$0=deriv_1(all_chars,categories,marks,cat,y,[0,[0,all_chars,0],0]);
          return deriv_seq(all_chars,categories,cat,kind,y$0,z,rem$1);
         case 3:
          var
           y$1=_hD_[3],
           kind$0=_hD_[2],
           rep_kind=_hD_[1],
           y$2=
            deriv_1(all_chars,categories,marks,cat,y$1,[0,[0,all_chars,0],0]),
           _hE_=
            function(param,rem)
             {var
               z=param[2],
               s=param[1],
               match=
                first
                 (function(param)
                   {if(2 === param[0]){var marks=param[1];return [0,marks]}
                    return 0},
                  z);
              if(match)
               var
                marks$0=match[1],
                marks$1=marks$0,
                z$0=caml_call1(remove_matches,z);
              else
               var marks$1=marks,z$0=z;
              var
               _hI_=
                620821490 <= rep_kind
                 ?[0,[2,marks],tseq(kind$0,z$0,x,0)]
                 :tseq(kind$0,z$0,x,[0,[2,marks$1],0]);
              return prepend(s,_hI_,rem)};
          return caml_call3(Stdlib_List[26],_hE_,y$2,rem$1);
         case 4:
          var i=_hD_[1],_hF_=marks[2];
          return prepend
                  (all_chars,
                   [0,
                    [2,
                     [0,[0,[0,i,-1],caml_call2(Stdlib_List[53],i,marks[1])],_hF_]],
                    0],
                   rem$1);
         case 5:
          var
           e$1=_hD_[2],
           b=_hD_[1],
           _hH_=marks[2],
           e=e$1,
           rem=filter_marks(b,e$1,marks)[1],
           _hG_=0;
          for(;;)
           {if(e < b)
             return prepend(all_chars,[0,[2,[0,rem,_hH_]],_hG_],rem$1);
            var rem$0=[0,[0,e,-2],rem],e$0=e - 1 | 0,e=e$0,rem=rem$0;
            continue}
         case 6:
          var cat$0=_hD_[1];
          return prepend
                  (caml_call2(Stdlib_List[48],cat$0,categories),
                   [0,[2,marks],0],
                   rem$1);
         case 7:
          var cat$1=_hD_[1];
          return intersect(cat,cat$1)
                  ?prepend(all_chars,[0,[2,marks],0],rem$1)
                  :rem$1;
         default:return prepend(all_chars,[0,[2,marks],0],rem$1)}}
    function deriv_2$0(counter,all_chars,categories,marks,cat,l,rem)
     {if(l)
       {var r=l[2],y=l[1],_hC_=deriv_2(all_chars,categories,marks,cat,r,rem);
        if(counter < 50)
         {var counter$0=counter + 1 | 0;
          return deriv_1$0(counter$0,all_chars,categories,marks,cat,y,_hC_)}
        return caml_trampoline_return
                (deriv_1$0,[0,all_chars,categories,marks,cat,y,_hC_])}
      return rem}
    function deriv_1(all_chars,categories,marks,cat,x,rem)
     {return caml_trampoline
              (deriv_1$0(0,all_chars,categories,marks,cat,x,rem))}
    function deriv_2(all_chars,categories,marks,cat,l,rem)
     {return caml_trampoline
              (deriv_2$0(0,all_chars,categories,marks,cat,l,rem))}
    function deriv_4(all_chars,categories,cat,l,rem)
     {if(l)
       {var r=l[2],y$1=l[1],rem$0=deriv_4(all_chars,categories,cat,r,rem);
        switch(y$1[0])
         {case 0:
           var
            kind=y$1[3],
            z=y$1[2],
            y=y$1[1],
            y$0=deriv_4(all_chars,categories,cat,y,[0,[0,all_chars,0],0]);
           return deriv_seq(all_chars,categories,cat,kind,y$0,z,rem$0);
          case 1:
           var e=y$1[2],marks=y$1[1];
           return deriv_1(all_chars,categories,marks,cat,e,rem$0);
          default:return prepend(all_chars,[0,y$1,0],rem$0)}}
      return rem}
    function deriv(tbl_ref,all_chars,categories,st)
     {var
       der=deriv_4(all_chars,categories,st[2],st[3],[0,[0,all_chars,0],0]),
       _hx_=0;
      function _hy_(param,rem)
       {var
         expr=param[2],
         s=param[1],
         match=remove_duplicates(0,expr,eps_expr),
         expr$0=match[1],
         idx=free_index(tbl_ref,expr$0),
         expr$1=set_idx(idx,expr$0);
        function _hB_(param,rem)
         {var s$0=param[2],cat=param[1],s$1=inter(s,s$0);
          return is_empty(s$1)?rem:[0,[0,s$1,mk(idx,cat,expr$1)],rem]}
        return caml_call3(Stdlib_List[26],_hB_,categories,rem)}
      var l=caml_call3(Stdlib_List[26],_hy_,der,_hx_);
      function _hu_(param,_hA_)
       {var st2=_hA_[2],st1=param[2],c=caml_int_compare(st1[5],st2[5]);
        if(0 === c)
         {var c$0=caml_int_compare(st1[2],st2[2]);
          return 0 === c$0?caml_compare(st1[3],st2[3]):c$0}
        return c}
      var _hv_=red_tr(caml_call2(Stdlib_List[56],_hu_,l));
      function _hw_(param,_hz_)
       {var s2=_hz_[1],s1=param[1];return caml_compare(s1,s2)}
      return caml_call2(Stdlib_List[56],_hw_,_hv_)}
    function status(s)
     {var _hp_=s[4];
      if(_hp_){var st=_hp_[1];return st}
      var _hq_=s[3];
      if(_hq_)
       {var _hr_=_hq_[1];
        if(2 === _hr_[0])
         {var
           m=_hr_[1],
           _ht_=m[1],
           _hs_=m[2],
           _hm_=-1,
           _hn_=
            function(ma,param)
             {var i=param[1];return caml_call2(Stdlib[17],ma,i)},
           ma=caml_call3(Stdlib_List[25],_hn_,_hm_,_ht_),
           res=caml_make_vect(ma + 1 | 0,-1),
           _ho_=
            function(param)
             {var v=param[2],i=param[1];
              caml_check_bound(res,i)[1 + i] = v;
              return 0};
          caml_call2(Stdlib_List[17],_ho_,_ht_);
          var st$0=[0,res,_hs_]}
        else
         var st$0=1}
      else
       var st$0=0;
      s[4] = [0,st$0];
      return st$0}
    var
     _b7_=[0,dummy$0,create,Table],
     Re_Automata=
      [0,
       pp_sem,
       pp_rep_kind,
       is_eps,
       pp$2,
       create_ids,
       cst,
       empty$1,
       alt,
       seq$0,
       eps,
       rep,
       mark,
       pmark,
       erase,
       before,
       after,
       rename,
       [0],
       [0,pp$3],
       _b7_,
       create_working_area,
       index_count,
       delta,
       deriv,
       status];
    caml_register_global(152,Re_Automata,"Re__Automata");
    function make(param){return caml_call2(Stdlib_Bytes[1],257,0)}
    function flatten(cm)
     {var c=caml_create_bytes(256),color_repr=caml_create_bytes(256),v=[0,0];
      caml_bytes_set(c,0,0);
      caml_bytes_set(color_repr,0,0);
      var i=1;
      for(;;)
       {if(0 !== caml_bytes_get(cm,i))v[1]++;
        caml_bytes_set(c,i,caml_call1(Stdlib_Char[1],v[1]));
        var _hk_=caml_call1(Stdlib_Char[1],i);
        caml_bytes_set(color_repr,v[1],_hk_);
        var _hl_=i + 1 | 0;
        if(255 !== i){var i=_hl_;continue}
        var _hj_=v[1] + 1 | 0;
        return [0,
                c,
                caml_call3(Stdlib_Bytes[7],color_repr,0,v[1] + 1 | 0),
                _hj_]}}
    function split(s,cm)
     {return iter
              (s,
               function(i,j)
                {caml_bytes_set(cm,i,1);return caml_bytes_set(cm,j + 1 | 0,1)})}
    var Re_Color_map=[0,make,flatten,split];
    caml_register_global(155,Re_Color_map,"Re__Color_map");
    function offset$0(t,i)
     {if(t[2].length - 1 <= ((2 * i | 0) + 1 | 0))throw Stdlib[8];
      var _hg_=2 * i | 0,m1=caml_check_bound(t[2],_hg_)[1 + _hg_];
      if(-1 === m1)throw Stdlib[8];
      var
       p1=caml_check_bound(t[4],m1)[1 + m1] - 1 | 0,
       _hh_=(2 * i | 0) + 1 | 0,
       _hi_=caml_check_bound(t[2],_hh_)[1 + _hh_],
       p2=caml_check_bound(t[4],_hi_)[1 + _hi_] - 1 | 0;
      return [0,p1,p2]}
    function get(t,i)
     {var match=offset$0(t,i),p2=match[2],p1=match[1];
      return caml_call3(Stdlib_String[15],t[1],p1,p2 - p1 | 0)}
    function start(subs,i){return offset$0(subs,i)[1]}
    function stop(subs,i){return offset$0(subs,i)[2]}
    function test(t,i)
     {if(t[2].length - 1 <= (2 * i | 0))return 0;
      var _hf_=2 * i | 0,idx=caml_check_bound(t[2],_hf_)[1 + _hf_];
      return -1 !== idx?1:0}
    function get_opt(t,i){return test(t,i)?[0,get(t,i)]:0}
    function all_offset(t)
     {var
       res=caml_make_vect(t[5],dummy_offset),
       _ha_=((t[2].length - 1) / 2 | 0) - 1 | 0,
       _g$_=0;
      if(! (_ha_ < 0))
       {var i=_g$_;
        for(;;)
         {var _hb_=2 * i | 0,m1=caml_check_bound(t[2],_hb_)[1 + _hb_];
          if(-1 !== m1)
           {var
             p1=caml_check_bound(t[4],m1)[1 + m1],
             _hc_=(2 * i | 0) + 1 | 0,
             _hd_=caml_check_bound(t[2],_hc_)[1 + _hc_],
             p2=caml_check_bound(t[4],_hd_)[1 + _hd_];
            caml_check_bound(res,i)[1 + i] = [0,p1 - 1 | 0,p2 - 1 | 0]}
          var _he_=i + 1 | 0;
          if(_ha_ !== i){var i=_he_;continue}
          break}}
      return res}
    function all(t)
     {var
       res=caml_make_vect(t[5],dummy_string),
       _g5_=((t[2].length - 1) / 2 | 0) - 1 | 0,
       _g4_=0;
      if(! (_g5_ < 0))
       {var i=_g4_;
        for(;;)
         {var _g6_=2 * i | 0,m1=caml_check_bound(t[2],_g6_)[1 + _g6_];
          if(-1 !== m1)
           {var
             p1=caml_check_bound(t[4],m1)[1 + m1],
             _g7_=(2 * i | 0) + 1 | 0,
             _g8_=caml_check_bound(t[2],_g7_)[1 + _g7_],
             p2=caml_check_bound(t[4],_g8_)[1 + _g8_],
             _g9_=caml_call3(Stdlib_String[15],t[1],p1 - 1 | 0,p2 - p1 | 0);
            caml_check_bound(res,i)[1 + i] = _g9_}
          var _g__=i + 1 | 0;
          if(_g5_ !== i){var i=_g__;continue}
          break}}
      return res}
    function pp$4(fmt,t)
     {var offsets=all_offset(t),strs=all(t);
      function _g1_(i)
       {var _g3_=caml_check_bound(offsets,i)[1 + i];
        return [0,caml_check_bound(strs,i)[1 + i],_g3_]}
      var
       _g2_=caml_call2(Stdlib_Array[2],strs.length - 1,_g1_),
       matches=caml_call1(Stdlib_Array[11],_g2_);
      function pp_match(fmt,param)
       {var match=param[2],stop=match[2],start=match[1],str=param[1];
        return caml_call5(_bk_,fmt,_b8_,str,start,stop)}
      return sexp(fmt,cst_Group,caml_call2(_be_,0,pp_match),matches)}
    function nb_groups(t){return t[5]}
    var
     Group=
      [0,get,get_opt,offset$0,start,stop,all,all_offset,test,nb_groups,pp$4];
    caml_register_global(157,Group,"Re__Group");
    function iter$0(n,f,v)
     {var n$0=n,v$0=v;
      for(;;)
       {if(0 === n$0)return v$0;
        var v$1=caml_call1(f,v$0),n$1=n$0 - 1 | 0,n$0=n$1,v$0=v$1;
        continue}}
    var unknown=-2,break$0=-3;
    function print_re(ch,re){return pp$2(ch,re[1])}
    function category(re,color)
     {return -1 === color
              ?inexistant
              :color === re[6]?28:from_char(caml_bytes_get(re[4],color))}
    var dummy_next=[0],unknown_state=[0,unknown,0,dummy_next,0,_b7_[1]];
    function mk_state(ncol,desc)
     {var match=status(desc),switch$0=0;
      if(typeof match === "number" && match){var break_state=0;switch$0 = 1}
      if(! switch$0)var break_state=1;
      var
       _gX_=0,
       _gY_=break_state?dummy_next:caml_make_vect(ncol,unknown_state),
       _gZ_=desc[1],
       _g0_=break_state?break$0:desc[1];
      return [0,_g0_,_gZ_,_gY_,_gX_,desc]}
    function find_state(re,desc)
     {try
       {var _gV_=caml_call2(_b7_[3][7],re[8],desc);return _gV_}
      catch(_gW_)
       {_gW_ = caml_wrap_exception(_gW_);
        if(_gW_ === Stdlib[8])
         {var st=mk_state(re[5],desc);
          caml_call3(_b7_[3][5],re[8],desc,st);
          return st}
        throw _gW_}}
    function delta$0(info,cat,color,st)
     {var
       desc=delta(info[1][7],cat,color,st[5]),
       len=info[3].length - 1,
       _gT_=desc[1] === len?1:0,
       _gU_=_gT_?0 < len?1:0:_gT_;
      if(_gU_)
       {var pos=info[3];
        info[3] = caml_make_vect(2 * len | 0,0);
        caml_call5(Stdlib_Array[10],pos,0,info[3],0,len)}
      return desc}
    function validate(info,s,pos,st)
     {var
       _gS_=caml_string_get(s,pos),
       color=caml_bytes_get(info[2],_gS_),
       cat=category(info[1],color),
       desc=delta$0(info,cat,color,st),
       st$0=find_state(info[1],desc);
      caml_check_bound(st[3],color)[1 + color] = st$0;
      return 0}
    function final$0(info,st,cat)
     {try
       {var _gQ_=caml_call2(Stdlib_List[48],cat,st[4]);return _gQ_}
      catch(_gR_)
       {_gR_ = caml_wrap_exception(_gR_);
        if(_gR_ === Stdlib[8])
         {var
           st$0=delta$0(info,cat,-1,st),
           _gP_=status(st$0),
           res=[0,st$0[1],_gP_];
          st[4] = [0,[0,cat,res],st[4]];
          return res}
        throw _gR_}}
    function find_initial_state(re,cat)
     {try
       {var _gN_=caml_call2(Stdlib_List[48],cat,re[2]);return _gN_}
      catch(_gO_)
       {_gO_ = caml_wrap_exception(_gO_);
        if(_gO_ === Stdlib[8])
         {var st=find_state(re,caml_call2(_b7_[2],cat,re[1]));
          re[2] = [0,[0,cat,st],re[2]];
          return st}
        throw _gO_}}
    function get_color(re,s,pos)
     {if(0 <= pos)
       {var slen=caml_ml_string_length(s);
        if(slen <= pos)return -1;
        if
         (pos
          ===
          (slen - 1 | 0)
          &&
          -1
          !==
          re[6]
          &&
          10
          ===
          caml_string_get(s,pos))
         return re[6];
        var _gM_=caml_string_get(s,pos);
        return caml_bytes_get(re[3],_gM_)}
      return -1}
    function scan_str(info,s,st$8,groups)
     {var pos$4=info[4],last=info[5];
      if
       (last
        ===
        caml_ml_string_length(s)
        &&
        -1
        !==
        info[1][6]
        &&
        pos$4
        <
        last
        &&
        10
        ===
        caml_string_get(s,last - 1 | 0))
       {var
         info$0=[0,info[1],info[2],info[3],info[4],last - 1 | 0],
         st$9=scan_str(info$0,s,st$8,groups);
        if(st$9[1] === -3)return st$9;
        var pos$5=last - 1 | 0;
        for(;;)
         {var _gJ_=info$0[1][6],st$6=caml_check_bound(st$9[3],_gJ_)[1 + _gJ_];
          if(0 <= st$6[1])
           {if(groups)
             {var _gK_=st$6[1];
              caml_check_bound(info$0[3],_gK_)[1 + _gK_] = pos$5 + 1 | 0}
            return st$6}
          if(st$6[1] === -3)
           {if(groups)
             {var _gL_=st$6[2];
              caml_check_bound(info$0[3],_gL_)[1 + _gL_] = pos$5 + 1 | 0}
            return st$6}
          var
           color=info$0[1][6],
           real_c=caml_bytes_get(info$0[2],10),
           cat=category(info$0[1],color),
           desc=delta$0(info$0,cat,real_c,st$9),
           st$7=find_state(info$0[1],desc);
          caml_check_bound(st$9[3],color)[1 + color] = st$7;
          continue}}
      if(groups)
       {var pos=pos$4,st=st$8;
        a:
        for(;;)
         {if(pos < info[5])
           {var
             _gA_=caml_string_get(s,pos),
             _gB_=caml_bytes_get(info[2],_gA_),
             st$0=caml_check_bound(st[3],_gB_)[1 + _gB_],
             pos$0=pos,
             st$2=st,
             st$1=st$0;
            for(;;)
             {if(0 <= st$1[1])
               {var pos$1=pos$0 + 1 | 0;
                if(pos$1 < info[5])
                 {var
                   _gC_=caml_string_get(s,pos$1),
                   _gD_=caml_bytes_get(info[2],_gC_),
                   st$3=caml_check_bound(st$1[3],_gD_)[1 + _gD_],
                   _gE_=st$1[1];
                  caml_check_bound(info[3],_gE_)[1 + _gE_] = pos$1;
                  var pos$0=pos$1,st$2=st$1,st$1=st$3;
                  continue}
                var _gF_=st$1[1];
                caml_check_bound(info[3],_gF_)[1 + _gF_] = pos$1;
                return st$1}
              if(st$1[1] === -3)
               {var _gG_=st$1[2];
                caml_check_bound(info[3],_gG_)[1 + _gG_] = pos$0 + 1 | 0;
                return st$1}
              validate(info,s,pos$0,st$2);
              var pos=pos$0,st=st$2;
              continue a}}
          return st}}
      var pos$2=pos$4,st$4=st$8;
      for(;;)
       {if(pos$2 < last)
         {var
           _gH_=caml_string_get(s,pos$2),
           _gI_=caml_bytes_get(info[2],_gH_),
           st$5=caml_check_bound(st$4[3],_gI_)[1 + _gI_];
          if(0 <= st$5[1])
           {var pos$3=pos$2 + 1 | 0,pos$2=pos$3,st$4=st$5;continue}
          if(st$5[1] === -3)return st$5;
          validate(info,s,pos$2,st$4);
          continue}
        return st$4}}
    function match_str(groups,partial,re,s,pos,len)
     {var slen=caml_ml_string_length(s),last=-1 === len?slen:pos + len | 0;
      if(groups)
       var
        n=index_count(re[7]) + 1 | 0,
        _gy_=10 < n?caml_make_vect(n,0):_b9_.slice(),
        _gz_=_gy_;
      else
       var _gz_=[0];
      var
       info=[0,re,re[3],_gz_,pos,last],
       initial_cat=0 === pos?33:32 | category(re,get_color(re,s,pos - 1 | 0)),
       initial_state=find_initial_state(re,initial_cat),
       st=scan_str(info,s,initial_state,groups),
       switch$0=0;
      if(st[1] !== -3 && ! partial)
       {var
         final_cat=last === slen?33:32 | category(re,get_color(re,s,last)),
         match=final$0(info,st,final_cat),
         res$0=match[2],
         idx=match[1];
        if(groups)caml_check_bound(info[3],idx)[1 + idx] = last + 1 | 0;
        var res=res$0;
        switch$0 = 1}
      if(! switch$0)var res=status(st[5]);
      if(typeof res === "number")return res?1:0;
      var pmarks=res[2],marks=res[1];
      return [0,[0,s,marks,pmarks,info[3],re[9]]]}
    function cseq(c$0,c){return seq(c$0,c)}
    function cadd(c,s){return add(c,s)}
    function trans_set(cache,cm,s)
     {var match=one_char(s);
      if(match){var i=match[1];return csingle(caml_bytes_get(cm,i))}
      var v=[0,hash_rec(s),s];
      try
       {var _gv_=caml_call2(CSetMap[28],v,cache[1]);return _gv_}
      catch(_gw_)
       {_gw_ = caml_wrap_exception(_gw_);
        if(_gw_ === Stdlib[8])
         {var
           l=
            fold_right
             (s,
              empty,
              function(param,l)
               {var j=param[2],i=param[1],_gx_=caml_bytes_get(cm,j);
                return union(cseq(caml_bytes_get(cm,i),_gx_),l)});
          cache[1] = caml_call3(CSetMap[4],v,l,cache[1]);
          return l}
        throw _gw_}}
    function view(t){return t}
    var View=[0,view];
    function pp$5(fmt,t)
     {function var$0(s,re){return sexp(fmt,s,pp$5,re)}
      function seq(s,rel){return sexp(fmt,s,caml_call2(_be_,0,pp$5),rel)}
      if(typeof t === "number")
       switch(t)
        {case 0:return caml_call2(_m_,fmt,cst_Beg_of_line);
         case 1:return caml_call2(_m_,fmt,cst_End_of_line);
         case 2:return caml_call2(_m_,fmt,cst_Beg_of_word);
         case 3:return caml_call2(_m_,fmt,cst_End_of_word);
         case 4:return caml_call2(_m_,fmt,cst_Not_bound);
         case 5:return caml_call2(_m_,fmt,cst_Beg_of_str);
         case 6:return caml_call2(_m_,fmt,cst_End_of_str);
         case 7:return caml_call2(_m_,fmt,cst_Last_end_of_line);
         case 8:return caml_call2(_m_,fmt,cst_Start);
         default:return caml_call2(_m_,fmt,cst_Stop)}
      else
       switch(t[0])
        {case 0:var s=t[1];return sexp(fmt,cst_Set,pp$0,s);
         case 1:var sq=t[1];return seq(cst_Sequence,sq);
         case 2:var alt=t[1];return seq(cst_Alternative,alt);
         case 3:
          var
           stop=t[3],
           start=t[2],
           re=t[1],
           pp=
            function(fmt,param)
             {return caml_call7(_bk_,fmt,_b__,pp$5,re,start,optint,stop)};
          return sexp(fmt,cst_Repeat,pp,0);
         case 4:
          var re$0=t[2],sem=t[1],_gj_=[0,sem,re$0];
          return sexp
                  (fmt,
                   cst_Sem,
                   function(_gr_,_gs_){return pair(pp_sem,pp$5,_gr_,_gs_)},
                   _gj_);
         case 5:
          var re$1=t[2],k=t[1],_gk_=[0,k,re$1];
          return sexp
                  (fmt,
                   cst_Sem_greedy,
                   function(_gp_,_gq_){return pair(pp_rep_kind,pp$5,_gp_,_gq_)},
                   _gk_);
         case 6:var c=t[1];return var$0(cst_Group$0,c);
         case 7:var c$0=t[1];return var$0(cst_No_group,c$0);
         case 8:var c$1=t[1];return var$0(cst_Nest,c$1);
         case 9:var c$2=t[1];return var$0(cst_Case,c$2);
         case 10:var c$3=t[1];return var$0(cst_No_case,c$3);
         case 11:var c$4=t[1];return seq(cst_Intersection,c$4);
         case 12:var c$5=t[1];return seq(cst_Complement,c$5);
         case 13:
          var b=t[2],a=t[1],_gl_=[0,a,b];
          return sexp
                  (fmt,
                   cst_Difference,
                   function(_gn_,_go_){return pair(pp$5,pp$5,_gn_,_go_)},
                   _gl_);
         default:
          var r=t[2],m=t[1],_gm_=[0,m,r];
          return sexp
                  (fmt,
                   cst_Pmark,
                   function(_gt_,_gu_){return pair(pp$1,pp$5,_gt_,_gu_)},
                   _gm_)}}
    function is_charset(param)
     {var param$0=param;
      for(;;)
       {var switch$0=0;
        if(typeof param$0 === "number")
         switch$0 = 1;
        else
         switch(param$0[0])
          {case 0:return 1;
           case 13:
            var r=param$0[2],r$0=param$0[1],_gi_=is_charset(r$0);
            if(_gi_){var param$0=r;continue}
            return _gi_;
           case 4:
           case 5:var param$1=param$0[2];break;
           case 2:
           case 11:
           case 12:
            var l=param$0[1];return caml_call2(Stdlib_List[32],is_charset,l);
           case 7:
           case 9:
           case 10:var param$1=param$0[1];break;
           default:switch$0 = 1}
        if(switch$0)return 0;
        var param$0=param$1;
        continue}}
    var
     _b$_=cseq(216,222),
     _ca_=union(cseq(192,214),_b$_),
     cupper=union(cseq(65,90),_ca_),
     clower=offset(32,cupper),
     _cb_=union(clower,cupper),
     calpha=caml_call3(Stdlib_List[26],cadd,_cc_,_cb_),
     cdigit=cseq(48,57),
     calnum=union(calpha,cdigit),
     cword=cadd(95,calnum);
    function equal$3(x1,x2)
     {var x1$0=x1,x2$0=x2;
      for(;;)
       {var switch$0=0;
        if(typeof x1$0 === "number")
         switch(x1$0)
          {case 0:if(typeof x2$0 === "number" && ! x2$0)switch$0 = 1;break;
           case 1:
            if(typeof x2$0 === "number" && 1 === x2$0)switch$0 = 1;break;
           case 2:
            if(typeof x2$0 === "number" && 2 === x2$0)switch$0 = 1;break;
           case 3:
            if(typeof x2$0 === "number" && 3 === x2$0)switch$0 = 1;break;
           case 4:
            if(typeof x2$0 === "number" && 4 === x2$0)switch$0 = 1;break;
           case 5:
            if(typeof x2$0 === "number" && 5 === x2$0)switch$0 = 1;break;
           case 6:
            if(typeof x2$0 === "number" && 6 === x2$0)switch$0 = 1;break;
           case 7:
            if(typeof x2$0 === "number" && 7 === x2$0)switch$0 = 1;break;
           case 8:
            if(typeof x2$0 === "number" && 8 === x2$0)switch$0 = 1;break;
           default:if(typeof x2$0 === "number" && 9 <= x2$0)switch$0 = 1}
        else
         switch(x1$0[0])
          {case 0:
            if(typeof x2$0 !== "number" && 0 === x2$0[0])
             {var s2=x2$0[1],s1=x1$0[1];return caml_equal(s1,s2)}
            break;
           case 1:
            if(typeof x2$0 !== "number" && 1 === x2$0[0])
             {var l2=x2$0[1],l1=x1$0[1];return eq_list(l1,l2)}
            break;
           case 2:
            if(typeof x2$0 !== "number" && 2 === x2$0[0])
             {var l2$0=x2$0[1],l1$0=x1$0[1];return eq_list(l1$0,l2$0)}
            break;
           case 3:
            if(typeof x2$0 !== "number" && 3 === x2$0[0])
             {var
               j2=x2$0[3],
               i2=x2$0[2],
               x2$1=x2$0[1],
               j1=x1$0[3],
               i1=x1$0[2],
               x1$1=x1$0[1],
               _gb_=i1 === i2?1:0;
              if(_gb_)
               {var _gc_=caml_equal(j1,j2);
                if(_gc_){var x1$0=x1$1,x2$0=x2$1;continue}
                var _gd_=_gc_}
              else
               var _gd_=_gb_;
              return _gd_}
            break;
           case 4:
            if(typeof x2$0 !== "number" && 4 === x2$0[0])
             {var
               x2$2=x2$0[2],
               sem2=x2$0[1],
               x1$2=x1$0[2],
               sem1=x1$0[1],
               _ge_=sem1 === sem2?1:0;
              if(_ge_){var x1$0=x1$2,x2$0=x2$2;continue}
              return _ge_}
            break;
           case 5:
            if(typeof x2$0 !== "number" && 5 === x2$0[0])
             {var
               x2$3=x2$0[2],
               k2=x2$0[1],
               x1$3=x1$0[2],
               k1=x1$0[1],
               _gf_=k1 === k2?1:0;
              if(_gf_){var x1$0=x1$3,x2$0=x2$3;continue}
              return _gf_}
            break;
           case 6:if(typeof x2$0 !== "number" && 6 === x2$0[0])return 0;break;
           case 7:
            if(typeof x2$0 !== "number" && 7 === x2$0[0])
             {var x2$4=x2$0[1],x1$4=x1$0[1],x1$0=x1$4,x2$0=x2$4;continue}
            break;
           case 8:
            if(typeof x2$0 !== "number" && 8 === x2$0[0])
             {var x2$5=x2$0[1],x1$5=x1$0[1],x1$0=x1$5,x2$0=x2$5;continue}
            break;
           case 9:
            if(typeof x2$0 !== "number" && 9 === x2$0[0])
             {var x2$6=x2$0[1],x1$6=x1$0[1],x1$0=x1$6,x2$0=x2$6;continue}
            break;
           case 10:
            if(typeof x2$0 !== "number" && 10 === x2$0[0])
             {var x2$7=x2$0[1],x1$7=x1$0[1],x1$0=x1$7,x2$0=x2$7;continue}
            break;
           case 11:
            if(typeof x2$0 !== "number" && 11 === x2$0[0])
             {var l2$1=x2$0[1],l1$1=x1$0[1];return eq_list(l1$1,l2$1)}
            break;
           case 12:
            if(typeof x2$0 !== "number" && 12 === x2$0[0])
             {var l2$2=x2$0[1],l1$2=x1$0[1];return eq_list(l1$2,l2$2)}
            break;
           case 13:
            if(typeof x2$0 !== "number" && 13 === x2$0[0])
             {var
               x2$8=x2$0[2],
               x2$9=x2$0[1],
               x1$8=x1$0[2],
               x1$9=x1$0[1],
               _gg_=equal$3(x1$9,x2$9);
              if(_gg_){var x1$0=x1$8,x2$0=x2$8;continue}
              return _gg_}
            break;
           default:
            if(typeof x2$0 !== "number" && 14 === x2$0[0])
             {var
               r2=x2$0[2],
               m2=x2$0[1],
               r1=x1$0[2],
               m1=x1$0[1],
               _gh_=m1 === m2?1:0;
              if(_gh_){var x1$0=r1,x2$0=r2;continue}
              return _gh_}}
        return switch$0?1:0}}
    function eq_list(l1,l2)
     {var l1$0=l1,l2$0=l2;
      for(;;)
       {if(l1$0)
         {if(l2$0)
           {var
             r2=l2$0[2],
             x2=l2$0[1],
             r1=l1$0[2],
             x1=l1$0[1],
             _ga_=equal$3(x1,x2);
            if(_ga_){var l1$0=r1,l2$0=r2;continue}
            return _ga_}}
        else
         if(! l2$0)return 1;
        return 0}}
    function sequence(l){if(l && ! l[2]){var x=l[1];return x}return [1,l]}
    function merge_sequences(param)
     {var param$0=param;
      for(;;)
       {if(param$0)
         {var _f7_=param$0[1];
          if(typeof _f7_ !== "number")
           switch(_f7_[0])
            {case 1:
              var _f8_=_f7_[1];
              if(_f8_)
               {var
                 r$0=param$0[2],
                 y=_f8_[2],
                 x=_f8_[1],
                 r$1=merge_sequences(r$0);
                if(r$1)
                 {var _f9_=r$1[1],switch$0=0;
                  if(typeof _f9_ === "number" || ! (1 === _f9_[0]))
                   switch$0 = 1;
                  else
                   {var _f__=_f9_[1];
                    if(_f__)
                     {var r$2=r$1[2],y$0=_f__[2],x$0=_f__[1];
                      if(equal$3(x,x$0))
                       {var _f$_=[0,sequence(y$0),0];
                        return [0,[1,[0,x,[0,[2,[0,sequence(y),_f$_]],0]]],r$2]}}}}
                return [0,[1,[0,x,y]],r$1]}
              break;
             case 2:
              var
               r$3=param$0[2],
               l=_f7_[1],
               param$1=caml_call2(Stdlib[37],l,r$3),
               param$0=param$1;
              continue
             }
          var r=param$0[2];
          return [0,_f7_,merge_sequences(r)]}
        return 0}}
    function enforce_kind(ids,kind,k,cr)
     {return 332064784 === kind?332064784 === k?cr:seq$0(ids,k,cr,eps(ids)):cr}
    function trans_seq(ids,kind,ign_group,ign_case,greedy,pos,cache,c,param)
     {if(param)
       {var _f6_=param[1];
        if(param[2])
         {var
           rem=param[2],
           match=
            translate(ids,kind,ign_group,ign_case,greedy,pos,cache,c,_f6_),
           kind$0=match[2],
           cr=match[1],
           cr$0=trans_seq(ids,kind,ign_group,ign_case,greedy,pos,cache,c,rem);
          return is_eps(cr$0)?cr:is_eps(cr)?cr$0:seq$0(ids,kind$0,cr,cr$0)}
        var
         match$0=
          translate(ids,kind,ign_group,ign_case,greedy,pos,cache,c,_f6_),
         kind$1=match$0[2],
         cr$1=match$0[1];
        return enforce_kind(ids,kind,kind$1,cr$1)}
      return eps(ids)}
    function translate(ids,kind,ign_group,ign_case,greedy,pos,cache,c,param)
     {var ign_group$0=ign_group,greedy$0=greedy,param$0=param;
      for(;;)
       if(typeof param$0 === "number")
        switch(param$0)
         {case 0:return [0,after(ids,9),kind];
          case 1:return [0,before(ids,9),kind];
          case 2:
           var _fX_=before(ids,letter);
           return [0,seq$0(ids,332064784,after(ids,5),_fX_),kind];
          case 3:
           var _fY_=before(ids,5);
           return [0,seq$0(ids,332064784,after(ids,letter),_fY_),kind];
          case 4:
           var
            _fZ_=before(ids,5),
            _f0_=[0,seq$0(ids,332064784,after(ids,5),_fZ_),0],
            _f1_=before(ids,letter);
           return [0,
                   alt
                    (ids,[0,seq$0(ids,332064784,after(ids,letter),_f1_),_f0_]),
                   kind];
          case 5:return [0,after(ids,inexistant),kind];
          case 6:return [0,before(ids,inexistant),kind];
          case 7:return [0,before(ids,17),kind];
          case 8:return [0,after(ids,search_boundary),kind];
          default:return [0,before(ids,search_boundary),kind]}
       else
        switch(param$0[0])
         {case 0:
           var s=param$0[1];return [0,cst(ids,trans_set(cache,c,s)),kind];
          case 1:
           var l=param$0[1];
           return [0,
                   trans_seq
                    (ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,l),
                   kind];
          case 2:
           var l$0=param$0[1],merged_sequences=merge_sequences(l$0);
           if(merged_sequences && ! merged_sequences[2])
            {var
              r=merged_sequences[1],
              match=
               translate(ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r),
              kind$0=match[2],
              cr=match[1];
             return [0,enforce_kind(ids,kind,kind$0,cr),kind]}
           var
            _f2_=
             function(r)
              {var
                match=
                 translate
                  (ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r),
                kind$0=match[2],
                cr=match[1];
               return enforce_kind(ids,kind,kind$0,cr)};
           return [0,
                   alt(ids,caml_call2(Stdlib_List[19],_f2_,merged_sequences)),
                   kind];
          case 3:
           var
            j=param$0[3],
            i=param$0[2],
            r$0=param$0[1],
            match$0=
             translate(ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r$0),
            kind$1=match$0[2],
            cr$0=match$0[1];
           if(j)
            var
             j$0=j[1],
             f=
              620821490 <= greedy$0
               ?function(rem)
                 {var _f4_=[0,seq$0(ids,kind$1,rename(ids,cr$0),rem),0];
                  return alt(ids,[0,eps(ids),_f4_])}
               :function(rem)
                 {var _f5_=[0,eps(ids),0];
                  return alt
                          (ids,[0,seq$0(ids,kind$1,rename(ids,cr$0),rem),_f5_])},
             rem=iter$0(j$0 - i | 0,f,eps(ids));
           else
            var rem=rep(ids,greedy$0,kind$1,cr$0);
           return [0,
                   iter$0
                    (i,
                     function(rem){return seq$0(ids,kind$1,rename(ids,cr$0),rem)},
                     rem),
                   kind];
          case 4:
           var
            r$1=param$0[2],
            kind$2=param$0[1],
            match$1=
             translate
              (ids,kind$2,ign_group$0,ign_case,greedy$0,pos,cache,c,r$1),
            kind$3=match$1[2],
            cr$1=match$1[1];
           return [0,enforce_kind(ids,kind$2,kind$3,cr$1),kind$2];
          case 5:
           var
            param$1=param$0[2],
            greedy$1=param$0[1],
            greedy$0=greedy$1,
            param$0=param$1;
           continue;
          case 6:
           var r$2=param$0[1];
           if(ign_group$0){var param$0=r$2;continue}
           var p=pos[1];
           pos[1] = pos[1] + 2 | 0;
           var
            match$2=
             translate(ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r$2),
            kind$4=match$2[2],
            cr$2=match$2[1],
            _f3_=seq$0(ids,332064784,cr$2,mark(ids,p + 1 | 0));
           return [0,seq$0(ids,332064784,mark(ids,p),_f3_),kind$4];
          case 7:
           var param$2=param$0[1],ign_group$0=1,param$0=param$2;continue;
          case 8:
           var
            r$3=param$0[1],
            b=pos[1],
            match$3=
             translate(ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r$3),
            kind$5=match$3[2],
            cr$3=match$3[1],
            e=pos[1] - 1 | 0;
           return e < b
                   ?[0,cr$3,kind$5]
                   :[0,seq$0(ids,332064784,erase(ids,b,e),cr$3),kind$5];
          case 14:
           var
            r$4=param$0[2],
            i$0=param$0[1],
            match$4=
             translate(ids,kind,ign_group$0,ign_case,greedy$0,pos,cache,c,r$4),
            kind$6=match$4[2],
            cr$4=match$4[1];
           return [0,seq$0(ids,332064784,pmark(ids,i$0),cr$4),kind$6];
          default:throw [0,Assert_failure,_ce_]}}
    function as_set(param)
     {if(typeof param !== "number" && 0 === param[0]){var s=param[1];return s}
      throw [0,Assert_failure,_cf_]}
    function handle_case(ign_case,r)
     {var ign_case$0=ign_case,r$0=r;
      for(;;)
       if(typeof r$0 === "number")
        return r$0;
       else
        switch(r$0[0])
         {case 0:
           var s=r$0[1];
           if(ign_case$0)
            var
             _fL_=offset(-32,inter(s,clower)),
             _fM_=union(s,union(offset(32,inter(s,cupper)),_fL_));
           else
            var _fM_=s;
           return [0,_fM_];
          case 1:
           var
            l=r$0[1],
            _fN_=function(_fW_){return handle_case(ign_case$0,_fW_)};
           return [1,caml_call2(Stdlib_List[19],_fN_,l)];
          case 2:
           var
            l$0=r$0[1],
            _fO_=function(_fV_){return handle_case(ign_case$0,_fV_)},
            l$1=caml_call2(Stdlib_List[19],_fO_,l$0);
           if(is_charset([2,l$1]))
            {var _fP_=function(s,r){return union(s,as_set(r))};
             return [0,caml_call3(Stdlib_List[25],_fP_,empty,l$1)]}
           return [2,l$1];
          case 3:
           var j=r$0[3],i=r$0[2],r$1=r$0[1];
           return [3,handle_case(ign_case$0,r$1),i,j];
          case 4:
           var r$2=r$0[2],k=r$0[1],r$3=handle_case(ign_case$0,r$2);
           return is_charset(r$3)?r$3:[4,k,r$3];
          case 5:
           var r$4=r$0[2],k$0=r$0[1],r$5=handle_case(ign_case$0,r$4);
           return is_charset(r$5)?r$5:[5,k$0,r$5];
          case 6:var r$6=r$0[1];return [6,handle_case(ign_case$0,r$6)];
          case 7:
           var r$7=r$0[1],r$8=handle_case(ign_case$0,r$7);
           return is_charset(r$8)?r$8:[7,r$8];
          case 8:
           var r$9=r$0[1],r$10=handle_case(ign_case$0,r$9);
           return is_charset(r$10)?r$10:[8,r$10];
          case 9:var r$11=r$0[1],ign_case$0=0,r$0=r$11;continue;
          case 10:var r$12=r$0[1],ign_case$0=1,r$0=r$12;continue;
          case 11:
           var
            l$2=r$0[1],
            _fQ_=function(r){return handle_case(ign_case$0,r)},
            l$3=caml_call2(Stdlib_List[19],_fQ_,l$2),
            _fR_=function(s,r){return inter(s,as_set(r))};
           return [0,caml_call3(Stdlib_List[25],_fR_,cany,l$3)];
          case 12:
           var
            l$4=r$0[1],
            _fS_=function(r){return handle_case(ign_case$0,r)},
            l$5=caml_call2(Stdlib_List[19],_fS_,l$4),
            _fT_=function(s,r){return union(s,as_set(r))};
           return [0,diff(cany,caml_call3(Stdlib_List[25],_fT_,empty,l$5))];
          case 13:
           var
            r$13=r$0[2],
            r$14=r$0[1],
            _fU_=diff(cany,as_set(handle_case(ign_case$0,r$13)));
           return [0,inter(as_set(handle_case(ign_case$0,r$14)),_fU_)];
          default:
           var r$15=r$0[2],i$0=r$0[1];
           return [14,i$0,handle_case(ign_case$0,r$15)]}}
    function anchored(param)
     {var param$0=param;
      for(;;)
       {var switch$0=0;
        if(typeof param$0 === "number")
         switch(param$0){case 5:case 8:return 1}
        else
         switch(param$0[0])
          {case 1:
            var l=param$0[1];return caml_call2(Stdlib_List[33],anchored,l);
           case 2:
            var l$0=param$0[1];
            return caml_call2(Stdlib_List[32],anchored,l$0);
           case 3:
            var i=param$0[2],r=param$0[1],_fK_=0 < i?1:0;
            if(_fK_){var param$0=r;continue}
            return _fK_;
           case 4:
           case 5:
           case 14:var param$1=param$0[2];switch$0 = 1;break;
           case 0:
           case 11:
           case 12:
           case 13:break;
           default:var param$1=param$0[1];switch$0 = 1}
        if(switch$0){var param$0=param$1;continue}
        return 0}}
    function str(s)
     {var l=[0,0],_fH_=caml_ml_string_length(s) - 1 | 0;
      if(! (_fH_ < 0))
       {var i=_fH_;
        for(;;)
         {var _fI_=l[1];
          l[1] = [0,[0,csingle(caml_string_get(s,i))],_fI_];
          var _fJ_=i - 1 | 0;
          if(0 !== i){var i=_fJ_;continue}
          break}}
      return [1,l[1]]}
    function char$0(c){return [0,csingle(c)]}
    function alt$0(l){if(l && ! l[2]){var r=l[1];return r}return [2,l]}
    function seq$1(l){if(l && ! l[2]){var r=l[1];return r}return [1,l]}
    var empty$2=alt$0(0),epsilon=seq$1(0);
    function repn(r,i,j)
     {if(i < 0)caml_call1(Stdlib[1],cst_Re_repn);
      var switch$0=0;
      if(j)
       {var j$0=j[1];
        if(j$0 < i){caml_call1(Stdlib[1],cst_Re_repn$0);switch$0 = 1}}
      return [3,r,i,j]}
    function rep$0(r){return repn(r,0,0)}
    function rep1(r){return repn(r,1,0)}
    function opt(r){return repn(r,0,_cg_)}
    var bol=0,eol=1,bow=2,eow=3;
    function word(r){return seq$1([0,bow,[0,r,[0,eow,0]]])}
    var not_boundary=4,bos=5,eos=6;
    function whole_string(r){return seq$1([0,bos,[0,r,[0,eos,0]]])}
    var leol=7,start$0=8,stop$0=9;
    function longest(r){return [4,-730718166,r]}
    function shortest(r){return [4,-1034406550,r]}
    function first$0(r){return [4,332064784,r]}
    function greedy(r){return [5,-904640576,r]}
    function non_greedy(r){return [5,620821490,r]}
    function group(r){return [6,r]}
    function no_group(r){return [7,r]}
    function nest(r){return [8,r]}
    function mark$0(r){var i=gen(0);return [0,i,[14,i,r]]}
    function set(str)
     {var s=[0,empty],_fE_=caml_ml_string_length(str) - 1 | 0,_fD_=0;
      if(! (_fE_ < 0))
       {var i=_fD_;
        for(;;)
         {var _fF_=s[1];
          s[1] = union(csingle(caml_string_get(str,i)),_fF_);
          var _fG_=i + 1 | 0;
          if(_fE_ !== i){var i=_fG_;continue}
          break}}
      return [0,s[1]]}
    function rg(c$0,c){return [0,cseq(c$0,c)]}
    function inter$0(l)
     {var r=[11,l];return is_charset(r)?r:caml_call1(Stdlib[1],cst_Re_inter)}
    function compl(l)
     {var r=[12,l];return is_charset(r)?r:caml_call1(Stdlib[1],cst_Re_compl)}
    function diff$0(r$0,r)
     {var r$1=[13,r$0,r];
      return is_charset(r$1)?r$1:caml_call1(Stdlib[1],cst_Re_diff)}
    var
     any=[0,cany],
     notnl=[0,diff(cany,csingle(10))],
     _ch_=[0,rg(248,255),0],
     _ci_=[0,rg(223,246),_ch_],
     _cj_=[0,char$0(181),_ci_],
     lower=alt$0([0,rg(97,122),_cj_]),
     _ck_=[0,rg(216,222),0],
     _cl_=[0,rg(192,214),_ck_],
     upper=alt$0([0,rg(65,90),_cl_]),
     _cm_=[0,char$0(186),0],
     alpha=alt$0([0,lower,[0,upper,[0,char$0(170),_cm_]]]),
     digit=rg(48,57),
     alnum=alt$0([0,alpha,[0,digit,0]]),
     wordc=alt$0([0,alnum,[0,char$0(95),0]]),
     ascii=rg(0,127),
     blank=set(cst$0),
     _cn_=[0,rg(127,159),0],
     cntrl=alt$0([0,rg(0,31),_cn_]),
     _co_=[0,rg(160,255),0],
     graph=alt$0([0,rg(33,126),_co_]),
     _cp_=[0,rg(160,255),0],
     print=alt$0([0,rg(32,126),_cp_]),
     _cq_=[0,char$0(247),0],
     _cr_=[0,char$0(215),_cq_],
     _cs_=[0,rg(187,191),_cr_],
     _ct_=[0,rg(182,185),_cs_],
     _cu_=[0,rg(171,180),_ct_],
     _cv_=[0,rg(160,169),_cu_],
     _cw_=[0,rg(123,126),_cv_],
     _cx_=[0,rg(91,96),_cw_],
     _cy_=[0,rg(58,64),_cx_],
     punct=alt$0([0,rg(33,47),_cy_]),
     _cz_=[0,rg(9,13),0],
     space=alt$0([0,char$0(32),_cz_]),
     _cA_=[0,rg(65,70),0],
     xdigit=alt$0([0,digit,[0,rg(97,102),_cA_]]);
    function case$0(r){return [9,r]}
    function no_case(r){return [10,r]}
    function compile(r$0)
     {var
       _fC_=
        anchored(r$0)?[6,r$0]:seq$1([0,shortest(rep$0(any)),[0,[6,r$0],0]]),
       regexp=handle_case(0,_fC_),
       c=make(0),
       lnl=[0,0];
      function colorize(regexp)
       {var regexp$0=regexp;
        for(;;)
         {if(typeof regexp$0 === "number")
           switch(regexp$0)
            {case 7:lnl[1] = 1;return 0;
             case 0:
             case 1:return split(csingle(10),c);
             case 2:
             case 3:
             case 4:return split(cword,c);
             default:return 0}
          else
           switch(regexp$0[0])
            {case 0:var s=regexp$0[1];return split(s,c);
             case 1:
              var l=regexp$0[1];return caml_call2(Stdlib_List[17],colorize,l);
             case 2:
              var l$0=regexp$0[1];
              return caml_call2(Stdlib_List[17],colorize,l$0);
             case 3:var regexp$1=regexp$0[1],regexp$0=regexp$1;continue;
             case 4:
             case 5:
             case 14:var regexp$2=regexp$0[2];break;
             case 6:
             case 7:
             case 8:var regexp$2=regexp$0[1];break;
             default:throw [0,Assert_failure,_cd_]}
          var regexp$0=regexp$2;
          continue}}
      colorize(regexp);
      var
       _fB_=lnl[1],
       match=flatten(c),
       ncolor=match[3],
       color_repr=match[2],
       colors=match[1],
       lnl$0=_fB_?ncolor:-1,
       ncolor$0=_fB_?ncolor + 1 | 0:ncolor,
       ids=create_ids(0),
       pos=[0,0],
       match$0=
        translate
         (ids,332064784,0,0,-904640576,pos,[0,CSetMap[1]],colors,regexp),
       kind=match$0[2],
       r=match$0[1],
       initial=enforce_kind(ids,332064784,kind,r),
       group_count=pos[1] / 2 | 0,
       _fA_=caml_call1(_b7_[3][1],97);
      return [0,
              initial,
              0,
              colors,
              color_repr,
              ncolor$0,
              lnl$0,
              create_working_area(0),
              _fA_,
              group_count]}
    function exec_internal(name,opt,_fw_,partial,groups,re,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(_fw_)var sth$0=_fw_[1],len=sth$0;else var len=-1;
      var _fx_=pos < 0?1:0;
      if(_fx_)
       var _fy_=_fx_;
      else
       var
        _fz_=len < -1?1:0,
        _fy_=_fz_ || (caml_ml_string_length(s) < (pos + len | 0)?1:0);
      if(_fy_)caml_call1(Stdlib[1],name);
      return match_str(groups,partial,re,s,pos,len)}
    function exec(pos,len,re,s)
     {var match=exec_internal(cst_Re_exec,pos,len,0,1,re,s);
      if(typeof match === "number")throw Stdlib[8];
      var substr=match[1];
      return substr}
    function exec_opt(pos,len,re,s)
     {var match=exec_internal(cst_Re_exec_opt,pos,len,0,1,re,s);
      if(typeof match === "number")return 0;
      var substr=match[1];
      return [0,substr]}
    function execp(pos,len,re,s)
     {var match=exec_internal(cst_Re_execp,pos,len,0,0,re,s);
      return typeof match === "number"?0:1}
    function exec_partial(pos,len,re,s)
     {var match=exec_internal(cst_Re_exec_partial,pos,len,1,0,re,s);
      return typeof match === "number"?match?939392865:-1062743954:782112175}
    function marked(g,p){return caml_call2(Set[3],p,g[3])}
    function mark_set(g){return g[3]}
    function all_seq(opt,len,re,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(pos < 0)caml_call1(Stdlib[1],cst_Re_all);
      if(len)
       {var
         l=len[1],
         _fs_=l < 0?1:0,
         _ft_=_fs_ || (caml_ml_string_length(s) < (pos + l | 0)?1:0);
        if(_ft_)caml_call1(Stdlib[1],cst_Re_all$0);
        var limit=pos + l | 0}
      else
       var limit=caml_ml_string_length(s);
      function aux(pos,param)
       {if(limit <= pos)return 0;
        var match=match_str(1,0,re,s,pos,limit - pos | 0);
        if(typeof match === "number")return 0;
        var
         substr=match[1],
         match$0=caml_call2(Group[3],substr,0),
         p2=match$0[2],
         p1=match$0[1],
         pos$0=p1 === p2?p2 + 1 | 0:p2;
        return [0,substr,function(_fv_){return aux(pos$0,_fv_)}]}
      return function(_fu_){return aux(pos,_fu_)}}
    function matches_seq(pos,len,re,s)
     {var _fq_=all_seq(pos,len,re,s);
      function _fr_(sub){return caml_call2(Group[1],sub,0)}
      return caml_call1(caml_call1(Stdlib_Seq[27],_fr_),_fq_)}
    function split_full_seq(opt,len,re,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(pos < 0)caml_call1(Stdlib[1],cst_Re_split);
      if(len)
       {var
         l=len[1],
         _ff_=l < 0?1:0,
         _fg_=_ff_ || (caml_ml_string_length(s) < (pos + l | 0)?1:0);
        if(_fg_)caml_call1(Stdlib[1],cst_Re_split$0);
        var limit=pos + l | 0}
      else
       var limit=caml_ml_string_length(s);
      function aux(state,i,pos$0,param)
       {if(typeof state === "number")
         {if(limit <= pos$0)
           {if(i < limit)
             {var
               sub=caml_call3(Stdlib_String[15],s,i,limit - i | 0),
               _fj_=i + 1 | 0;
              return [0,
                      [0,936573133,sub],
                      function(_fp_){return aux(state,_fj_,pos$0,_fp_)}]}
            return 0}
          var match=match_str(1,0,re,s,pos$0,limit - pos$0 | 0);
          if(typeof match === "number")
           {if(match)return 0;
            if(i < limit)
             {var text=caml_call3(Stdlib_String[15],s,i,limit - i | 0);
              return [0,
                      [0,936573133,text],
                      function(_fo_){return aux(state,limit,pos$0,_fo_)}]}
            return 0}
          var
           substr=match[1],
           match$0=caml_call2(Group[3],substr,0),
           p2=match$0[2],
           p1=match$0[1],
           pos$1=p1 === p2?p2 + 1 | 0:p2;
          if(pos < p1)
           {var
             text$0=caml_call3(Stdlib_String[15],s,i,p1 - i | 0),
             state$0=[0,73271853,[0,-363573681,substr]];
            return [0,
                    [0,936573133,text$0],
                    function(_fn_){return aux(state$0,p2,pos$1,_fn_)}]}
          return [0,
                  [0,-363573681,substr],
                  function(_fm_){return aux(state,p2,pos$1,_fm_)}]}
        var x=state[2],_fk_=814535476;
        return [0,x,function(_fl_){return aux(_fk_,i,pos$0,_fl_)}]}
      var _fh_=814535476;
      return function(_fi_){return aux(_fh_,pos,pos,_fi_)}}
    function split_seq(pos,len,re,s)
     {var seq=split_full_seq(pos,len,re,s);
      function filter(seq,param)
       {var seq$0=seq;
        for(;;)
         {var match=caml_call1(seq$0,0);
          if(match)
           {var _fd_=match[1];
            if(936573133 <= _fd_[1])
             {var tl=match[2],s=_fd_[2];
              return [0,s,function(_fe_){return filter(tl,_fe_)}]}
            var seq$1=match[2],seq$0=seq$1;
            continue}
          return 0}}
      return function(_fc_){return filter(seq,_fc_)}}
    function list_of_seq(s)
     {var _e$_=0;
      function _fa_(l,x){return [0,x,l]}
      var _fb_=caml_call3(Stdlib_Seq[5],_fa_,_e$_,s);
      return caml_call1(Stdlib_List[9],_fb_)}
    function all$0(pos,len,re,s){return list_of_seq(all_seq(pos,len,re,s))}
    function matches(pos,len,re,s)
     {return list_of_seq(matches_seq(pos,len,re,s))}
    function split_full(pos,len,re,s)
     {return list_of_seq(split_full_seq(pos,len,re,s))}
    function split$0(pos,len,re,s)
     {return list_of_seq(split_seq(pos,len,re,s))}
    function gen_of_seq(s)
     {var r=[0,s];
      return function(param)
       {var match=caml_call1(r[1],0);
        if(match){var tl=match[2],x=match[1];r[1] = tl;return [0,x]}
        return 0}}
    function split_gen(pos,len,re,s)
     {return gen_of_seq(split_seq(pos,len,re,s))}
    function split_full_gen(pos,len,re,s)
     {return gen_of_seq(split_full_seq(pos,len,re,s))}
    function all_gen(pos,len,re,s){return gen_of_seq(all_seq(pos,len,re,s))}
    function matches_gen(pos,len,re,s)
     {return gen_of_seq(matches_seq(pos,len,re,s))}
    function replace(opt,len,_e7_,re,f,s)
     {if(opt)var sth=opt[1],pos=sth;else var pos=0;
      if(_e7_)var sth$0=_e7_[1],all=sth$0;else var all=1;
      if(pos < 0)caml_call1(Stdlib[1],cst_Re_replace);
      if(len)
       {var
         l=len[1],
         _e8_=l < 0?1:0,
         _e9_=_e8_ || (caml_ml_string_length(s) < (pos + l | 0)?1:0);
        if(_e9_)caml_call1(Stdlib[1],cst_Re_replace$0);
        var limit=pos + l | 0}
      else
       var limit=caml_ml_string_length(s);
      var buf=caml_call1(Stdlib_Buffer[1],caml_ml_string_length(s)),pos$0=pos;
      for(;;)
       {if(pos$0 < limit)
         {var match=match_str(1,0,re,s,pos$0,limit - pos$0 | 0);
          if(typeof match === "number")
           {if(! match)
             caml_call4(Stdlib_Buffer[18],buf,s,pos$0,limit - pos$0 | 0)}
          else
           {var
             substr=match[1],
             match$0=caml_call2(Group[3],substr,0),
             p2=match$0[2],
             p1=match$0[1];
            caml_call4(Stdlib_Buffer[18],buf,s,pos$0,p1 - pos$0 | 0);
            var replacing=caml_call1(f,substr);
            caml_call2(Stdlib_Buffer[16],buf,replacing);
            if(all)
             {if(p1 === p2)
               {if(p2 < limit)
                 {var _e__=caml_string_get(s,p2);
                  caml_call2(Stdlib_Buffer[12],buf,_e__)}
                var pos$1=p2 + 1 | 0}
              else
               var pos$1=p2;
              var pos$0=pos$1;
              continue}
            caml_call4(Stdlib_Buffer[18],buf,s,p2,limit - p2 | 0)}}
        return caml_call1(Stdlib_Buffer[2],buf)}}
    function replace_string(pos,len,all,re,by,s)
     {return replace(pos,len,all,re,function(param){return by},s)}
    function witness(t)
     {function witness(param)
       {var param$0=param;
        for(;;)
         {if(typeof param$0 === "number")
           return cst$1;
          else
           switch(param$0[0])
            {case 0:
              var
               c=param$0[1],
               _e1_=pick(c),
               _e2_=caml_call1(Stdlib_Char[1],_e1_);
              return caml_call2(Stdlib_String[1],1,_e2_);
             case 1:
              var xs=param$0[1],_e3_=caml_call2(Stdlib_List[19],witness,xs);
              return caml_call2(Stdlib_String[6],cst$2,_e3_);
             case 2:
              var _e4_=param$0[1];
              if(_e4_){var param$1=_e4_[1],param$0=param$1;continue}
              throw [0,Assert_failure,_cB_];
             case 3:
              var
               from=param$0[2],
               r=param$0[1],
               w=witness(r),
               b=
                caml_call1
                 (Stdlib_Buffer[1],
                  runtime.caml_mul(caml_ml_string_length(w),from)),
               _e5_=1;
              if(! (from < 1))
               {var i=_e5_;
                for(;;)
                 {caml_call2(Stdlib_Buffer[16],b,w);
                  var _e6_=i + 1 | 0;
                  if(from !== i){var i=_e6_;continue}
                  break}}
              return caml_call1(Stdlib_Buffer[2],b);
             case 10:var param$3=param$0[1],param$0=param$3;continue;
             case 4:
             case 5:
             case 14:var param$2=param$0[2];break;
             case 11:
             case 12:
             case 13:throw [0,Assert_failure,_cC_];
             default:var param$2=param$0[1]}
          var param$0=param$2;
          continue}}
      return witness(handle_case(0,t))}
    var
     get$0=Group[1],
     get_ofs=Group[3],
     get_all=Group[6],
     get_all_ofs=Group[7],
     test$0=Group[8],
     Seq=[0,all_seq,matches_seq,split_seq,split_full_seq],
     Mark=[0,marked,Set,mark_set,equal$0,compare$1],
     include$0=
      [0,
       Group,
       compile,
       exec,
       exec_opt,
       execp,
       exec_partial,
       Mark,
       all$0,
       all_gen,
       all_seq,
       matches,
       matches_gen,
       matches_seq,
       split$0,
       split_gen,
       split_seq,
       split_full,
       split_full_gen,
       split_full_seq,
       Seq,
       replace,
       replace_string,
       str,
       char$0,
       alt$0,
       seq$1,
       empty$2,
       epsilon,
       rep$0,
       rep1,
       repn,
       opt,
       bol,
       eol,
       bow,
       eow,
       bos,
       eos,
       leol,
       start$0,
       stop$0,
       word,
       not_boundary,
       whole_string,
       longest,
       shortest,
       first$0,
       greedy,
       non_greedy,
       group,
       no_group,
       nest,
       mark$0,
       set,
       rg,
       inter$0,
       diff$0,
       compl,
       any,
       notnl,
       alnum,
       wordc,
       alpha,
       ascii,
       blank,
       cntrl,
       digit,
       graph,
       lower,
       print,
       punct,
       space,
       upper,
       xdigit,
       case$0,
       no_case,
       pp$5,
       print_re,
       print_re,
       View,
       witness,
       get$0,
       get_ofs,
       get_all,
       get_all_ofs,
       test$0,
       marked,
       mark_set];
    caml_register_global(159,include$0,"Re__Core");
    var
     Parse_error=[248,cst_Re_Emacs_Parse_error,caml_fresh_oo_id(0)],
     Not_supported=[248,cst_Re_Emacs_Not_supported,caml_fresh_oo_id(0)];
    function re(opt$0,s)
     {if(opt$0)var sth=opt$0[1],case$0=sth;else var case$0=1;
      var i=[0,0],l=caml_ml_string_length(s);
      function eos$0(param){return i[1] === l?1:0}
      function test2(c$0,c)
       {var _eY_=(i[1] + 1 | 0) < l?1:0;
        if(_eY_)
         var
          _eZ_=caml_string_get(s,i[1]) === c$0?1:0,
          _e0_=_eZ_?caml_string_get(s,i[1] + 1 | 0) === c?1:0:_eZ_;
        else
         var _e0_=_eY_;
        return _e0_}
      function accept(c)
       {var
         _eW_=1 - eos$0(0),
         _eX_=_eW_?caml_string_get(s,i[1]) === c?1:0:_eW_;
        if(_eX_)i[1]++;
        return _eX_}
      function accept2(c$0,c)
       {var r=test2(c$0,c);if(r)i[1] = i[1] + 2 | 0;return r}
      function get(param){var r=caml_string_get(s,i[1]);i[1]++;return r}
      function char$1(param){if(eos$0(0))throw Parse_error;return get(0)}
      function bracket(s)
       {var s$0=s;
        for(;;)
         {if(0 !== s$0 && accept(93))return s$0;
          var c=char$1(0);
          if(accept(45))
           {if(accept(93))
             {var _eV_=[0,char$0(45),s$0];return [0,char$0(c),_eV_]}
            var c$0=char$1(0),s$1=[0,rg(c,c$0),s$0],s$0=s$1;
            continue}
          var s$2=[0,char$0(c),s$0],s$0=s$2;
          continue}}
      function branch(param)
       {var left=0;
        for(;;)
         {if(! eos$0(0) && ! test2(92,124) && ! test2(92,41))
           {if(accept(46))
             var r=notnl;
            else
             if(accept(94))
              var r=bol;
             else
              if(accept(36))
               var r=eol;
              else
               if(accept(91))
                var r=accept(94)?compl(bracket(0)):alt$0(bracket(0));
               else
                if(accept(92))
                 if(accept(40))
                  {var r$0=regexp(0);
                   if(1 - accept2(92,41))throw Parse_error;
                   var r=[6,r$0]}
                 else
                  if(accept(96))
                   var r=bos;
                  else
                   if(accept(39))
                    var r=eos;
                   else
                    if(accept(61))
                     var r=start$0;
                    else
                     if(accept(98))
                      var r=alt$0([0,bow,[0,eow,0]]);
                     else
                      if(accept(66))
                       var r=not_boundary;
                      else
                       if(accept(60))
                        var r=bow;
                       else
                        if(accept(62))
                         var r=eow;
                        else
                         if(accept(119))
                          var r=alt$0([0,alnum,[0,char$0(95),0]]);
                         else
                          if(accept(87))
                           var r=compl([0,alnum,[0,char$0(95),0]]);
                          else
                           {if(eos$0(0))throw Parse_error;
                            var c=get(0),switch$0=0;
                            if(63 <= c)
                             {if(91 <= c)
                               {if(! (95 <= c))switch$0 = 1}
                              else
                               if(! (64 <= c))switch$0 = 1}
                            else
                             if(48 <= c)
                              {if(! (58 <= c))throw Not_supported}
                             else
                              if(36 <= c)
                               switch(c - 36 | 0)
                                {case 0:case 6:case 7:case 10:switch$0 = 1;break}
                            if(! switch$0)throw Parse_error;
                            var r=char$0(c)}
                else
                 {if(eos$0(0))throw Parse_error;
                  var c$0=get(0),switch$1=0;
                  if(44 <= c$0)
                   {if(63 === c$0)switch$1 = 1}
                  else
                   if(42 <= c$0)switch$1 = 1;
                  if(switch$1)throw Parse_error;
                  var r=char$0(c$0)}
            var
             _eU_=accept(42)?rep$0(r):accept(43)?rep1(r):accept(63)?opt(r):r,
             left$0=[0,_eU_,left],
             left=left$0;
            continue}
          return seq$1(caml_call1(Stdlib_List[9],left))}}
      function regexp(param)
       {var left=branch(0),left$0=left;
        for(;;)
         {if(accept2(92,124))
           {var left$1=alt$0([0,left$0,[0,branch(0),0]]),left$0=left$1;
            continue}
          return left$0}}
      var r=regexp(0);
      if(1 - eos$0(0))throw Parse_error;
      return case$0?r:[10,r]}
    function compile_pat(opt,s)
     {if(opt)var sth=opt[1],case$0=sth;else var case$0=1;
      return compile(re([0,case$0],s))}
    var Re_Emacs=[0,Parse_error,Not_supported,re,compile,compile_pat];
    caml_register_global(160,Re_Emacs,"Re__Emacs");
    function compile_regexp(s,c)
     {var
       re$0=re([0,1 - c],s),
       _eR_=[246,function(_eT_){return compile(re$0)}];
      return [0,
              re$0,
              [246,
               function(_eS_){return compile(seq$1([0,start$0,[0,re$0,0]]))}],
              _eR_]}
    var state=[0,0];
    function string_match(re,s,p)
     {try
       {var
         _eM_=re[2],
         _eN_=caml_obj_tag(_eM_),
         _eO_=
          250 === _eN_
           ?_eM_[1]
           :246 === _eN_?caml_call1(CamlinternalLazy[2],_eM_):_eM_;
        state[1] = [0,exec([0,p],0,_eO_,s)];
        var _eP_=1;
        return _eP_}
      catch(_eQ_)
       {_eQ_ = caml_wrap_exception(_eQ_);
        if(_eQ_ === Stdlib[8]){state[1] = 0;return 0}
        throw _eQ_}}
    function string_partial_match(re,s,p)
     {var
       _eJ_=re[2],
       _eK_=caml_obj_tag(_eJ_),
       _eL_=
        250 === _eK_
         ?_eJ_[1]
         :246 === _eK_?caml_call1(CamlinternalLazy[2],_eJ_):_eJ_,
       match=exec_partial([0,p],0,_eL_,s);
      return 782112175 === match?string_match(re,s,p):939392865 <= match?1:0}
    function search_forward(re,s,p)
     {try
       {var
         _eE_=re[3],
         _eF_=caml_obj_tag(_eE_),
         _eG_=
          250 === _eF_
           ?_eE_[1]
           :246 === _eF_?caml_call1(CamlinternalLazy[2],_eE_):_eE_,
         res=exec([0,p],0,_eG_,s);
        state[1] = [0,res];
        var _eH_=caml_call2(Group[3],res,0)[1];
        return _eH_}
      catch(_eI_)
       {_eI_ = caml_wrap_exception(_eI_);
        if(_eI_ === Stdlib[8]){state[1] = 0;throw Stdlib[8]}
        throw _eI_}}
    function search_backward(re,s,p)
     {var p$0=p;
      for(;;)
       try
        {var
          _eA_=re[2],
          _eB_=caml_obj_tag(_eA_),
          _eC_=
           250 === _eB_
            ?_eA_[1]
            :246 === _eB_?caml_call1(CamlinternalLazy[2],_eA_):_eA_,
          res=exec([0,p$0],0,_eC_,s);
         state[1] = [0,res];
         return p$0}
       catch(_eD_)
        {_eD_ = caml_wrap_exception(_eD_);
         if(_eD_ === Stdlib[8])
          {state[1] = 0;
           if(0 === p$0)throw Stdlib[8];
           var p$1=p$0 - 1 | 0,p$0=p$1;
           continue}
         throw _eD_}}
    function valid_group(n)
     {var _ew_=0 <= n?1:0;
      if(_ew_)
       {var _ex_=n < 10?1:0;
        if(_ex_)
         {var _ey_=state[1];
          if(_ey_){var m=_ey_[1];return n < caml_call1(Group[9],m)?1:0}
          var _ez_=0}
        else
         var _ez_=_ex_}
      else
       var _ez_=_ew_;
      return _ez_}
    function offset_group(i)
     {var _ev_=state[1];
      if(_ev_){var m=_ev_[1];return caml_call2(Group[3],m,i)}
      throw Stdlib[8]}
    function group_len(i)
     {try
       {var match=offset_group(i),e=match[2],b=match[1],_et_=e - b | 0;
        return _et_}
      catch(_eu_)
       {_eu_ = caml_wrap_exception(_eu_);
        if(_eu_ === Stdlib[8])return 0;
        throw _eu_}}
    function replace$0(orig,repl,p,res,q,len)
     {var p$0=p,q$0=q;
      for(;;)
       {var _eq_=p$0 < len?1:0;
        if(_eq_)
         {var c=caml_string_get(repl,p$0);
          if(92 === c)
           {var c$0=caml_string_get(repl,p$0 + 1 | 0);
            if(58 <= c$0)
             {if(92 === c$0)
               {caml_bytes_set(res,q$0,92);
                var q$1=q$0 + 1 | 0,p$1=p$0 + 2 | 0,p$0=p$1,q$0=q$1;
                continue}}
            else
             if(48 <= c$0)
              {try
                {var
                  match=offset_group(c$0 - 48 | 0),
                  e=match[2],
                  b=match[1],
                  d$0=e - b | 0;
                 if(0 < d$0)caml_call5(Stdlib_String[48],orig,b,res,q$0,d$0);
                 var d=d$0}
               catch(_es_)
                {_es_ = caml_wrap_exception(_es_);
                 if(_es_ !== Stdlib[8])throw _es_;
                 var d=0,_er_=_es_}
               var q$3=q$0 + d | 0,p$3=p$0 + 2 | 0,p$0=p$3,q$0=q$3;
               continue}
            caml_bytes_set(res,q$0,92);
            caml_bytes_set(res,q$0 + 1 | 0,c$0);
            var q$2=q$0 + 2 | 0,p$2=p$0 + 2 | 0,p$0=p$2,q$0=q$2;
            continue}
          caml_bytes_set(res,q$0,c);
          var q$4=q$0 + 1 | 0,p$4=p$0 + 1 | 0,p$0=p$4,q$0=q$4;
          continue}
        return _eq_}}
    function replacement_text(repl,orig)
     {var len=caml_ml_string_length(repl),p=0,q=0;
      for(;;)
       {if(p < len)
         {if(92 === caml_string_get(repl,p))
           {var p$0=p + 1 | 0;
            if(p$0 === len)
             caml_call1(Stdlib[2],cst_Str_replace_illegal_backsl);
            var c=caml_string_get(repl,p$0),switch$0=0;
            if(58 <= c)
             if(92 === c)var q$0=q + 1 | 0;else switch$0 = 1;
            else
             if(48 <= c)
              var q$0=q + group_len(c - 48 | 0) | 0;
             else
              switch$0 = 1;
            if(switch$0)var q$0=q + 2 | 0;
            var p$1=p$0 + 1 | 0,p=p$1,q=q$0;
            continue}
          var q$1=q + 1 | 0,p$2=p + 1 | 0,p=p$2,q=q$1;
          continue}
        var res=caml_create_bytes(q);
        replace$0(orig,repl,0,res,0,caml_ml_string_length(repl));
        return caml_call1(Stdlib_Bytes[48],res)}}
    function quote$0(s)
     {var
       len=caml_ml_string_length(s),
       buf=caml_call1(Stdlib_Buffer[1],2 * len | 0),
       _em_=len - 1 | 0,
       _el_=0;
      if(! (_em_ < 0))
       {var i=_el_;
        for(;;)
         {var c=caml_string_get(s,i),_en_=c - 63 | 0,switch$0=0;
          if(31 < _en_ >>> 0)
           {var _eo_=_en_ + 27 | 0;
            if(! (10 < _eo_ >>> 0))
             switch(_eo_){case 0:case 6:case 7:case 10:switch$0 = 1;break}}
          else
           if(26 < _en_ - 1 >>> 0)switch$0 = 1;
          if(switch$0)
           {caml_call2(Stdlib_Buffer[12],buf,92);
            caml_call2(Stdlib_Buffer[12],buf,c)}
          else
           caml_call2(Stdlib_Buffer[12],buf,c);
          var _ep_=i + 1 | 0;
          if(_em_ !== i){var i=_ep_;continue}
          break}}
      return caml_call1(Stdlib_Buffer[2],buf)}
    function string_before(s,n){return caml_call3(Stdlib_String[15],s,0,n)}
    function string_after(s,n)
     {return caml_call3
              (Stdlib_String[15],s,n,caml_ml_string_length(s) - n | 0)}
    function first_chars(s,n){return caml_call3(Stdlib_String[15],s,0,n)}
    function last_chars(s,n)
     {return caml_call3
              (Stdlib_String[15],s,caml_ml_string_length(s) - n | 0,n)}
    function regexp(e){return compile_regexp(e,0)}
    function regexp_case_fold(e){return compile_regexp(e,1)}
    function regexp_string(s){return compile_regexp(quote$0(s),0)}
    function regexp_string_case_fold(s){return compile_regexp(quote$0(s),1)}
    function group_beginning(n)
     {if(1 - valid_group(n))caml_call1(Stdlib[1],cst_Str_group_beginning);
      var pos=offset_group(n)[1];
      if(-1 === pos)throw Stdlib[8];
      return pos}
    function group_end(n)
     {if(1 - valid_group(n))caml_call1(Stdlib[1],cst_Str_group_end);
      var pos=offset_group(n)[2];
      if(-1 === pos)throw Stdlib[8];
      return pos}
    function matched_group(n,txt)
     {var match=offset_group(n),e=match[2],b=match[1];
      return caml_call3(Stdlib_String[15],txt,b,e - b | 0)}
    function replace_matched(repl,matched)
     {return replacement_text(repl,matched)}
    function match_beginning(param){return group_beginning(0)}
    function match_end(param){return group_end(0)}
    function matched_string(txt){return matched_group(0,txt)}
    function substitute_first(expr,repl_fun,text)
     {try
       {var
         pos=search_forward(expr,text,0),
         _eg_=[0,string_after(text,match_end(0)),0],
         _eh_=[0,caml_call1(repl_fun,text),_eg_],
         _ei_=[0,string_before(text,pos),_eh_],
         _ej_=caml_call2(Stdlib_String[6],cst$3,_ei_);
        return _ej_}
      catch(_ek_)
       {_ek_ = caml_wrap_exception(_ek_);
        if(_ek_ === Stdlib[8])return text;
        throw _ek_}}
    function global_substitute(expr,repl_fun,text)
     {function replace(accu,start,last_was_empty)
       {var accu$0=accu,start$0=start,last_was_empty$0=last_was_empty;
        for(;;)
         {var startpos=last_was_empty$0?start$0 + 1 | 0:start$0;
          if(caml_ml_string_length(text) < startpos)
           return [0,string_after(text,start$0),accu$0];
          try
           {var pos=search_forward(expr,text,startpos)}
          catch(_ef_)
           {_ef_ = caml_wrap_exception(_ef_);
            if(_ef_ === Stdlib[8])
             return [0,string_after(text,start$0),accu$0];
            throw _ef_;
            var _ee_=_ef_}
          var
           start$1=match_end(0),
           repl_text=caml_call1(repl_fun,text),
           last_was_empty$1=start$1 === pos?1:0,
           accu$1=
            [0,
             repl_text,
             [0,
              caml_call3(Stdlib_String[15],text,start$0,pos - start$0 | 0),
              accu$0]],
           accu$0=accu$1,
           start$0=start$1,
           last_was_empty$0=last_was_empty$1;
          continue}}
      var _ec_=replace(0,0,0),_ed_=caml_call1(Stdlib_List[9],_ec_);
      return caml_call2(Stdlib_String[6],cst$4,_ed_)}
    function global_replace(expr,repl,text)
     {return global_substitute
              (expr,function(_eb_){return replacement_text(repl,_eb_)},text)}
    function replace_first(expr,repl,text)
     {return substitute_first
              (expr,function(_ea_){return replacement_text(repl,_ea_)},text)}
    function search_forward_progress(re,s,p)
     {var pos=search_forward(re,s,p);
      if(p < match_end(0))return pos;
      if(p < caml_ml_string_length(s))return search_forward(re,s,p + 1 | 0);
      throw Stdlib[8]}
    function bounded_split(expr,text,num)
     {var start=string_match(expr,text,0)?match_end(0):0;
      function split(accu,start,n)
       {if(caml_ml_string_length(text) <= start)return accu;
        if(1 === n)return [0,string_after(text,start),accu];
        try
         {var
           pos=search_forward_progress(expr,text,start),
           _d9_=match_end(0),
           _d__=
            split
             ([0,
               caml_call3(Stdlib_String[15],text,start,pos - start | 0),
               accu],
              _d9_,
              n - 1 | 0);
          return _d__}
        catch(_d$_)
         {_d$_ = caml_wrap_exception(_d$_);
          if(_d$_ === Stdlib[8])return [0,string_after(text,start),accu];
          throw _d$_}}
      var _d8_=split(0,start,num);
      return caml_call1(Stdlib_List[9],_d8_)}
    function split$1(expr,text){return bounded_split(expr,text,0)}
    function bounded_split_delim(expr,text,num)
     {function split(accu,start,n)
       {if(caml_ml_string_length(text) < start)return accu;
        if(1 === n)return [0,string_after(text,start),accu];
        try
         {var
           pos=search_forward_progress(expr,text,start),
           _d5_=match_end(0),
           _d6_=
            split
             ([0,
               caml_call3(Stdlib_String[15],text,start,pos - start | 0),
               accu],
              _d5_,
              n - 1 | 0);
          return _d6_}
        catch(_d7_)
         {_d7_ = caml_wrap_exception(_d7_);
          if(_d7_ === Stdlib[8])return [0,string_after(text,start),accu];
          throw _d7_}}
      if(runtime.caml_string_equal(text,cst$5))return 0;
      var _d4_=split(0,0,num);
      return caml_call1(Stdlib_List[9],_d4_)}
    function split_delim(expr,text){return bounded_split_delim(expr,text,0)}
    function bounded_full_split(expr,text,num)
     {function split(accu,start,n)
       {if(caml_ml_string_length(text) <= start)return accu;
        if(1 === n)return [0,[0,string_after(text,start)],accu];
        try
         {var
           pos=search_forward_progress(expr,text,start),
           s=matched_string(text);
          if(start < pos)
           var
            _d1_=match_end(0),
            _d2_=
             split
              ([0,
                [1,s],
                [0,
                 [0,caml_call3(Stdlib_String[15],text,start,pos - start | 0)],
                 accu]],
               _d1_,
               n - 1 | 0);
          else
           var _d2_=split([0,[1,s],accu],match_end(0),n - 1 | 0);
          return _d2_}
        catch(_d3_)
         {_d3_ = caml_wrap_exception(_d3_);
          if(_d3_ === Stdlib[8])return [0,[0,string_after(text,start)],accu];
          throw _d3_}}
      var _d0_=split(0,0,num);
      return caml_call1(Stdlib_List[9],_d0_)}
    function full_split(expr,text){return bounded_full_split(expr,text,0)}
    var
     Re_Str=
      [0,
       regexp,
       regexp_case_fold,
       quote$0,
       regexp_string,
       regexp_string_case_fold,
       string_match,
       search_forward,
       search_backward,
       string_partial_match,
       matched_string,
       match_beginning,
       match_end,
       matched_group,
       group_beginning,
       group_end,
       global_replace,
       replace_first,
       global_substitute,
       substitute_first,
       replace_matched,
       split$1,
       bounded_split,
       split_delim,
       bounded_split_delim,
       full_split,
       bounded_full_split,
       string_before,
       string_after,
       first_chars,
       last_chars];
    caml_register_global(162,Re_Str,"Re__Str");
    var Parse_error$0=[248,cst_Re_Glob_Parse_error,caml_fresh_oo_id(0)];
    function mul(l$0,l)
     {function _dX_(s)
       {function _dZ_(s$0){return caml_call2(Stdlib[28],s,s$0)}
        return caml_call2(Stdlib_List[19],_dZ_,l)}
      var _dY_=caml_call2(Stdlib_List[19],_dX_,l$0);
      return caml_call1(Stdlib_List[14],_dY_)}
    function explicit_period(t)
     {var _dT_=t[7];
      if(_dT_)
       {var _dU_=t[3];
        if(_dU_)var _dV_=_dU_;else var _dW_=t[4],_dV_=_dW_?t[5]:_dW_}
      else
       var _dV_=_dT_;
      return _dV_}
    function slashes(t){return t[6]?_cG_:_cH_}
    function append(opt,t,piece)
     {if(opt)
       var sth=opt[1],am_at_start_of_component=sth;
      else
       var am_at_start_of_component=0;
      return [0,[0,piece,t[1]],t[2],0,am_at_start_of_component,t[5],t[6],t[7]]}
    function next(t)
     {var _dS_=t[2];
      if(_dS_)
       {var remaining=_dS_[2],piece=_dS_[1];
        return [0,[0,piece,[0,t[1],remaining,t[3],t[4],t[5],t[6],t[7]]]]}
      return 0}
    function one(explicit_slash,slashes,explicit_period)
     {var
       _dO_=0,
       _dP_=explicit_period?[0,char$0(46),0]:0,
       _dQ_=[0,_dP_,_dO_],
       _dR_=explicit_slash?caml_call2(Stdlib_List[19],char$0,slashes):0;
      return compl(caml_call1(Stdlib_List[13],[0,_dR_,_dQ_]))}
    function enclosed(enclosed)
     {if(0 === enclosed[0]){var c=enclosed[1];return char$0(c)}
      var high=enclosed[2],low=enclosed[1];
      return rg(low,high)}
    function enclosed_set(explicit_slash,slashes,explicit_period,kind,set)
     {var
       set$0=caml_call2(Stdlib_List[19],enclosed,set),
       enclosure=596216810 <= kind?alt$0(set$0):compl(set$0);
      return inter$0
              ([0,enclosure,[0,one(explicit_slash,slashes,explicit_period),0]])}
    function exactly(state,c)
     {var
       slashes$0=slashes(state),
       am_at_start_of_component=caml_call2(Stdlib_List[36],c,slashes$0),
       chars=am_at_start_of_component?slashes$0:[0,c,0];
      return append
              ([0,am_at_start_of_component],
               state,
               alt$0(caml_call2(Stdlib_List[19],char$0,chars)))}
    function many_many(state)
     {var
       _dK_=state[7],
       explicit_period$0=_dK_?state[5]:_dK_,
       first_explicit_period=explicit_period(state),
       slashes$0=slashes(state);
      function match_component(explicit_period)
       {var _dN_=[0,rep$0(one(1,slashes$0,0)),0];
        return seq$1([0,one(1,slashes$0,explicit_period),_dN_])}
      var
       _dL_=[0,opt(match_component(explicit_period$0)),0],
       _dM_=
        [0,
         rep$0
          (seq$1([0,alt$0(caml_call2(Stdlib_List[19],char$0,slashes$0)),_dL_])),
         0];
      return append
              (0,
               state,
               seq$1([0,opt(match_component(first_explicit_period)),_dM_]))}
    function glob(opt$0,_dr_,_dq_,_dp_,_do_,_dn_,s)
     {if(opt$0)var sth=opt$0[1],anchored=sth;else var anchored=0;
      if(_dr_)var sth$0=_dr_[1],pathname=sth$0;else var pathname=1;
      if(_dq_)
       var sth$1=_dq_[1],match_backslashes=sth$1;
      else
       var match_backslashes=0;
      if(_dp_)var sth$2=_dp_[1],period=sth$2;else var period=1;
      if(_do_)var sth$3=_do_[1],expand_braces=sth$3;else var expand_braces=0;
      if(_dn_)
       var sth$4=_dn_[1],double_asterisk=sth$4;
      else
       var double_asterisk=1;
      function to_re(s)
       {var i=[0,0],l=caml_ml_string_length(s);
        function eos(param){return i[1] === l?1:0}
        function read(c)
         {var _dJ_=1 - eos(0),r=_dJ_?caml_string_get(s,i[1]) === c?1:0:_dJ_;
          if(r)i[1]++;
          return r}
        function read_ahead(pattern)
         {var pattern_len=caml_ml_string_length(pattern);
          if(l <= (i[1] + pattern_len | 0))return 0;
          try
           {var _dD_=pattern_len - 1 | 0,_dC_=0;
            if(! (_dD_ < 0))
             {var j=_dC_;
              for(;;)
               {var _dF_=1 - eos(0);
                if(_dF_)
                 var
                  _dG_=caml_string_get(pattern,j),
                  found=caml_string_get(s,i[1] + j | 0) === _dG_?1:0;
                else
                 var found=_dF_;
                if(1 - found)throw Stdlib[3];
                var _dH_=j + 1 | 0;
                if(_dD_ !== j){var j=_dH_;continue}
                break}}
            i[1] = i[1] + pattern_len | 0;
            var _dE_=1;
            return _dE_}
          catch(_dI_)
           {_dI_ = caml_wrap_exception(_dI_);
            if(_dI_ === Stdlib[3])return 0;
            throw _dI_}}
        function char$0(param)
         {read(92);
          if(eos(0))throw Parse_error$0;
          var r=caml_string_get(s,i[1]);
          i[1]++;
          return r}
        function enclosed(param)
         {var s=0;
          for(;;)
           {if(0 !== s && read(93))return s;
            var c=char$0(0);
            if(read(45))
             {if(read(93))return [0,[0,c],[0,_cD_,s]];
              var c$0=char$0(0),s$0=[0,[1,c,c$0],s],s=s$0;
              continue}
            var s$1=[0,[0,c],s],s=s$1;
            continue}}
        var pieces=0;
        for(;;)
         {if(eos(0))
           {var
             glob=caml_call1(Stdlib_List[9],pieces),
             state=[0,0,glob,1,1,pathname,match_backslashes,period],
             state$8=state;
            for(;;)
             {var match$0=next(state$8);
              if(match$0)
               {var
                 match$1=match$0[1],
                 state$9=match$1[2],
                 p=match$1[1],
                 explicit_slash$0=state$9[5],
                 explicit_period$1=explicit_period(state$9),
                 slashes$1=slashes(state$9);
                if(typeof p === "number")
                 switch(p)
                  {case 0:
                    var
                     state$10=
                      append
                       (0,
                        state$9,
                        one(explicit_slash$0,slashes$1,explicit_period$1));
                    break;
                   case 1:
                    var
                     explicit_slash=state$9[5],
                     explicit_period$0=explicit_period(state$9),
                     slashes$0=slashes(state$9);
                    if(explicit_period$0)
                     if(explicit_slash)
                      {var
                        _dv_=[0,rep$0(one(1,slashes$0,0)),0],
                        not_empty=seq$1([0,one(1,slashes$0,1),_dv_]),
                        maybe_empty=opt(not_empty),
                        enclosed_set$1=
                         function(slashes,not_empty)
                          {function enclosed_set$0(state,kind,set)
                            {var
                              _dB_=
                               [0,
                                seq$1
                                 ([0,not_empty,[0,enclosed_set(1,slashes,0,kind,set),0]]),
                                0];
                             return append
                                     (0,state,alt$0([0,enclosed_set(1,slashes,1,kind,set),_dB_]))}
                           return enclosed_set$0},
                        enclosed_set$0=enclosed_set$1(slashes$0,not_empty),
                        state$0=state$9;
                       for(;;)
                        {var match=next(state$0);
                         if(match)
                          {var _dw_=match[1],_dx_=_dw_[1];
                           if(typeof _dx_ === "number")
                            switch(_dx_)
                             {case 0:
                               var state$1=_dw_[2],_dy_=append(0,state$1,not_empty);break;
                              case 1:var state$2=_dw_[2],state$0=state$2;continue;
                              default:var state$3=_dw_[2],_dy_=many_many(state$3)}
                           else
                            switch(_dx_[0])
                             {case 0:
                               var
                                state$4=_dw_[2],
                                c=_dx_[1],
                                not_empty$0=46 === c?not_empty:maybe_empty,
                                state$5=append(0,state$4,not_empty$0),
                                _dy_=exactly(state$5,c);
                               break;
                              case 1:
                               var
                                state$6=_dw_[2],
                                enclosed$0=_dx_[1],
                                _dy_=enclosed_set$0(state$6,596216810,enclosed$0);
                               break;
                              default:
                               var
                                state$7=_dw_[2],
                                enclosed$1=_dx_[1],
                                _dy_=enclosed_set$0(state$7,-188280562,enclosed$1)}}
                         else
                          var _dy_=append(0,state$0,maybe_empty);
                         var _dA_=_dy_;
                         break}}
                     else
                      var
                       _dz_=[0,rep$0(one(0,slashes$0,0)),0],
                       _dA_=
                        append
                         (0,
                          state$9,
                          opt(seq$1([0,one(0,slashes$0,explicit_period$0),_dz_])));
                    else
                     var
                      _dA_=
                       append
                        (0,
                         state$9,
                         rep$0(one(explicit_slash,slashes$0,explicit_period$0)));
                    var state$10=_dA_;
                    break;
                   default:var state$10=many_many(state$9)}
                else
                 switch(p[0])
                  {case 0:var c$0=p[1],state$10=exactly(state$9,c$0);break;
                   case 1:
                    var
                     enclosed$2=p[1],
                     state$10=
                      append
                       (0,
                        state$9,
                        enclosed_set
                         (explicit_slash$0,
                          slashes$1,
                          explicit_period$1,
                          596216810,
                          enclosed$2));
                    break;
                   default:
                    var
                     enclosed$3=p[1],
                     state$10=
                      append
                       (0,
                        state$9,
                        enclosed_set
                         (explicit_slash$0,
                          slashes$1,
                          explicit_period$1,
                          -188280562,
                          enclosed$3))}
                var state$8=state$10;
                continue}
              var re=seq$1(caml_call1(Stdlib_List[9],state$8[1]));
              return anchored?whole_string(re):re}}
          var switch$0=0;
          if(double_asterisk && read_ahead(cst$6) && ! eos(0))
           var _du_=2;
          else
           switch$0 = 1;
          if(switch$0)
           if(read(42))
            {var switch$1=0;
             if(double_asterisk && read(42))var _du_=2;else switch$1 = 1;
             if(switch$1)var _du_=1}
           else
            if(read(63))
             var _du_=0;
            else
             if(read(91))
              {var switch$2=0;
               if(read(94) || read(33))
                switch$2 = 1;
               else
                var _du_=[1,enclosed(0)];
               if(switch$2)var _du_=[2,enclosed(0)]}
             else
              var _du_=[0,char$0(0)];
          var pieces$0=[0,_du_,pieces],pieces=pieces$0;
          continue}}
      if(expand_braces)
       {var
         l=caml_ml_string_length(s),
         expl=
          function(inner,s$0,i,acc,beg$0)
           {var s$1=s$0,i$0=i,acc$0=acc,beg$1=beg$0;
            for(;;)
             {if(l <= i$0)
               {if(inner)throw Parse_error$0;
                return [0,
                        mul
                         (beg$1,
                          [0,caml_call3(Stdlib_String[15],s,s$1,i$0 - s$1 | 0),0]),
                        i$0]}
              var match=caml_string_get(s,i$0);
              if(44 === match)
               {if(inner)
                 {var
                   _ds_=
                    mul
                     (beg$1,
                      [0,caml_call3(Stdlib_String[15],s,s$1,i$0 - s$1 | 0),0]),
                   acc$1=caml_call2(Stdlib[37],_ds_,acc$0),
                   i$1=i$0 + 1 | 0,
                   s$2=i$0 + 1 | 0,
                   s$1=s$2,
                   i$0=i$1,
                   acc$0=acc$1,
                   beg$1=beg;
                  continue}}
              else
               if(123 <= match)
                {if(! (126 <= match))
                  switch(match - 123 | 0)
                   {case 0:
                     var
                      match$0=expl(1,i$0 + 1 | 0,i$0 + 1 | 0,0,_cE_),
                      i$3=match$0[2],
                      t=match$0[1],
                      beg$2=
                       mul
                        (beg$1,
                         mul
                          ([0,caml_call3(Stdlib_String[15],s,s$1,i$0 - s$1 | 0),0],t)),
                      s$1=i$3,
                      i$0=i$3,
                      beg$1=beg$2;
                     continue;
                    case 1:break;
                    default:
                     if(inner)
                      {var
                        _dt_=
                         mul
                          (beg$1,
                           [0,caml_call3(Stdlib_String[15],s,s$1,i$0 - s$1 | 0),0]);
                       return [0,caml_call2(Stdlib[37],_dt_,acc$0),i$0 + 1 | 0]}}}
               else
                if(92 === match){var i$4=i$0 + 2 | 0,i$0=i$4;continue}
              var i$2=i$0 + 1 | 0,i$0=i$2;
              continue}},
         _dl_=expl(0,0,0,0,_cF_)[1],
         _dm_=caml_call1(Stdlib_List[9],_dl_);
        return alt$0(caml_call2(Stdlib_List[19],to_re,_dm_))}
      return to_re(s)}
    function glob$0(anchored,period,s)
     {return glob(anchored,0,0,[0,period],0,0,s)}
    function globx(anchored,s){return glob(anchored,0,0,0,_cI_,0,s)}
    function globx$0(anchored,period,s)
     {return glob(anchored,0,0,[0,period],_cJ_,0,s)}
    var Re_Glob=[0,Parse_error$0,glob,glob$0,globx,globx$0];
    caml_register_global(163,Re_Glob,"Re__Glob");
    var
     Parse_error$1=[248,cst_Re_Perl_Parse_error,caml_fresh_oo_id(0)],
     Not_supported$0=[248,cst_Re_Perl_Not_supported,caml_fresh_oo_id(0)];
    function posix_class_of_string(class$0)
     {var switch$0=runtime.caml_string_compare(class$0,cst_lower);
      if(0 <= switch$0)
       {if(! (0 < switch$0))return lower;
        if(! caml_string_notequal(class$0,cst_print))return print;
        if(! caml_string_notequal(class$0,cst_punct))return punct;
        if(! caml_string_notequal(class$0,cst_space))return space;
        if(! caml_string_notequal(class$0,cst_upper))return upper;
        if(! caml_string_notequal(class$0,cst_word))return wordc;
        if(! caml_string_notequal(class$0,cst_xdigit))return xdigit}
      else
       {if(! caml_string_notequal(class$0,cst_alnum))return alnum;
        if(! caml_string_notequal(class$0,cst_alpha))return alpha;
        if(! caml_string_notequal(class$0,cst_ascii))return ascii;
        if(! caml_string_notequal(class$0,cst_blank))return blank;
        if(! caml_string_notequal(class$0,cst_cntrl))return cntrl;
        if(! caml_string_notequal(class$0,cst_digit))return digit;
        if(! caml_string_notequal(class$0,cst_graph))return graph}
      var _dk_=caml_call2(Stdlib[28],cst_Invalid_pcre_class,class$0);
      return caml_call1(Stdlib[1],_dk_)}
    function re$0(opt$0,s)
     {if(opt$0)var sth=opt$0[1],opts=sth;else var opts=0;
      var
       ungreedy=caml_call2(Stdlib_List[37],-243745063,opts),
       dotall=caml_call2(Stdlib_List[37],-424303016,opts),
       dollar_endonly=caml_call2(Stdlib_List[37],-712595228,opts),
       multiline=caml_call2(Stdlib_List[37],1071952589,opts),
       i=[0,0],
       l=caml_ml_string_length(s);
      function eos$0(param){return i[1] === l?1:0}
      function test(c)
       {var
         _di_=1 - eos$0(0),
         _dj_=_di_?caml_string_get(s,i[1]) === c?1:0:_di_;
        return _dj_}
      function accept(c){var r=test(c);if(r)i[1]++;return r}
      function accept_s(s$0)
       {var len=caml_ml_string_length(s$0);
        try
         {var _dc_=len - 1 | 0,_db_=0;
          if(! (_dc_ < 0))
           {var j=_db_;
            for(;;)
             {try
               {var _de_=caml_string_get(s,i[1] + j | 0);
                if(caml_string_get(s$0,j) !== _de_)throw Stdlib[3]}
              catch(_dh_){throw Stdlib[3]}
              var _df_=j + 1 | 0;
              if(_dc_ !== j){var j=_df_;continue}
              break}}
          i[1] = i[1] + len | 0;
          var _dd_=1;
          return _dd_}
        catch(_dg_)
         {_dg_ = caml_wrap_exception(_dg_);
          if(_dg_ === Stdlib[3])return 0;
          throw _dg_}}
      function get(param){var r=caml_string_get(s,i[1]);i[1]++;return r}
      function unget(param){i[1] += -1;return 0}
      function greedy_mod(r)
       {var gr=accept(63),gr$0=ungreedy?1 - gr:gr;
        return gr$0?non_greedy(r):greedy(r)}
      function integer(param)
       {if(eos$0(0))return 0;
        var d=get(0);
        if(9 < d - 48 >>> 0){unget(0);return 0}
        var i=d - 48 | 0,i$0=i;
        for(;;)
         {if(eos$0(0))return [0,i$0];
          var d$0=get(0);
          if(9 < d$0 - 48 >>> 0){unget(0);return [0,i$0]}
          var i$1=(10 * i$0 | 0) + (d$0 - 48 | 0) | 0;
          if(i$1 < i$0)throw Parse_error$1;
          var i$0=i$1;
          continue}}
      function char$1(param)
       {if(eos$0(0))throw Parse_error$1;
        var c=get(0);
        if(91 === c)
         {if(accept(61))throw Not_supported$0;
          if(accept(58))
           {var compl$0=accept(94);
            try
             {var cls=caml_call2(Stdlib_List[38],accept_s,posix_class_strings)}
            catch(_da_)
             {_da_ = caml_wrap_exception(_da_);
              if(_da_ === Stdlib[8])throw Parse_error$1;
              throw _da_}
            if(1 - accept_s(cst$7))throw Parse_error$1;
            var
             posix_class=posix_class_of_string(cls),
             re=compl$0?compl([0,posix_class,0]):posix_class;
            return [0,4150146,re]}
          if(accept(46))
           {if(eos$0(0))throw Parse_error$1;
            var c$0=get(0);
            if(1 - accept(46))throw Not_supported$0;
            if(1 - accept(93))throw Parse_error$1;
            return [0,748194550,c$0]}
          return [0,748194550,c]}
        if(92 === c)
         {if(eos$0(0))throw Parse_error$1;
          var c$1=get(0);
          if(58 <= c$1)
           {if(! (123 <= c$1))
             switch(c$1 - 58 | 0)
              {case 10:return [0,4150146,compl([0,digit,0])];
               case 25:return [0,4150146,compl([0,space,0])];
               case 29:return [0,4150146,compl([0,alnum,[0,char$0(95),0]])];
               case 40:return _cK_;
               case 42:return [0,4150146,digit];
               case 52:return _cL_;
               case 56:return _cM_;
               case 57:return [0,4150146,space];
               case 58:return _cN_;
               case 61:return [0,4150146,alt$0([0,alnum,[0,char$0(95),0]])];
               case 0:
               case 1:
               case 2:
               case 3:
               case 4:
               case 5:
               case 6:
               case 33:
               case 34:
               case 35:
               case 36:
               case 37:
               case 38:break;
               default:throw Parse_error$1}}
          else
           if(48 <= c$1)throw Not_supported$0;
          return [0,748194550,c$1]}
        return [0,748194550,c]}
      function bracket(s)
       {var s$0=s;
        for(;;)
         {if(0 !== s$0 && accept(93))return s$0;
          var match=char$1(0);
          if(748194550 <= match[1])
           {var c=match[2];
            if(accept(45))
             {if(accept(93))
               {var _c__=[0,char$0(45),s$0];return [0,char$0(c),_c__]}
              var match$0=char$1(0);
              if(748194550 <= match$0[1])
               {var c$0=match$0[2],s$1=[0,rg(c,c$0),s$0],s$0=s$1;continue}
              var
               st=match$0[2],
               _c$_=[0,char$0(45),[0,st,s$0]],
               s$2=[0,char$0(c),_c$_],
               s$0=s$2;
              continue}
            var s$3=[0,char$0(c),s$0],s$0=s$3;
            continue}
          var st$0=match[2],s$4=[0,st$0,s$0],s$0=s$4;
          continue}}
      function atom(param)
       {if(accept(46))return dotall?any:notnl;
        if(accept(40))
         {if(accept(63))
           {if(accept(58))
             {var r=regexp(0);if(1 - accept(41))throw Parse_error$1;return r}
            if(accept(35))
             for(;;)
              {if(eos$0(0))throw Parse_error$1;
               if(accept(41))return epsilon;
               i[1]++;
               continue}
            throw Parse_error$1}
          var r$0=regexp(0);
          if(1 - accept(41))throw Parse_error$1;
          return [6,r$0]}
        if(accept(94))return multiline?bol:bos;
        if(accept(36))return multiline?eol:dollar_endonly?leol:eos;
        if(accept(91))return accept(94)?compl(bracket(0)):alt$0(bracket(0));
        if(accept(92))
         {if(eos$0(0))throw Parse_error$1;
          var c=get(0),switcher=c - 48 | 0;
          if(! (74 < switcher >>> 0))
           switch(switcher)
            {case 17:return bos;
             case 18:return not_boundary;
             case 20:return compl([0,digit,0]);
             case 23:return start$0;
             case 35:return compl([0,space,0]);
             case 39:return compl([0,alnum,[0,char$0(95),0]]);
             case 42:return leol;
             case 50:return alt$0([0,bow,[0,eow,0]]);
             case 52:return digit;
             case 67:return space;
             case 71:return alt$0([0,alnum,[0,char$0(95),0]]);
             case 74:return eos;
             case 0:
             case 1:
             case 2:
             case 3:
             case 4:
             case 5:
             case 6:
             case 7:
             case 8:
             case 9:throw Not_supported$0;
             case 10:
             case 11:
             case 12:
             case 13:
             case 14:
             case 15:
             case 16:
             case 43:
             case 44:
             case 45:
             case 46:
             case 47:
             case 48:break;
             default:throw Parse_error$1}
          return char$0(c)}
        if(eos$0(0))throw Parse_error$1;
        var c$0=get(0),switch$0=0;
        if(64 <= c$0)
         {if(92 !== c$0 && 123 !== c$0)switch$0 = 1}
        else
         if(44 <= c$0)
          {if(! (63 <= c$0))switch$0 = 1}
         else
          if(! (42 <= c$0))switch$0 = 1;
        if(switch$0)return char$0(c$0);
        throw Parse_error$1}
      function branch(param)
       {var left=0;
        for(;;)
         {if(! eos$0(0) && ! test(124) && ! test(41))
           {var r=atom(0);
            if(accept(42))
             var _c9_=greedy_mod(rep$0(r));
            else
             if(accept(43))
              var _c9_=greedy_mod(rep1(r));
             else
              if(accept(63))
               var _c9_=greedy_mod(opt(r));
              else
               if(accept(123))
                {var match=integer(0);
                 if(match)
                  {var i=match[1],j=accept(44)?integer(0):[0,i];
                   if(1 - accept(125))throw Parse_error$1;
                   if(j){var j$0=j[1];if(j$0 < i)throw Parse_error$1}
                   var _c9_=greedy_mod(repn(r,i,j))}
                 else
                  {unget(0);var _c9_=r}}
               else
                var _c9_=r;
            var left$0=[0,_c9_,left],left=left$0;
            continue}
          return seq$1(caml_call1(Stdlib_List[9],left))}}
      function regexp(param)
       {var left=branch(0),left$0=left;
        for(;;)
         {if(accept(124))
           {var left$1=alt$0([0,left$0,[0,branch(0),0]]),left$0=left$1;
            continue}
          return left$0}}
      var r=regexp(0);
      if(1 - eos$0(0))throw Parse_error$1;
      var
       r$0=
        caml_call2(Stdlib_List[37],616470068,opts)
         ?seq$1([0,start$0,[0,r,0]])
         :r,
       r$1=caml_call2(Stdlib_List[37],604571177,opts)?[10,r$0]:r$0;
      return r$1}
    function compile_pat$0(opt,s)
     {if(opt)var sth=opt[1],opts=sth;else var opts=0;
      return compile(re$0([0,opts],s))}
    var Re_Perl=[0,Parse_error$1,Not_supported$0,re$0,compile,compile_pat$0];
    caml_register_global(164,Re_Perl,"Re__Perl");
    function re$1(opt,pat)
     {if(opt)var sth=opt[1],flags=sth;else var flags=0;
      function _c8_(param)
       {return 601676297 === param
                ?604571177
                :613575188 <= param?616470068:1071952589}
      var opts=caml_call2(Stdlib_List[19],_c8_,flags);
      return re$0([0,opts],pat)}
    function regexp$0(flags,pat){return compile(re$1(flags,pat))}
    function extract(rex,s)
     {var _c7_=exec(0,0,rex,s);return caml_call1(Group[6],_c7_)}
    function exec$0(rex,pos,s){return exec(pos,0,rex,s)}
    function get_substring(s,i){return caml_call2(Group[1],s,i)}
    function get_substring_ofs(s,i){return caml_call2(Group[3],s,i)}
    function pmatch(rex,s){return execp(0,0,rex,s)}
    function substitute(rex,subst,str)
     {var b=caml_call1(Stdlib_Buffer[1],1024),pos=0;
      for(;;)
       {if(caml_ml_string_length(str) <= pos)
         return caml_call1(Stdlib_Buffer[2],b);
        if(execp([0,pos],0,rex,str))
         {var
           ss=exec([0,pos],0,rex,str),
           match=caml_call2(Group[3],ss,0),
           fin=match[2],
           start=match[1],
           pat=caml_call2(Group[1],ss,0);
          caml_call4(Stdlib_Buffer[18],b,str,pos,start - pos | 0);
          var _c6_=caml_call1(subst,pat);
          caml_call2(Stdlib_Buffer[16],b,_c6_);
          var pos=fin;
          continue}
        caml_call4
         (Stdlib_Buffer[18],b,str,pos,caml_ml_string_length(str) - pos | 0);
        var pos$0=caml_ml_string_length(str),pos=pos$0;
        continue}}
    function split$2(rex,str)
     {var accu=0,pos=0;
      for(;;)
       {if(caml_ml_string_length(str) <= pos)
         return caml_call1(Stdlib_List[9],accu);
        if(execp([0,pos],0,rex,str))
         {var
           ss=exec([0,pos],0,rex,str),
           match=caml_call2(Group[3],ss,0),
           fin=match[2],
           start=match[1],
           s=caml_call3(Stdlib_String[15],str,pos,start - pos | 0),
           accu$0=[0,s,accu],
           accu=accu$0,
           pos=fin;
          continue}
        var
         s$0=
          caml_call3
           (Stdlib_String[15],str,pos,caml_ml_string_length(str) - pos | 0),
         pos$0=caml_ml_string_length(str),
         accu$1=[0,s$0,accu],
         accu=accu$1,
         pos=pos$0;
        continue}}
    function quote$1(s)
     {var
       len=caml_ml_string_length(s),
       s$0=caml_create_bytes(len << 1),
       pos=[0,0],
       _c2_=len - 1 | 0,
       _c1_=0;
      if(! (_c2_ < 0))
       {var i=_c1_;
        for(;;)
         {var c=runtime.caml_string_unsafe_get(s,i),switch$0=0;
          if(91 <= c)
           {var _c4_=c - 93 | 0;
            if(29 < _c4_ >>> 0)
             {if(! (32 <= _c4_))switch$0 = 1}
            else
             if(1 === _c4_)switch$0 = 1}
          else
           if(47 <= c)
            {if(63 === c)switch$0 = 1}
           else
            if(36 <= c)
             switch(c - 36 | 0)
              {case 1:case 2:case 3:case 8:case 9:break;default:switch$0 = 1}
          if(switch$0)
           {caml_bytes_unsafe_set(s$0,pos[1],92);
            pos[1]++;
            caml_bytes_unsafe_set(s$0,pos[1],c);
            pos[1]++}
          else
           {caml_bytes_unsafe_set(s$0,pos[1],c);pos[1]++}
          var _c5_=i + 1 | 0;
          if(_c2_ !== i){var i=_c5_;continue}
          break}}
      var _c3_=pos[1],r=caml_create_bytes(_c3_);
      runtime.caml_blit_bytes(s$0,0,r,0,_c3_);
      return caml_call1(Stdlib_Bytes[48],r)}
    function full_split$0(opt,rex,s)
     {if(opt)var sth=opt[1],max=sth;else var max=0;
      if(0 === caml_ml_string_length(s))return 0;
      if(1 === max)return [0,[0,s],0];
      var results=split_full(0,0,rex,s);
      function _cV_(param)
       {if(936573133 <= param[1]){var s=param[2];return [0,[0,s],0]}
        var
         d=param[2],
         matches=caml_call1(Group[7],d),
         delim=caml_call2(Group[1],d,0),
         l=[0,0],
         _cX_=matches.length - 1 - 1 | 0,
         _cW_=1;
        if(! (_cX_ < 1))
         {var i=_cW_;
          for(;;)
           {var
             _cY_=l[1],
             _cZ_=
              caml_equal(caml_check_bound(matches,i)[1 + i],_cO_)
               ?0
               :[2,i,caml_call2(Group[1],d,i)];
            l[1] = [0,_cZ_,_cY_];
            var _c0_=i + 1 | 0;
            if(_cX_ !== i){var i=_c0_;continue}
            break}}
        return [0,[1,delim],caml_call1(Stdlib_List[9],l[1])]}
      var matches=caml_call2(Stdlib_List[19],_cV_,results);
      return caml_call1(Stdlib_List[13],matches)}
    var
     Re_Pcre=
      [0,
       re$1,
       regexp$0,
       extract,
       exec$0,
       get_substring,
       get_substring_ofs,
       pmatch,
       substitute,
       full_split$0,
       split$2,
       quote$1];
    caml_register_global(165,Re_Pcre,"Re__Pcre");
    var
     Parse_error$2=[248,cst_Re_Posix_Parse_error,caml_fresh_oo_id(0)],
     Not_supported$1=[248,cst_Re_Posix_Not_supported,caml_fresh_oo_id(0)];
    function re$2(opt$0,s)
     {if(opt$0)var sth=opt$0[1],opts=sth;else var opts=0;
      var
       newline=caml_call2(Stdlib_List[37],-638074828,opts),
       i=[0,0],
       l=caml_ml_string_length(s);
      function eos$0(param){return i[1] === l?1:0}
      function test(c)
       {var
         _cT_=1 - eos$0(0),
         _cU_=_cT_?caml_string_get(s,i[1]) === c?1:0:_cT_;
        return _cU_}
      function accept(c){var r=test(c);if(r)i[1]++;return r}
      function get(param){var r=caml_string_get(s,i[1]);i[1]++;return r}
      function unget(param){i[1] += -1;return 0}
      function char$1(param)
       {if(eos$0(0))throw Parse_error$2;
        var c=get(0);
        if(91 === c)
         {if(accept(61))throw Not_supported$1;
          if(accept(58))throw Not_supported$1;
          if(accept(46))
           {if(eos$0(0))throw Parse_error$2;
            var c$0=get(0);
            if(1 - accept(46))throw Not_supported$1;
            if(1 - accept(93))throw Parse_error$2;
            return c$0}
          return c}
        return c}
      function bracket(s)
       {var s$0=s;
        for(;;)
         {if(0 !== s$0 && accept(93))return s$0;
          var c=char$1(0);
          if(accept(45))
           {if(accept(93))
             {var _cS_=[0,char$0(45),s$0];return [0,char$0(c),_cS_]}
            var c$0=char$1(0),s$1=[0,rg(c,c$0),s$0],s$0=s$1;
            continue}
          var s$2=[0,char$0(c),s$0],s$0=s$2;
          continue}}
      function integer(param)
       {if(eos$0(0))return 0;
        var d=get(0);
        if(9 < d - 48 >>> 0){unget(0);return 0}
        var i=d - 48 | 0,i$0=i;
        for(;;)
         {if(eos$0(0))return [0,i$0];
          var d$0=get(0);
          if(9 < d$0 - 48 >>> 0){unget(0);return [0,i$0]}
          var i$1=(10 * i$0 | 0) + (d$0 - 48 | 0) | 0;
          if(i$1 < i$0)throw Parse_error$2;
          var i$0=i$1;
          continue}}
      function branch(param)
       {var left=0;
        for(;;)
         {if(! eos$0(0) && ! test(124) && ! test(41))
           {if(accept(46))
             var r=newline?notnl:any;
            else
             if(accept(40))
              {var r$0=regexp(0);
               if(1 - accept(41))throw Parse_error$2;
               var r=[6,r$0]}
             else
              if(accept(94))
               var r=newline?bol:bos;
              else
               if(accept(36))
                var r=newline?eol:eos;
               else
                if(accept(91))
                 if(accept(94))
                  var _cQ_=char$0(10),r=diff$0(compl(bracket(0)),_cQ_);
                 else
                  var r=alt$0(bracket(0));
                else
                 if(accept(92))
                  {if(eos$0(0))throw Parse_error$2;
                   var c=get(0),switch$0=0;
                   if(91 <= c)
                    {var _cR_=c - 93 | 0;
                     if(29 < _cR_ >>> 0)
                      {if(! (32 <= _cR_))switch$0 = 1}
                     else
                      if(1 === _cR_)switch$0 = 1}
                   else
                    if(47 <= c)
                     {if(63 === c)switch$0 = 1}
                    else
                     if(36 <= c)
                      switch(c - 36 | 0)
                       {case 1:
                        case 2:
                        case 3:
                        case 8:
                        case 9:break;
                        default:switch$0 = 1}
                   if(! switch$0)throw Parse_error$2;
                   var r=char$0(c)}
                 else
                  {if(eos$0(0))throw Parse_error$2;
                   var c$0=get(0),switch$1=0;
                   if(64 <= c$0)
                    {if(92 !== c$0 && 123 !== c$0)switch$1 = 1}
                   else
                    if(44 <= c$0)
                     {if(! (63 <= c$0))switch$1 = 1}
                    else
                     if(! (42 <= c$0))switch$1 = 1;
                   if(! switch$1)throw Parse_error$2;
                   var r=char$0(c$0)}
            if(accept(42))
             var _cP_=rep$0([8,r]);
            else
             if(accept(43))
              var _cP_=rep1([8,r]);
             else
              if(accept(63))
               var _cP_=opt(r);
              else
               if(accept(123))
                {var match=integer(0);
                 if(match)
                  {var i=match[1],j=accept(44)?integer(0):[0,i];
                   if(1 - accept(125))throw Parse_error$2;
                   if(j){var j$0=j[1];if(j$0 < i)throw Parse_error$2}
                   var _cP_=repn([8,r],i,j)}
                 else
                  {unget(0);var _cP_=r}}
               else
                var _cP_=r;
            var left$0=[0,_cP_,left],left=left$0;
            continue}
          return seq$1(caml_call1(Stdlib_List[9],left))}}
      function regexp(param)
       {var left=branch(0),left$0=left;
        for(;;)
         {if(accept(124))
           {var left$1=alt$0([0,left$0,[0,branch(0),0]]),left$0=left$1;
            continue}
          return left$0}}
      var r=regexp(0);
      if(1 - eos$0(0))throw Parse_error$2;
      var
       r$0=caml_call2(Stdlib_List[37],886285209,opts)?[10,r]:r,
       r$1=caml_call2(Stdlib_List[37],853495711,opts)?[7,r$0]:r$0;
      return r$1}
    function compile$0(re){return compile(longest(re))}
    function compile_pat$1(opt,s)
     {if(opt)var sth=opt[1],opts=sth;else var opts=0;
      return compile$0(re$2([0,opts],s))}
    var
     Re_Posix=
      [0,Parse_error$2,Not_supported$1,re$2,compile$0,compile_pat$1];
    caml_register_global(166,Re_Posix,"Re__Posix");
    var
     Re$0=
      [0,
       Group,
       compile,
       exec,
       exec_opt,
       execp,
       exec_partial,
       Mark,
       all$0,
       all_gen,
       all_seq,
       matches,
       matches_gen,
       matches_seq,
       split$0,
       split_gen,
       split_seq,
       split_full,
       split_full_gen,
       split_full_seq,
       Seq,
       replace,
       replace_string,
       str,
       char$0,
       alt$0,
       seq$1,
       empty$2,
       epsilon,
       rep$0,
       rep1,
       repn,
       opt,
       bol,
       eol,
       bow,
       eow,
       bos,
       eos,
       leol,
       start$0,
       stop$0,
       word,
       not_boundary,
       whole_string,
       longest,
       shortest,
       first$0,
       greedy,
       non_greedy,
       group,
       no_group,
       nest,
       mark$0,
       set,
       rg,
       inter$0,
       diff$0,
       compl,
       any,
       notnl,
       alnum,
       wordc,
       alpha,
       ascii,
       blank,
       cntrl,
       digit,
       graph,
       lower,
       print,
       punct,
       space,
       upper,
       xdigit,
       case$0,
       no_case,
       pp$5,
       print_re,
       print_re,
       View,
       witness,
       get$0,
       get_ofs,
       get_all,
       get_all_ofs,
       test$0,
       marked,
       mark_set];
    caml_register_global(167,Re$0,"Re");
    return}
  (globalThis));


//# 1 "../.js/tyxml.functor/tyxml_f.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_float_of_string=runtime.caml_float_of_string,
     caml_list_of_js_array=runtime.caml_list_of_js_array,
     caml_ml_string_length=runtime.caml_ml_string_length,
     caml_register_global=runtime.caml_register_global,
     caml_string_equal=runtime.caml_string_equal,
     caml_string_notequal=runtime.caml_string_notequal,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    function caml_call5(f,a0,a1,a2,a3,a4)
     {return f.length == 5
              ?f(a0,a1,a2,a3,a4)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4])}
    function caml_call6(f,a0,a1,a2,a3,a4,a5)
     {return f.length == 6
              ?f(a0,a1,a2,a3,a4,a5)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5])}
    function caml_call7(f,a0,a1,a2,a3,a4,a5,a6)
     {return f.length == 7
              ?f(a0,a1,a2,a3,a4,a5,a6)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5,a6])}
    function caml_call11(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
     {return f.length == 11
              ?f(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_Xml_stream_Malformed_strea=
      caml_string_of_jsbytes("Xml_stream.Malformed_stream"),
     cst_xmlns$1=caml_string_of_jsbytes("xmlns"),
     cst$30=caml_string_of_jsbytes(""),
     cst_xmlns$2=caml_string_of_jsbytes("xmlns"),
     cst$26=caml_string_of_jsbytes(""),
     cst$27=caml_string_of_jsbytes(" -->\n"),
     cst$28=caml_string_of_jsbytes("<!-- "),
     cst$29=caml_string_of_jsbytes("\n"),
     cst$12=caml_string_of_jsbytes(" "),
     cst$13=caml_string_of_jsbytes(" />"),
     cst$14=caml_string_of_jsbytes("<"),
     cst$15=caml_string_of_jsbytes(">"),
     cst$16=caml_string_of_jsbytes("><\/"),
     cst$17=caml_string_of_jsbytes("<"),
     cst$18=caml_string_of_jsbytes(">"),
     cst$19=caml_string_of_jsbytes("<\/"),
     cst$20=caml_string_of_jsbytes(">"),
     cst$21=caml_string_of_jsbytes("<"),
     cst$22=caml_string_of_jsbytes("-->"),
     cst$23=caml_string_of_jsbytes("<!--"),
     cst$24=caml_string_of_jsbytes(";"),
     cst$25=caml_string_of_jsbytes("&"),
     cst$10=caml_string_of_jsbytes(", "),
     cst$11=caml_string_of_jsbytes(" "),
     cst_xmlns=caml_string_of_jsbytes("xmlns"),
     cst_xmlns$0=caml_string_of_jsbytes("xmlns"),
     partial=[12,62,0],
     cst$9=caml_string_of_jsbytes(" "),
     cst_lt$0=caml_string_of_jsbytes("&lt;"),
     cst_gt$4=caml_string_of_jsbytes("&gt;"),
     cst_amp$0=caml_string_of_jsbytes("&amp;"),
     cst_quot$0=caml_string_of_jsbytes("&quot;"),
     cst_Infinity=caml_string_of_jsbytes("Infinity"),
     cst_Infinity$0=caml_string_of_jsbytes("-Infinity"),
     cst_NaN=caml_string_of_jsbytes("NaN"),
     cst$5=caml_string_of_jsbytes("--!>"),
     cst$6=caml_string_of_jsbytes("-->"),
     cst$7=caml_string_of_jsbytes("->"),
     cst$8=caml_string_of_jsbytes(">"),
     cst_gt$0=caml_string_of_jsbytes("&gt;"),
     cst_gt$1=caml_string_of_jsbytes("-&gt;"),
     cst_gt$2=caml_string_of_jsbytes("--&gt;"),
     cst_gt$3=caml_string_of_jsbytes("--!&gt;"),
     cst_1_0=caml_string_of_jsbytes("1.0"),
     cst_UTF_8=caml_string_of_jsbytes("UTF-8"),
     cst_64=caml_string_of_jsbytes("&#64;"),
     cst_lt=caml_string_of_jsbytes("&lt;"),
     cst_gt=caml_string_of_jsbytes("&gt;"),
     cst_amp=caml_string_of_jsbytes("&amp;"),
     cst_quot=caml_string_of_jsbytes("&quot;"),
     cst=caml_string_of_jsbytes("&#"),
     cst$0=caml_string_of_jsbytes(";"),
     cst$1=caml_string_of_jsbytes("--!>"),
     cst$2=caml_string_of_jsbytes("-->"),
     cst$3=caml_string_of_jsbytes("->"),
     cst$4=caml_string_of_jsbytes(">"),
     cst$38=caml_string_of_jsbytes(" "),
     cst$37=caml_string_of_jsbytes(""),
     partial$0=[12,32,[8,[0,0,3],0,0,[12,41,0]]],
     partial$1=[0,0,3],
     cst_none$1=caml_string_of_jsbytes("none"),
     cst_auto$2=caml_string_of_jsbytes("auto"),
     cst$36=caml_string_of_jsbytes("%"),
     cst_strokePaint=caml_string_of_jsbytes("strokePaint"),
     cst_sourceAlpha=caml_string_of_jsbytes("sourceAlpha"),
     cst_fillPaint=caml_string_of_jsbytes("fillPaint"),
     cst_sourceGraphic=caml_string_of_jsbytes("sourceGraphic"),
     cst_backgroundImage=caml_string_of_jsbytes("backgroundImage"),
     cst_backgroundAlpha=caml_string_of_jsbytes("backgroundAlpha"),
     cst_nochange=caml_string_of_jsbytes("nochange"),
     cst_alphabetic$1=caml_string_of_jsbytes("alphabetic"),
     cst_auto$1=caml_string_of_jsbytes("auto"),
     cst_hanging$1=caml_string_of_jsbytes("hanging"),
     cst_mathematical$1=caml_string_of_jsbytes("mathematical"),
     cst_inherit$1=caml_string_of_jsbytes("inherit"),
     cst_middle$1=caml_string_of_jsbytes("middle"),
     cst_central$0=caml_string_of_jsbytes("central"),
     cst_usescript=caml_string_of_jsbytes("usescript"),
     cst_ideographic$1=caml_string_of_jsbytes("ideographic"),
     cst_textbeforeedge=caml_string_of_jsbytes("textbeforeedge"),
     cst_resetsize=caml_string_of_jsbytes("resetsize"),
     cst_textafteredge=caml_string_of_jsbytes("textafteredge"),
     cst_stitch=caml_string_of_jsbytes("stitch"),
     cst_onRequest=caml_string_of_jsbytes("onRequest"),
     cst_repeat=caml_string_of_jsbytes("repeat"),
     cst_wrap=caml_string_of_jsbytes("wrap"),
     cst_remove=caml_string_of_jsbytes("remove"),
     cst_reflect=caml_string_of_jsbytes("reflect"),
     cst_noStitch=caml_string_of_jsbytes("noStitch"),
     cst$35=caml_string_of_jsbytes(""),
     cst_over=caml_string_of_jsbytes("over"),
     cst_none$0=caml_string_of_jsbytes("none"),
     cst_medial=caml_string_of_jsbytes("medial"),
     cst_never=caml_string_of_jsbytes("never"),
     cst_butt=caml_string_of_jsbytes("butt"),
     cst_auto$0=caml_string_of_jsbytes("auto"),
     cst_atop=caml_string_of_jsbytes("atop"),
     cst_arithmetic=caml_string_of_jsbytes("arithmetic"),
     cst_underline=caml_string_of_jsbytes("underline"),
     cst_gamma=caml_string_of_jsbytes("gamma"),
     cst_linear=caml_string_of_jsbytes("linear"),
     cst_overline=caml_string_of_jsbytes("overline"),
     cst_onLoad=caml_string_of_jsbytes("onLoad"),
     cst_turbulence=caml_string_of_jsbytes("turbulence"),
     cst_table=caml_string_of_jsbytes("table"),
     cst_geometricPrecision=caml_string_of_jsbytes("geometricPrecision"),
     cst_optimizeSpeed=caml_string_of_jsbytes("optimizeSpeed"),
     cst_miter=caml_string_of_jsbytes("miter"),
     cst_initial=caml_string_of_jsbytes("initial"),
     cst_start=caml_string_of_jsbytes("start"),
     cst_whenNotActive=caml_string_of_jsbytes("whenNotActive"),
     cst_identity=caml_string_of_jsbytes("identity"),
     cst_skewY=caml_string_of_jsbytes("skewY"),
     cst_skewX=caml_string_of_jsbytes("skewX"),
     cst_square=caml_string_of_jsbytes("square"),
     cst_scale$0=caml_string_of_jsbytes("scale"),
     cst_exact=caml_string_of_jsbytes("exact"),
     cst_perceptual=caml_string_of_jsbytes("perceptual"),
     cst_discrete=caml_string_of_jsbytes("discrete"),
     cst_erode=caml_string_of_jsbytes("erode"),
     cst_middle$0=caml_string_of_jsbytes("middle"),
     cst_round=caml_string_of_jsbytes("round"),
     cst_xor=caml_string_of_jsbytes("xor"),
     cst_XML=caml_string_of_jsbytes("XML"),
     cst_sum=caml_string_of_jsbytes("sum"),
     cst_pad=caml_string_of_jsbytes("pad"),
     cst_out=caml_string_of_jsbytes("out"),
     cst_new=caml_string_of_jsbytes("new"),
     cst_end=caml_string_of_jsbytes("end"),
     cst_CSS=caml_string_of_jsbytes("CSS"),
     cst_in$1=caml_string_of_jsbytes("in"),
     cst_v=caml_string_of_jsbytes("v"),
     cst_r$0=caml_string_of_jsbytes("r"),
     cst_h=caml_string_of_jsbytes("h"),
     cst_g$0=caml_string_of_jsbytes("g"),
     cst_b=caml_string_of_jsbytes("b"),
     cst_a$0=caml_string_of_jsbytes("a"),
     cst_rotate$0=caml_string_of_jsbytes("rotate"),
     cst_disable=caml_string_of_jsbytes("disable"),
     cst_screen=caml_string_of_jsbytes("screen"),
     cst_absolute_colorimetric=caml_string_of_jsbytes("absolute_colorimetric"),
     cst_inherit$0=caml_string_of_jsbytes("inherit"),
     cst_always=caml_string_of_jsbytes("always"),
     cst_spacingAndGlyphs=caml_string_of_jsbytes("spacingAndGlyphs"),
     cst_replace=caml_string_of_jsbytes("replace"),
     cst_multiply=caml_string_of_jsbytes("multiply"),
     cst_spline=caml_string_of_jsbytes("spline"),
     cst_matrix=caml_string_of_jsbytes("matrix"),
     cst_saturation=caml_string_of_jsbytes("saturation"),
     cst_dilate=caml_string_of_jsbytes("dilate"),
     cst_translate=caml_string_of_jsbytes("translate"),
     cst_default=caml_string_of_jsbytes("default"),
     cst_lighten=caml_string_of_jsbytes("lighten"),
     cst_normal=caml_string_of_jsbytes("normal"),
     cst_freeze=caml_string_of_jsbytes("freeze"),
     cst_magnify=caml_string_of_jsbytes("magnify"),
     cst_hueRotate=caml_string_of_jsbytes("hueRotate"),
     cst_spacing$0=caml_string_of_jsbytes("spacing"),
     cst_fractalNoise=caml_string_of_jsbytes("fractalNoise"),
     cst_saturate=caml_string_of_jsbytes("saturate"),
     cst_userSpaceOnUse=caml_string_of_jsbytes("userSpaceOnUse"),
     cst_objectBoundingBox=caml_string_of_jsbytes("objectBoundingBox"),
     cst_darken=caml_string_of_jsbytes("darken"),
     cst_paced=caml_string_of_jsbytes("paced"),
     cst_isolated=caml_string_of_jsbytes("isolated"),
     cst_optimizeLegibility=caml_string_of_jsbytes("optimizeLegibility"),
     cst_luminanceToAlpha=caml_string_of_jsbytes("luminanceToAlpha"),
     cst_line_through=caml_string_of_jsbytes("line-through"),
     cst_other=caml_string_of_jsbytes("other"),
     cst_terminal=caml_string_of_jsbytes("terminal"),
     cst_blink=caml_string_of_jsbytes("blink"),
     cst_stroke_width$0=caml_string_of_jsbytes("stroke-width"),
     cst_stretch=caml_string_of_jsbytes("stretch"),
     cst_bevel=caml_string_of_jsbytes("bevel"),
     cst_duplicate=caml_string_of_jsbytes("duplicate"),
     cst_preserve=caml_string_of_jsbytes("preserve"),
     cst_relative_colorimetric=caml_string_of_jsbytes("relative_colorimetric"),
     cst_after_edge=caml_string_of_jsbytes("after-edge"),
     cst_alphabetic$0=caml_string_of_jsbytes("alphabetic"),
     cst_auto=caml_string_of_jsbytes("auto"),
     cst_hanging$0=caml_string_of_jsbytes("hanging"),
     cst_mathematical$0=caml_string_of_jsbytes("mathematical"),
     cst_inherit=caml_string_of_jsbytes("inherit"),
     cst_middle=caml_string_of_jsbytes("middle"),
     cst_baseline=caml_string_of_jsbytes("baseline"),
     cst_central=caml_string_of_jsbytes("central"),
     cst_ideographic$0=caml_string_of_jsbytes("ideographic"),
     cst_text_before_edge=caml_string_of_jsbytes("text-before-edge"),
     cst_before_edge=caml_string_of_jsbytes("before-edge"),
     cst_text_after_edge=caml_string_of_jsbytes("text-after-edge"),
     cst_http_www_w3_org_1999_xlink=
      caml_string_of_jsbytes("http://www.w3.org/1999/xlink"),
     cst_xmlns_xlink=caml_string_of_jsbytes("xmlns:xlink"),
     cst_http_www_w3_org_2000_svg=
      caml_string_of_jsbytes("http://www.w3.org/2000/svg"),
     cst_xmlns$3=caml_string_of_jsbytes("xmlns"),
     cst_svg$0=caml_string_of_jsbytes("svg"),
     cst_stroke_dasharray=caml_string_of_jsbytes("stroke-dasharray"),
     cst_stroke_linejoin=caml_string_of_jsbytes("stroke-linejoin"),
     cst_stroke_linecap=caml_string_of_jsbytes("stroke-linecap"),
     cst_dominant_baseline=caml_string_of_jsbytes("dominant-baseline"),
     cst_alignment_baseline=caml_string_of_jsbytes("alignment-baseline"),
     cst_arabic_form=caml_string_of_jsbytes("arabic-form"),
     cst_orientation=caml_string_of_jsbytes("orientation"),
     cst_accumulate=caml_string_of_jsbytes("accumulate"),
     cst_additive=caml_string_of_jsbytes("additive"),
     cst_calcMode=caml_string_of_jsbytes("calcMode"),
     cst_fill$0=caml_string_of_jsbytes("fill"),
     cst_restart=caml_string_of_jsbytes("restart"),
     cst_attributeType=caml_string_of_jsbytes("attributeType"),
     cst_xlink_actuate=caml_string_of_jsbytes("xlink:actuate"),
     cst_xlink_show=caml_string_of_jsbytes("xlink:show"),
     cst_type$2=caml_string_of_jsbytes("type"),
     cst_stitchTiles=caml_string_of_jsbytes("stitchTiles"),
     cst_operator$0=caml_string_of_jsbytes("operator"),
     cst_yChannelSelector=caml_string_of_jsbytes("yChannelSelector"),
     cst_xChannelSelector=caml_string_of_jsbytes("xChannelSelector"),
     cst_targetY$0=caml_string_of_jsbytes("targetY"),
     cst_operator=caml_string_of_jsbytes("operator"),
     cst_type$1=caml_string_of_jsbytes("type"),
     cst_type$0=caml_string_of_jsbytes("type"),
     cst_mode=caml_string_of_jsbytes("mode"),
     cst_in2=caml_string_of_jsbytes("in2"),
     cst_in$0=caml_string_of_jsbytes("in"),
     cst_primitiveUnits=caml_string_of_jsbytes("primitiveUnits"),
     cst_maskContentUnits=caml_string_of_jsbytes("maskContentUnits"),
     cst_maskUnits=caml_string_of_jsbytes("maskUnits"),
     cst_clipPathUnits=caml_string_of_jsbytes("clipPathUnits"),
     cst_patternTransform=caml_string_of_jsbytes("patternTransform"),
     cst_patternContentUnits=caml_string_of_jsbytes("patternContentUnits"),
     cst_patternUnits=caml_string_of_jsbytes("patternUnits"),
     cst_offset=caml_string_of_jsbytes("offset"),
     cst_spreadMethod=caml_string_of_jsbytes("spreadMethod"),
     cst_gradientUnits=caml_string_of_jsbytes("gradientUnits"),
     cst_rendering_intent=caml_string_of_jsbytes("rendering-intent"),
     cst_orient=caml_string_of_jsbytes("orient"),
     cst_markerUnits=caml_string_of_jsbytes("markerUnits"),
     cst_spacing=caml_string_of_jsbytes("spacing"),
     cst_method=caml_string_of_jsbytes("method"),
     cst_text_rendering=caml_string_of_jsbytes("text-rendering"),
     cst_text_decoration=caml_string_of_jsbytes("text-decoration"),
     cst_text_anchor=caml_string_of_jsbytes("text-anchor"),
     cst_lengthAdjust=caml_string_of_jsbytes("lengthAdjust"),
     cst_xml_space=caml_string_of_jsbytes("xml:space"),
     cst_data=caml_string_of_jsbytes("data-"),
     cst_zoomAndSpan=caml_string_of_jsbytes("zoomAndSpan"),
     cst_foreignObject=caml_string_of_jsbytes("foreignObject"),
     cst_metadata=caml_string_of_jsbytes("metadata"),
     content_type=caml_string_of_jsbytes("image/svg+xml"),
     version=caml_string_of_jsbytes("SVG 1.1"),
     standard=caml_string_of_jsbytes("http://www.w3.org/TR/svg11/"),
     namespace=caml_string_of_jsbytes("http://www.w3.org/2000/svg"),
     cst_svg=caml_string_of_jsbytes("svg"),
     cst_version=caml_string_of_jsbytes("version"),
     cst_baseProfile=caml_string_of_jsbytes("baseProfile"),
     cst_x=caml_string_of_jsbytes("x"),
     cst_y=caml_string_of_jsbytes("y"),
     cst_width=caml_string_of_jsbytes("width"),
     cst_height=caml_string_of_jsbytes("height"),
     cst_preserveAspectRatio=caml_string_of_jsbytes("preserveAspectRatio"),
     cst_contentScriptType=caml_string_of_jsbytes("contentScriptType"),
     cst_contentStyleType=caml_string_of_jsbytes("contentStyleType"),
     cst_href=caml_string_of_jsbytes("href"),
     cst_xlink_href=caml_string_of_jsbytes("xlink:href"),
     cst_requiredFeatures=caml_string_of_jsbytes("requiredFeatures"),
     cst_requiredExtension=caml_string_of_jsbytes("requiredExtension"),
     cst_systemLanguage=caml_string_of_jsbytes("systemLanguage"),
     cst_externalRessourcesRequired=
      caml_string_of_jsbytes("externalRessourcesRequired"),
     cst_id=caml_string_of_jsbytes("id"),
     cst_xml_base=caml_string_of_jsbytes("xml:base"),
     cst_xml_lang=caml_string_of_jsbytes("xml:lang"),
     cst_type=caml_string_of_jsbytes("type"),
     cst_media=caml_string_of_jsbytes("media"),
     cst_xlink_title=caml_string_of_jsbytes("xlink:title"),
     cst_class=caml_string_of_jsbytes("class"),
     cst_style=caml_string_of_jsbytes("style"),
     cst_transform=caml_string_of_jsbytes("transform"),
     cst_viewBox=caml_string_of_jsbytes("viewBox"),
     cst_d=caml_string_of_jsbytes("d"),
     cst_pathLength=caml_string_of_jsbytes("pathLength"),
     cst_rx=caml_string_of_jsbytes("rx"),
     cst_ry=caml_string_of_jsbytes("ry"),
     cst_cx=caml_string_of_jsbytes("cx"),
     cst_cy=caml_string_of_jsbytes("cy"),
     cst_r=caml_string_of_jsbytes("r"),
     cst_x1=caml_string_of_jsbytes("x1"),
     cst_y1=caml_string_of_jsbytes("y1"),
     cst_x2=caml_string_of_jsbytes("x2"),
     cst_y2=caml_string_of_jsbytes("y2"),
     cst_points=caml_string_of_jsbytes("points"),
     cst_x$0=caml_string_of_jsbytes("x"),
     cst_y$0=caml_string_of_jsbytes("y"),
     cst_dx=caml_string_of_jsbytes("dx"),
     cst_dy=caml_string_of_jsbytes("dy"),
     cst_dx$0=caml_string_of_jsbytes("dx"),
     cst_dy$0=caml_string_of_jsbytes("dy"),
     cst_textLength=caml_string_of_jsbytes("textLength"),
     cst_rotate=caml_string_of_jsbytes("rotate"),
     cst_startOffset=caml_string_of_jsbytes("startOffset"),
     cst_glyphRef=caml_string_of_jsbytes("glyphRef"),
     cst_format=caml_string_of_jsbytes("format"),
     cst_refX=caml_string_of_jsbytes("refX"),
     cst_refY=caml_string_of_jsbytes("refY"),
     cst_markerWidth=caml_string_of_jsbytes("markerWidth"),
     cst_markerHeight=caml_string_of_jsbytes("markerHeight"),
     cst_local=caml_string_of_jsbytes("local"),
     cst_gradientTransform=caml_string_of_jsbytes("gradientTransform"),
     cst_fx=caml_string_of_jsbytes("fx"),
     cst_fy=caml_string_of_jsbytes("fy"),
     cst_filterResUnits=caml_string_of_jsbytes("filterResUnits"),
     cst_result=caml_string_of_jsbytes("result"),
     cst_azimuth=caml_string_of_jsbytes("azimuth"),
     cst_elevation=caml_string_of_jsbytes("elevation"),
     cst_pointsAtX=caml_string_of_jsbytes("pointsAtX"),
     cst_pointsAtY=caml_string_of_jsbytes("pointsAtY"),
     cst_pointsAtZ=caml_string_of_jsbytes("pointsAtZ"),
     cst_specularExponent=caml_string_of_jsbytes("specularExponent"),
     cst_specularConstant=caml_string_of_jsbytes("specularConstant"),
     cst_limitingConeAngle=caml_string_of_jsbytes("limitingConeAngle"),
     cst_values=caml_string_of_jsbytes("values"),
     cst_tableValues=caml_string_of_jsbytes("tableValues"),
     cst_intercept=caml_string_of_jsbytes("intercept"),
     cst_amplitude=caml_string_of_jsbytes("amplitude"),
     cst_exponent=caml_string_of_jsbytes("exponent"),
     cst_offset$0=caml_string_of_jsbytes("offset"),
     cst_k1=caml_string_of_jsbytes("k1"),
     cst_k2=caml_string_of_jsbytes("k2"),
     cst_k3=caml_string_of_jsbytes("k3"),
     cst_k4=caml_string_of_jsbytes("k4"),
     cst_order=caml_string_of_jsbytes("order"),
     cst_kernelMatrix=caml_string_of_jsbytes("kernelMatrix"),
     cst_divisor=caml_string_of_jsbytes("divisor"),
     cst_bias=caml_string_of_jsbytes("bias"),
     cst_kernelUnitLength=caml_string_of_jsbytes("kernelUnitLength"),
     cst_targetX=caml_string_of_jsbytes("targetX"),
     cst_targetY=caml_string_of_jsbytes("targetY"),
     cst_preserveAlpha=caml_string_of_jsbytes("preserveAlpha"),
     cst_surfaceScale=caml_string_of_jsbytes("surfaceScale"),
     cst_diffuseConstant=caml_string_of_jsbytes("diffuseConstant"),
     cst_scale=caml_string_of_jsbytes("scale"),
     cst_stdDeviation=caml_string_of_jsbytes("stdDeviation"),
     cst_radius=caml_string_of_jsbytes("radius"),
     cst_baseFrequency=caml_string_of_jsbytes("baseFrequency"),
     cst_numOctaves=caml_string_of_jsbytes("numOctaves"),
     cst_seed=caml_string_of_jsbytes("seed"),
     cst_xlink_target=caml_string_of_jsbytes("xlink:target"),
     cst_viewTarget=caml_string_of_jsbytes("viewTarget"),
     cst_attributeName=caml_string_of_jsbytes("attributeName"),
     cst_begin=caml_string_of_jsbytes("begin"),
     cst_dur=caml_string_of_jsbytes("dur"),
     cst_min=caml_string_of_jsbytes("min"),
     cst_max=caml_string_of_jsbytes("max"),
     cst_repeatCount=caml_string_of_jsbytes("repeatCount"),
     cst_repeatDur=caml_string_of_jsbytes("repeatDur"),
     cst_fill=caml_string_of_jsbytes("fill"),
     cst_values$0=caml_string_of_jsbytes("values"),
     cst_keyTimes=caml_string_of_jsbytes("keyTimes"),
     cst_keySplines=caml_string_of_jsbytes("keySplines"),
     cst_from=caml_string_of_jsbytes("from"),
     cst_to=caml_string_of_jsbytes("to"),
     cst_by=caml_string_of_jsbytes("by"),
     cst_keyPoints=caml_string_of_jsbytes("keyPoints"),
     cst_path=caml_string_of_jsbytes("path"),
     cst_type$3=caml_string_of_jsbytes("type"),
     cst_horiz_origin_x=caml_string_of_jsbytes("horiz-origin-x"),
     cst_horiz_origin_y=caml_string_of_jsbytes("horiz-origin-y"),
     cst_horiz_adv_x=caml_string_of_jsbytes("horiz-adv-x"),
     cst_vert_origin_x=caml_string_of_jsbytes("vert-origin-x"),
     cst_vert_origin_y=caml_string_of_jsbytes("vert-origin-y"),
     cst_vert_adv_y=caml_string_of_jsbytes("vert-adv-y"),
     cst_unicode=caml_string_of_jsbytes("unicode"),
     cst_glyphname=caml_string_of_jsbytes("glyphname"),
     cst_lang=caml_string_of_jsbytes("lang"),
     cst_u1=caml_string_of_jsbytes("u1"),
     cst_u2=caml_string_of_jsbytes("u2"),
     cst_g1=caml_string_of_jsbytes("g1"),
     cst_g2=caml_string_of_jsbytes("g2"),
     cst_k=caml_string_of_jsbytes("k"),
     cst_font_family=caml_string_of_jsbytes("font-family"),
     cst_font_style=caml_string_of_jsbytes("font-style"),
     cst_font_variant=caml_string_of_jsbytes("font-variant"),
     cst_font_weight=caml_string_of_jsbytes("font-weight"),
     cst_font_stretch=caml_string_of_jsbytes("font-stretch"),
     cst_font_size=caml_string_of_jsbytes("font-size"),
     cst_unicode_range=caml_string_of_jsbytes("unicode-range"),
     cst_units_per_em=caml_string_of_jsbytes("units-per-em"),
     cst_stemv=caml_string_of_jsbytes("stemv"),
     cst_stemh=caml_string_of_jsbytes("stemh"),
     cst_slope=caml_string_of_jsbytes("slope"),
     cst_cap_height=caml_string_of_jsbytes("cap-height"),
     cst_x_height=caml_string_of_jsbytes("x-height"),
     cst_accent_height=caml_string_of_jsbytes("accent-height"),
     cst_ascent=caml_string_of_jsbytes("ascent"),
     cst_widths=caml_string_of_jsbytes("widths"),
     cst_bbox=caml_string_of_jsbytes("bbox"),
     cst_ideographic=caml_string_of_jsbytes("ideographic"),
     cst_alphabetic=caml_string_of_jsbytes("alphabetic"),
     cst_mathematical=caml_string_of_jsbytes("mathematical"),
     cst_hanging=caml_string_of_jsbytes("hanging"),
     cst_v_ideographic=caml_string_of_jsbytes("v-ideographic"),
     cst_v_alphabetic=caml_string_of_jsbytes("v-alphabetic"),
     cst_v_mathematical=caml_string_of_jsbytes("v-mathematical"),
     cst_v_hanging=caml_string_of_jsbytes("v-hanging"),
     cst_underline_position=caml_string_of_jsbytes("underline-position"),
     cst_underline_thickness=caml_string_of_jsbytes("underline-thickness"),
     cst_strikethrough_position=
      caml_string_of_jsbytes("strikethrough-position"),
     cst_strikethrough_thickness=
      caml_string_of_jsbytes("strikethrough-thickness"),
     cst_overline_position=caml_string_of_jsbytes("overline-position"),
     cst_overline_thickness=caml_string_of_jsbytes("overline-thickness"),
     cst_string=caml_string_of_jsbytes("string"),
     cst_name=caml_string_of_jsbytes("name"),
     cst_onabort=caml_string_of_jsbytes("onabort"),
     cst_onactivate=caml_string_of_jsbytes("onactivate"),
     cst_onbegin=caml_string_of_jsbytes("onbegin"),
     cst_onend=caml_string_of_jsbytes("onend"),
     cst_onerror=caml_string_of_jsbytes("onerror"),
     cst_onfocusin=caml_string_of_jsbytes("onfocusin"),
     cst_onfocusout=caml_string_of_jsbytes("onfocusout"),
     cst_onload=caml_string_of_jsbytes("onload"),
     cst_onrepeat=caml_string_of_jsbytes("onrepeat"),
     cst_onresize=caml_string_of_jsbytes("onresize"),
     cst_onscroll=caml_string_of_jsbytes("onscroll"),
     cst_onunload=caml_string_of_jsbytes("onunload"),
     cst_onzoom=caml_string_of_jsbytes("onzoom"),
     cst_onclick=caml_string_of_jsbytes("onclick"),
     cst_onmousedown=caml_string_of_jsbytes("onmousedown"),
     cst_onmouseup=caml_string_of_jsbytes("onmouseup"),
     cst_onmouseover=caml_string_of_jsbytes("onmouseover"),
     cst_onmouseout=caml_string_of_jsbytes("onmouseout"),
     cst_onmousemove=caml_string_of_jsbytes("onmousemove"),
     cst_ontouchstart=caml_string_of_jsbytes("ontouchstart"),
     cst_ontouchend=caml_string_of_jsbytes("ontouchend"),
     cst_ontouchmove=caml_string_of_jsbytes("ontouchmove"),
     cst_ontouchcancel=caml_string_of_jsbytes("ontouchcancel"),
     cst_stop_color=caml_string_of_jsbytes("stop-color"),
     cst_stop_opacity=caml_string_of_jsbytes("stop-opacity"),
     cst_stroke=caml_string_of_jsbytes("stroke"),
     cst_stroke_width=caml_string_of_jsbytes("stroke-width"),
     cst_stroke_miterlimit=caml_string_of_jsbytes("stroke-miterlimit"),
     cst_stroke_dashoffset=caml_string_of_jsbytes("stroke-dashoffset"),
     cst_stroke_opacity=caml_string_of_jsbytes("stroke-opacity"),
     cst_g=caml_string_of_jsbytes("g"),
     cst_defs=caml_string_of_jsbytes("defs"),
     cst_desc=caml_string_of_jsbytes("desc"),
     cst_title=caml_string_of_jsbytes("title"),
     cst_symbol=caml_string_of_jsbytes("symbol"),
     cst_use=caml_string_of_jsbytes("use"),
     cst_image=caml_string_of_jsbytes("image"),
     cst_switch=caml_string_of_jsbytes("switch"),
     cst_style$0=caml_string_of_jsbytes("style"),
     cst_path$0=caml_string_of_jsbytes("path"),
     cst_rect=caml_string_of_jsbytes("rect"),
     cst_circle=caml_string_of_jsbytes("circle"),
     cst_ellipse=caml_string_of_jsbytes("ellipse"),
     cst_line=caml_string_of_jsbytes("line"),
     cst_polyline=caml_string_of_jsbytes("polyline"),
     cst_polygon=caml_string_of_jsbytes("polygon"),
     cst_text=caml_string_of_jsbytes("text"),
     cst_tspan=caml_string_of_jsbytes("tspan"),
     cst_tref=caml_string_of_jsbytes("tref"),
     cst_textPath=caml_string_of_jsbytes("textPath"),
     cst_altGlyph=caml_string_of_jsbytes("altGlyph"),
     cst_altGlyphDef=caml_string_of_jsbytes("altGlyphDef"),
     cst_altGlyphItem=caml_string_of_jsbytes("altGlyphItem"),
     cst_glyphRef$0=caml_string_of_jsbytes("glyphRef"),
     cst_marker=caml_string_of_jsbytes("marker"),
     cst_color_profile=caml_string_of_jsbytes("color-profile"),
     cst_linearGradient=caml_string_of_jsbytes("linearGradient"),
     cst_radialGradient=caml_string_of_jsbytes("radialGradient"),
     cst_stop=caml_string_of_jsbytes("stop"),
     cst_pattern=caml_string_of_jsbytes("pattern"),
     cst_clipPath=caml_string_of_jsbytes("clipPath"),
     cst_filter=caml_string_of_jsbytes("filter"),
     cst_feDistantLight=caml_string_of_jsbytes("feDistantLight"),
     cst_fePointLight=caml_string_of_jsbytes("fePointLight"),
     cst_feSpotLight=caml_string_of_jsbytes("feSpotLight"),
     cst_feBlend=caml_string_of_jsbytes("feBlend"),
     cst_feColorMatrix=caml_string_of_jsbytes("feColorMatrix"),
     cst_feComponentTransfer=caml_string_of_jsbytes("feComponentTransfer"),
     cst_feFuncA=caml_string_of_jsbytes("feFuncA"),
     cst_feFuncG=caml_string_of_jsbytes("feFuncG"),
     cst_feFuncB=caml_string_of_jsbytes("feFuncB"),
     cst_feFuncR=caml_string_of_jsbytes("feFuncR"),
     cst_feComposite=caml_string_of_jsbytes("feComposite"),
     cst_feConvolveMatrix=caml_string_of_jsbytes("feConvolveMatrix"),
     cst_feDiffuseLighting=caml_string_of_jsbytes("feDiffuseLighting"),
     cst_feDisplacementMap=caml_string_of_jsbytes("feDisplacementMap"),
     cst_feFlood=caml_string_of_jsbytes("feFlood"),
     cst_feGaussianBlur=caml_string_of_jsbytes("feGaussianBlur"),
     cst_feImage=caml_string_of_jsbytes("feImage"),
     cst_feMerge=caml_string_of_jsbytes("feMerge"),
     cst_feMorphology=caml_string_of_jsbytes("feMorphology"),
     cst_feOffset=caml_string_of_jsbytes("feOffset"),
     cst_feSpecularLighting=caml_string_of_jsbytes("feSpecularLighting"),
     cst_feTile=caml_string_of_jsbytes("feTile"),
     cst_feTurbulence=caml_string_of_jsbytes("feTurbulence"),
     cst_cursor=caml_string_of_jsbytes("cursor"),
     cst_a=caml_string_of_jsbytes("a"),
     cst_view=caml_string_of_jsbytes("view"),
     cst_script=caml_string_of_jsbytes("script"),
     cst_animate=caml_string_of_jsbytes("animate"),
     cst_set=caml_string_of_jsbytes("set"),
     cst_animateMotion=caml_string_of_jsbytes("animateMotion"),
     cst_mpath=caml_string_of_jsbytes("mpath"),
     cst_animateColor=caml_string_of_jsbytes("animateColor"),
     cst_animateTransform=caml_string_of_jsbytes("animateTransform"),
     cst_font=caml_string_of_jsbytes("font"),
     cst_glyph=caml_string_of_jsbytes("glyph"),
     cst_missing_glyph=caml_string_of_jsbytes("missing-glyph"),
     cst_hkern=caml_string_of_jsbytes("hkern"),
     cst_vkern=caml_string_of_jsbytes("vkern"),
     cst_font_face=caml_string_of_jsbytes("font-face"),
     cst_font_face_src=caml_string_of_jsbytes("font-face-src"),
     cst_font_face_uri=caml_string_of_jsbytes("font-face-uri"),
     cst_font_face_uri$0=caml_string_of_jsbytes("font-face-uri"),
     cst_font_face_name=caml_string_of_jsbytes("font-face-name"),
     cst$34=caml_string_of_jsbytes(" "),
     cst_none=caml_string_of_jsbytes("none"),
     cst_currentColor=caml_string_of_jsbytes("currentColor"),
     cst$33=caml_string_of_jsbytes(" "),
     sep=caml_string_of_jsbytes(" "),
     cst_px=caml_string_of_jsbytes("px"),
     cst_pt=caml_string_of_jsbytes("pt"),
     cst_pc=caml_string_of_jsbytes("pc"),
     cst_in=caml_string_of_jsbytes("in"),
     cst_mm=caml_string_of_jsbytes("mm"),
     cst_ex=caml_string_of_jsbytes("ex"),
     cst_em=caml_string_of_jsbytes("em"),
     cst_cm=caml_string_of_jsbytes("cm"),
     cst$32=caml_string_of_jsbytes("%"),
     cst_grad=caml_string_of_jsbytes("grad"),
     cst_deg=caml_string_of_jsbytes("deg"),
     cst_rad=caml_string_of_jsbytes("rad"),
     cst$31=caml_string_of_jsbytes(""),
     cst$46=caml_string_of_jsbytes(", "),
     cst$45=caml_string_of_jsbytes(" "),
     cst$44=caml_string_of_jsbytes(", "),
     cst$43=caml_string_of_jsbytes(","),
     cst$42=caml_string_of_jsbytes(" "),
     cst$41=caml_string_of_jsbytes(" "),
     cst_any$1=caml_string_of_jsbytes("any"),
     cst_any$0=caml_string_of_jsbytes("any"),
     cst$40=caml_string_of_jsbytes(""),
     cst_on=caml_string_of_jsbytes("on"),
     cst_off=caml_string_of_jsbytes("off"),
     cst_week=caml_string_of_jsbytes("week"),
     cst_time$0=caml_string_of_jsbytes("time"),
     cst_text$1=caml_string_of_jsbytes("text"),
     cst_file=caml_string_of_jsbytes("file"),
     cst_date=caml_string_of_jsbytes("date"),
     cst_datetime_local=caml_string_of_jsbytes("datetime-local"),
     cst_password=caml_string_of_jsbytes("password"),
     cst_month=caml_string_of_jsbytes("month"),
     cst_search$1=caml_string_of_jsbytes("search"),
     cst_button$0=caml_string_of_jsbytes("button"),
     cst_checkbox$0=caml_string_of_jsbytes("checkbox"),
     cst_email$0=caml_string_of_jsbytes("email"),
     cst_hidden$1=caml_string_of_jsbytes("hidden"),
     cst_url$0=caml_string_of_jsbytes("url"),
     cst_tel$0=caml_string_of_jsbytes("tel"),
     cst_reset=caml_string_of_jsbytes("reset"),
     cst_range=caml_string_of_jsbytes("range"),
     cst_radio$0=caml_string_of_jsbytes("radio"),
     cst_readonly$1=caml_string_of_jsbytes("readonly"),
     cst_color=caml_string_of_jsbytes("color"),
     cst_number=caml_string_of_jsbytes("number"),
     cst_image$0=caml_string_of_jsbytes("image"),
     cst_submit=caml_string_of_jsbytes("submit"),
     cst_datetime$0=caml_string_of_jsbytes("datetime"),
     cst_external$0=caml_string_of_jsbytes("external"),
     cst_0=caml_string_of_jsbytes("0"),
     cst_formnovalidate$0=caml_string_of_jsbytes("formnovalidate"),
     cst_audio$0=caml_string_of_jsbytes("audio"),
     cst_async$0=caml_string_of_jsbytes("async"),
     cst_toolbar=caml_string_of_jsbytes("toolbar"),
     cst_text$0=caml_string_of_jsbytes("text"),
     cst_soft=caml_string_of_jsbytes("soft"),
     cst_rows$0=caml_string_of_jsbytes("rows"),
     cst_rect$0=caml_string_of_jsbytes("rect"),
     cst_prev$0=caml_string_of_jsbytes("prev"),
     cst_POST=caml_string_of_jsbytes("POST"),
     cst_poly=caml_string_of_jsbytes("poly"),
     cst_open$0=caml_string_of_jsbytes("open"),
     cst_decimal=caml_string_of_jsbytes("decimal"),
     cst_none$2=caml_string_of_jsbytes("none"),
     cst_next$0=caml_string_of_jsbytes("next"),
     cst_loop$0=caml_string_of_jsbytes("loop"),
     cst_left=caml_string_of_jsbytes("left"),
     cst_last$0=caml_string_of_jsbytes("last"),
     cst_kana=caml_string_of_jsbytes("kana"),
     cst_icon$1=caml_string_of_jsbytes("icon"),
     cst_help$0=caml_string_of_jsbytes("help"),
     cst_hard=caml_string_of_jsbytes("hard"),
     cst_cols$0=caml_string_of_jsbytes("cols"),
     cst_char$0=caml_string_of_jsbytes("char"),
     cst_auto$3=caml_string_of_jsbytes("auto"),
     cst_noreferrer$0=caml_string_of_jsbytes("noreferrer"),
     cst_author$0=caml_string_of_jsbytes("author"),
     cst_muted$0=caml_string_of_jsbytes("muted"),
     cst_autoplay$0=caml_string_of_jsbytes("autoplay"),
     cst_anonymous=caml_string_of_jsbytes("anonymous"),
     cst_metadata$0=caml_string_of_jsbytes("metadata"),
     cst_license$0=caml_string_of_jsbytes("license"),
     cst_search$0=caml_string_of_jsbytes("search"),
     cst_first$0=caml_string_of_jsbytes("first"),
     cst_novalidate$0=caml_string_of_jsbytes("novalidate"),
     cst_controls$0=caml_string_of_jsbytes("controls"),
     cst_bookmark$0=caml_string_of_jsbytes("bookmark"),
     cst_required$0=caml_string_of_jsbytes("required"),
     cst_selected$0=caml_string_of_jsbytes("selected"),
     cst_circle$0=caml_string_of_jsbytes("circle"),
     cst_rowgroup=caml_string_of_jsbytes("rowgroup"),
     cst_checkbox=caml_string_of_jsbytes("checkbox"),
     cst_katakana=caml_string_of_jsbytes("katakana"),
     cst_email=caml_string_of_jsbytes("email"),
     cst_latin=caml_string_of_jsbytes("latin"),
     cst_hidden$0=caml_string_of_jsbytes("hidden"),
     cst_yes=caml_string_of_jsbytes("yes"),
     cst_url=caml_string_of_jsbytes("url"),
     cst_tel=caml_string_of_jsbytes("tel"),
     cst_tag$0=caml_string_of_jsbytes("tag"),
     cst_rtl=caml_string_of_jsbytes("rtl"),
     cst_row=caml_string_of_jsbytes("row"),
     cst_1=caml_string_of_jsbytes("1"),
     cst_ltr=caml_string_of_jsbytes("ltr"),
     cst_GET=caml_string_of_jsbytes("GET"),
     cst_col$0=caml_string_of_jsbytes("col"),
     cst_any=caml_string_of_jsbytes("any"),
     cst_all$0=caml_string_of_jsbytes("all"),
     cst_up$0=caml_string_of_jsbytes("up"),
     cst_no=caml_string_of_jsbytes("no"),
     cst_right=caml_string_of_jsbytes("right"),
     cst_scoped$0=caml_string_of_jsbytes("scoped"),
     cst_numeric=caml_string_of_jsbytes("numeric"),
     cst_pingback$0=caml_string_of_jsbytes("pingback"),
     cst_radio=caml_string_of_jsbytes("radio"),
     cst_pubdate$0=caml_string_of_jsbytes("pubdate"),
     cst_multiple$0=caml_string_of_jsbytes("multiple"),
     cst_latin_name=caml_string_of_jsbytes("latin-name"),
     cst_autofocus$0=caml_string_of_jsbytes("autofocus"),
     cst_nofollow$0=caml_string_of_jsbytes("nofollow"),
     cst_defer$0=caml_string_of_jsbytes("defer"),
     cst_full_width_latin=caml_string_of_jsbytes("full-width-latin"),
     cst_default$0=caml_string_of_jsbytes("default"),
     cst_context=caml_string_of_jsbytes("context"),
     cst_verbatim=caml_string_of_jsbytes("verbatim"),
     cst_checked$0=caml_string_of_jsbytes("checked"),
     cst_stylesheet$0=caml_string_of_jsbytes("stylesheet"),
     cst_reserved$0=caml_string_of_jsbytes("reserved"),
     cst_alternate$0=caml_string_of_jsbytes("alternate"),
     cst_http_www_w3_org_1999_xhtml=
      caml_string_of_jsbytes("http://www.w3.org/1999/xhtml"),
     cst_disabled$0=caml_string_of_jsbytes("disabled"),
     cst_ismap$0=caml_string_of_jsbytes("ismap"),
     cst_use_credentials=caml_string_of_jsbytes("use-credentials"),
     cst_index$0=caml_string_of_jsbytes("index"),
     cst_justify=caml_string_of_jsbytes("justify"),
     cst_groups=caml_string_of_jsbytes("groups"),
     cst_command$0=caml_string_of_jsbytes("command"),
     cst_sidebar$0=caml_string_of_jsbytes("sidebar"),
     cst_latin_prose=caml_string_of_jsbytes("latin-prose"),
     cst_readonly$0=caml_string_of_jsbytes("readonly"),
     cst_colgroup$0=caml_string_of_jsbytes("colgroup"),
     cst_archives$0=caml_string_of_jsbytes("archives"),
     cst_seamless$0=caml_string_of_jsbytes("seamless"),
     cst_prefetch$0=caml_string_of_jsbytes("prefetch"),
     cst_preserve$0=caml_string_of_jsbytes("preserve"),
     cst_same_origin=caml_string_of_jsbytes("same-origin"),
     cst_origin_when_cross_origin=
      caml_string_of_jsbytes("origin-when-cross-origin"),
     cst_no_referrer_when_downgrade=
      caml_string_of_jsbytes("no-referrer-when-downgrade"),
     cst_no_referrer=caml_string_of_jsbytes("no-referrer"),
     cst_unsafe_url=caml_string_of_jsbytes("unsafe-url"),
     cst$39=caml_string_of_jsbytes(""),
     cst_origin=caml_string_of_jsbytes("origin"),
     cst_strict_origin=caml_string_of_jsbytes("strict-origin"),
     cst_strict_origin_when_cross_o=
      caml_string_of_jsbytes("strict-origin-when-cross-origin"),
     cst_projection=caml_string_of_jsbytes("projection"),
     cst_aural=caml_string_of_jsbytes("aural"),
     cst_handheld=caml_string_of_jsbytes("handheld"),
     cst_embossed=caml_string_of_jsbytes("embossed"),
     cst_tty=caml_string_of_jsbytes("tty"),
     cst_all=caml_string_of_jsbytes("all"),
     cst_tv=caml_string_of_jsbytes("tv"),
     cst_screen$0=caml_string_of_jsbytes("screen"),
     cst_speech=caml_string_of_jsbytes("speech"),
     cst_print=caml_string_of_jsbytes("print"),
     cst_braille=caml_string_of_jsbytes("braille"),
     cst_external=caml_string_of_jsbytes("external"),
     cst_canonical=caml_string_of_jsbytes("canonical"),
     cst_prev=caml_string_of_jsbytes("prev"),
     cst_next=caml_string_of_jsbytes("next"),
     cst_last=caml_string_of_jsbytes("last"),
     cst_icon$0=caml_string_of_jsbytes("icon"),
     cst_help=caml_string_of_jsbytes("help"),
     cst_noreferrer=caml_string_of_jsbytes("noreferrer"),
     cst_author=caml_string_of_jsbytes("author"),
     cst_license=caml_string_of_jsbytes("license"),
     cst_search=caml_string_of_jsbytes("search"),
     cst_noopener=caml_string_of_jsbytes("noopener"),
     cst_first=caml_string_of_jsbytes("first"),
     cst_bookmark=caml_string_of_jsbytes("bookmark"),
     cst_tag=caml_string_of_jsbytes("tag"),
     cst_up=caml_string_of_jsbytes("up"),
     cst_pingback=caml_string_of_jsbytes("pingback"),
     cst_nofollow=caml_string_of_jsbytes("nofollow"),
     cst_stylesheet=caml_string_of_jsbytes("stylesheet"),
     cst_alternate=caml_string_of_jsbytes("alternate"),
     cst_index=caml_string_of_jsbytes("index"),
     cst_sidebar=caml_string_of_jsbytes("sidebar"),
     cst_archives=caml_string_of_jsbytes("archives"),
     cst_prefetch=caml_string_of_jsbytes("prefetch"),
     cst_allow_same_origin=caml_string_of_jsbytes("allow-same-origin"),
     cst_allow_popups=caml_string_of_jsbytes("allow-popups"),
     cst_allow_forms=caml_string_of_jsbytes("allow-forms"),
     cst_allow_pointer_lock=caml_string_of_jsbytes("allow-pointer-lock"),
     cst_allow_script=caml_string_of_jsbytes("allow-script"),
     cst_allow_top_navigation=caml_string_of_jsbytes("allow-top-navigation"),
     cst_link=caml_string_of_jsbytes("link"),
     cst_style$2=caml_string_of_jsbytes("style"),
     cst_picture=caml_string_of_jsbytes("picture"),
     cst_img=caml_string_of_jsbytes("img"),
     cst_object=caml_string_of_jsbytes("object"),
     cst_table$0=caml_string_of_jsbytes("table"),
     cst_figure=caml_string_of_jsbytes("figure"),
     cst_optgroup=caml_string_of_jsbytes("optgroup"),
     cst_fieldset=caml_string_of_jsbytes("fieldset"),
     cst_details=caml_string_of_jsbytes("details"),
     cst_datalist=caml_string_of_jsbytes("datalist"),
     cst_menu=caml_string_of_jsbytes("menu"),
     cst_command=caml_string_of_jsbytes("command"),
     cst_area=caml_string_of_jsbytes("area"),
     cst_coords=caml_string_of_jsbytes("coords"),
     cst_shape=caml_string_of_jsbytes("shape"),
     cst_bdo=caml_string_of_jsbytes("bdo"),
     cst_nbsp=caml_string_of_jsbytes("nbsp"),
     cst_html$0=caml_string_of_jsbytes("html"),
     cst_aria=caml_string_of_jsbytes("aria-"),
     cst_scrolling=caml_string_of_jsbytes("scrolling"),
     cst_frameborder=caml_string_of_jsbytes("frameborder"),
     cst_char=caml_string_of_jsbytes("char"),
     cst_rules=caml_string_of_jsbytes("rules"),
     cst_scope=caml_string_of_jsbytes("scope"),
     cst_align=caml_string_of_jsbytes("align"),
     cst_type$8=caml_string_of_jsbytes("type"),
     cst_type$7=caml_string_of_jsbytes("type"),
     cst_type$6=caml_string_of_jsbytes("type"),
     cst_type$5=caml_string_of_jsbytes("type"),
     cst_wrap$0=caml_string_of_jsbytes("wrap"),
     cst_translate$0=caml_string_of_jsbytes("translate"),
     cst_step=caml_string_of_jsbytes("step"),
     cst_sizes=caml_string_of_jsbytes("sizes"),
     cst_spellcheck=caml_string_of_jsbytes("spellcheck"),
     cst_sandbox=caml_string_of_jsbytes("sandbox"),
     cst_preload=caml_string_of_jsbytes("preload"),
     cst_inputmode=caml_string_of_jsbytes("inputmode"),
     cst_draggable=caml_string_of_jsbytes("draggable"),
     cst_dir=caml_string_of_jsbytes("dir"),
     cst_contenteditable=caml_string_of_jsbytes("contenteditable"),
     cst_crossorigin=caml_string_of_jsbytes("crossorigin"),
     cst_autocomplete=caml_string_of_jsbytes("autocomplete"),
     cst_referrerpolicy=caml_string_of_jsbytes("referrerpolicy"),
     cst_method$0=caml_string_of_jsbytes("method"),
     cst_width$0=caml_string_of_jsbytes("width"),
     cst_height$0=caml_string_of_jsbytes("height"),
     cst_download=caml_string_of_jsbytes("download"),
     cst_accesskey=caml_string_of_jsbytes("accesskey"),
     cst_xml_space$0=caml_string_of_jsbytes("xml:space"),
     cst_xmlns$4=caml_string_of_jsbytes("xmlns"),
     cst_data$0=caml_string_of_jsbytes("data-"),
     content_type$0=caml_string_of_jsbytes("text/html"),
     alternative_content_types=
      [0,
       caml_string_of_jsbytes("application/xhtml+xml"),
       [0,
        caml_string_of_jsbytes("application/xml"),
        [0,caml_string_of_jsbytes("text/xml"),0]]],
     version$0=caml_string_of_jsbytes("HTML5-draft"),
     standard$0=caml_string_of_jsbytes("http://www.w3.org/TR/html5/"),
     namespace$0=caml_string_of_jsbytes("http://www.w3.org/1999/xhtml"),
     cst_html=caml_string_of_jsbytes("html"),
     emptytags=
      caml_list_of_js_array
       ([caml_string_of_jsbytes("area"),
         caml_string_of_jsbytes("base"),
         caml_string_of_jsbytes("br"),
         caml_string_of_jsbytes("col"),
         caml_string_of_jsbytes("command"),
         caml_string_of_jsbytes("embed"),
         caml_string_of_jsbytes("hr"),
         caml_string_of_jsbytes("img"),
         caml_string_of_jsbytes("input"),
         caml_string_of_jsbytes("keygen"),
         caml_string_of_jsbytes("link"),
         caml_string_of_jsbytes("meta"),
         caml_string_of_jsbytes("param"),
         caml_string_of_jsbytes("source"),
         caml_string_of_jsbytes("wbr")]),
     cst_class$0=caml_string_of_jsbytes("class"),
     cst_id$0=caml_string_of_jsbytes("id"),
     cst_title$0=caml_string_of_jsbytes("title"),
     cst_xml_lang$0=caml_string_of_jsbytes("xml:lang"),
     cst_lang$0=caml_string_of_jsbytes("lang"),
     cst_style$1=caml_string_of_jsbytes("style"),
     cst_property=caml_string_of_jsbytes("property"),
     cst_onabort$0=caml_string_of_jsbytes("onabort"),
     cst_onafterprint=caml_string_of_jsbytes("onafterprint"),
     cst_onbeforeprint=caml_string_of_jsbytes("onbeforeprint"),
     cst_onbeforeunload=caml_string_of_jsbytes("onbeforeunload"),
     cst_onblur=caml_string_of_jsbytes("onblur"),
     cst_oncanplay=caml_string_of_jsbytes("oncanplay"),
     cst_oncanplaythrough=caml_string_of_jsbytes("oncanplaythrough"),
     cst_onchange=caml_string_of_jsbytes("onchange"),
     cst_ondurationchange=caml_string_of_jsbytes("ondurationchange"),
     cst_onemptied=caml_string_of_jsbytes("onemptied"),
     cst_onended=caml_string_of_jsbytes("onended"),
     cst_onerror$0=caml_string_of_jsbytes("onerror"),
     cst_onfocus=caml_string_of_jsbytes("onfocus"),
     cst_onformchange=caml_string_of_jsbytes("onformchange"),
     cst_onforminput=caml_string_of_jsbytes("onforminput"),
     cst_onhashchange=caml_string_of_jsbytes("onhashchange"),
     cst_oninput=caml_string_of_jsbytes("oninput"),
     cst_oninvalid=caml_string_of_jsbytes("oninvalid"),
     cst_onoffline=caml_string_of_jsbytes("onoffline"),
     cst_ononline=caml_string_of_jsbytes("ononline"),
     cst_onpause=caml_string_of_jsbytes("onpause"),
     cst_onplay=caml_string_of_jsbytes("onplay"),
     cst_onplaying=caml_string_of_jsbytes("onplaying"),
     cst_onpagehide=caml_string_of_jsbytes("onpagehide"),
     cst_onpageshow=caml_string_of_jsbytes("onpageshow"),
     cst_onpopstate=caml_string_of_jsbytes("onpopstate"),
     cst_onprogress=caml_string_of_jsbytes("onprogress"),
     cst_onratechange=caml_string_of_jsbytes("onratechange"),
     cst_onreadystatechange=caml_string_of_jsbytes("onreadystatechange"),
     cst_onredo=caml_string_of_jsbytes("onredo"),
     cst_onresize$0=caml_string_of_jsbytes("onresize"),
     cst_onscroll$0=caml_string_of_jsbytes("onscroll"),
     cst_onseeked=caml_string_of_jsbytes("onseeked"),
     cst_onseeking=caml_string_of_jsbytes("onseeking"),
     cst_onselect=caml_string_of_jsbytes("onselect"),
     cst_onshow=caml_string_of_jsbytes("onshow"),
     cst_onstalled=caml_string_of_jsbytes("onstalled"),
     cst_onstorage=caml_string_of_jsbytes("onstorage"),
     cst_onsubmit=caml_string_of_jsbytes("onsubmit"),
     cst_onsuspend=caml_string_of_jsbytes("onsuspend"),
     cst_ontimeupdate=caml_string_of_jsbytes("ontimeupdate"),
     cst_onundo=caml_string_of_jsbytes("onundo"),
     cst_onunload$0=caml_string_of_jsbytes("onunload"),
     cst_onvolumechange=caml_string_of_jsbytes("onvolumechange"),
     cst_onwaiting=caml_string_of_jsbytes("onwaiting"),
     cst_onload$0=caml_string_of_jsbytes("onload"),
     cst_onloadeddata=caml_string_of_jsbytes("onloadeddata"),
     cst_onloadedmetadata=caml_string_of_jsbytes("onloadedmetadata"),
     cst_onloadstart=caml_string_of_jsbytes("onloadstart"),
     cst_onmessage=caml_string_of_jsbytes("onmessage"),
     cst_onmousewheel=caml_string_of_jsbytes("onmousewheel"),
     cst_onclick$0=caml_string_of_jsbytes("onclick"),
     cst_oncontextmenu=caml_string_of_jsbytes("oncontextmenu"),
     cst_ondblclick=caml_string_of_jsbytes("ondblclick"),
     cst_ondrag=caml_string_of_jsbytes("ondrag"),
     cst_ondragend=caml_string_of_jsbytes("ondragend"),
     cst_ondragenter=caml_string_of_jsbytes("ondragenter"),
     cst_ondragleave=caml_string_of_jsbytes("ondragleave"),
     cst_ondragover=caml_string_of_jsbytes("ondragover"),
     cst_ondragstart=caml_string_of_jsbytes("ondragstart"),
     cst_ondrop=caml_string_of_jsbytes("ondrop"),
     cst_onmousedown$0=caml_string_of_jsbytes("onmousedown"),
     cst_onmouseup$0=caml_string_of_jsbytes("onmouseup"),
     cst_onmouseover$0=caml_string_of_jsbytes("onmouseover"),
     cst_onmousemove$0=caml_string_of_jsbytes("onmousemove"),
     cst_onmouseout$0=caml_string_of_jsbytes("onmouseout"),
     cst_ontouchstart$0=caml_string_of_jsbytes("ontouchstart"),
     cst_ontouchend$0=caml_string_of_jsbytes("ontouchend"),
     cst_ontouchmove$0=caml_string_of_jsbytes("ontouchmove"),
     cst_ontouchcancel$0=caml_string_of_jsbytes("ontouchcancel"),
     cst_onkeypress=caml_string_of_jsbytes("onkeypress"),
     cst_onkeydown=caml_string_of_jsbytes("onkeydown"),
     cst_onkeyup=caml_string_of_jsbytes("onkeyup"),
     cst_version$0=caml_string_of_jsbytes("version"),
     cst_manifest=caml_string_of_jsbytes("manifest"),
     cst_cite=caml_string_of_jsbytes("cite"),
     cst_charset=caml_string_of_jsbytes("charset"),
     cst_accept_charset=caml_string_of_jsbytes("accept-charset"),
     cst_accept=caml_string_of_jsbytes("accept"),
     cst_href$0=caml_string_of_jsbytes("href"),
     cst_hreflang=caml_string_of_jsbytes("hreflang"),
     cst_rel=caml_string_of_jsbytes("rel"),
     cst_tabindex=caml_string_of_jsbytes("tabindex"),
     cst_type$4=caml_string_of_jsbytes("type"),
     cst_alt=caml_string_of_jsbytes("alt"),
     cst_src=caml_string_of_jsbytes("src"),
     cst_for=caml_string_of_jsbytes("for"),
     cst_for$0=caml_string_of_jsbytes("for"),
     cst_selected=caml_string_of_jsbytes("selected"),
     cst_value=caml_string_of_jsbytes("value"),
     cst_value$0=caml_string_of_jsbytes("value"),
     cst_value$1=caml_string_of_jsbytes("value"),
     cst_value$2=caml_string_of_jsbytes("value"),
     cst_action=caml_string_of_jsbytes("action"),
     cst_enctype=caml_string_of_jsbytes("enctype"),
     cst_checked=caml_string_of_jsbytes("checked"),
     cst_disabled=caml_string_of_jsbytes("disabled"),
     cst_readonly=caml_string_of_jsbytes("readonly"),
     cst_maxlength=caml_string_of_jsbytes("maxlength"),
     cst_minlength=caml_string_of_jsbytes("minlength"),
     cst_name$0=caml_string_of_jsbytes("name"),
     cst_allowfullscreen=caml_string_of_jsbytes("allowfullscreen"),
     cst_allowpaymentrequest=caml_string_of_jsbytes("allowpaymentrequest"),
     cst_async=caml_string_of_jsbytes("async"),
     cst_autofocus=caml_string_of_jsbytes("autofocus"),
     cst_autoplay=caml_string_of_jsbytes("autoplay"),
     cst_muted=caml_string_of_jsbytes("muted"),
     cst_integrity=caml_string_of_jsbytes("integrity"),
     cst_mediagroup=caml_string_of_jsbytes("mediagroup"),
     cst_challenge=caml_string_of_jsbytes("challenge"),
     cst_contextmenu=caml_string_of_jsbytes("contextmenu"),
     cst_controls=caml_string_of_jsbytes("controls"),
     cst_form=caml_string_of_jsbytes("form"),
     cst_formaction=caml_string_of_jsbytes("formaction"),
     cst_formenctype=caml_string_of_jsbytes("formenctype"),
     cst_formnovalidate=caml_string_of_jsbytes("formnovalidate"),
     cst_formtarget=caml_string_of_jsbytes("formtarget"),
     cst_hidden=caml_string_of_jsbytes("hidden"),
     cst_high=caml_string_of_jsbytes("high"),
     cst_icon=caml_string_of_jsbytes("icon"),
     cst_ismap=caml_string_of_jsbytes("ismap"),
     cst_keytype=caml_string_of_jsbytes("keytype"),
     cst_list=caml_string_of_jsbytes("list"),
     cst_loop=caml_string_of_jsbytes("loop"),
     cst_low=caml_string_of_jsbytes("low"),
     cst_max$0=caml_string_of_jsbytes("max"),
     cst_max$1=caml_string_of_jsbytes("max"),
     cst_min$0=caml_string_of_jsbytes("min"),
     cst_min$1=caml_string_of_jsbytes("min"),
     cst_novalidate=caml_string_of_jsbytes("novalidate"),
     cst_open=caml_string_of_jsbytes("open"),
     cst_optimum=caml_string_of_jsbytes("optimum"),
     cst_pattern$0=caml_string_of_jsbytes("pattern"),
     cst_placeholder=caml_string_of_jsbytes("placeholder"),
     cst_poster=caml_string_of_jsbytes("poster"),
     cst_pubdate=caml_string_of_jsbytes("pubdate"),
     cst_radiogroup=caml_string_of_jsbytes("radiogroup"),
     cst_required=caml_string_of_jsbytes("required"),
     cst_reserved=caml_string_of_jsbytes("reserved"),
     cst_scoped=caml_string_of_jsbytes("scoped"),
     cst_seamless=caml_string_of_jsbytes("seamless"),
     cst_span=caml_string_of_jsbytes("span"),
     cst_xml_lang$1=caml_string_of_jsbytes("xml:lang"),
     cst_srcset=caml_string_of_jsbytes("srcset"),
     cst_sizes$0=caml_string_of_jsbytes("sizes"),
     cst_start$0=caml_string_of_jsbytes("start"),
     cst_size=caml_string_of_jsbytes("size"),
     cst_multiple=caml_string_of_jsbytes("multiple"),
     cst_cols=caml_string_of_jsbytes("cols"),
     cst_rows=caml_string_of_jsbytes("rows"),
     cst_summary=caml_string_of_jsbytes("summary"),
     cst_axis=caml_string_of_jsbytes("axis"),
     cst_colspan=caml_string_of_jsbytes("colspan"),
     cst_headers=caml_string_of_jsbytes("headers"),
     cst_rowspan=caml_string_of_jsbytes("rowspan"),
     cst_border=caml_string_of_jsbytes("border"),
     cst_data$1=caml_string_of_jsbytes("data"),
     cst_codetype=caml_string_of_jsbytes("codetype"),
     cst_marginheight=caml_string_of_jsbytes("marginheight"),
     cst_marginwidth=caml_string_of_jsbytes("marginwidth"),
     cst_target=caml_string_of_jsbytes("target"),
     cst_content=caml_string_of_jsbytes("content"),
     cst_http_equiv=caml_string_of_jsbytes("http-equiv"),
     cst_media$0=caml_string_of_jsbytes("media"),
     cst_role=caml_string_of_jsbytes("role"),
     cst_body=caml_string_of_jsbytes("body"),
     cst_head=caml_string_of_jsbytes("head"),
     cst_title$1=caml_string_of_jsbytes("title"),
     cst_footer=caml_string_of_jsbytes("footer"),
     cst_header=caml_string_of_jsbytes("header"),
     cst_section=caml_string_of_jsbytes("section"),
     cst_nav=caml_string_of_jsbytes("nav"),
     cst_h1=caml_string_of_jsbytes("h1"),
     cst_h2=caml_string_of_jsbytes("h2"),
     cst_h3=caml_string_of_jsbytes("h3"),
     cst_h4=caml_string_of_jsbytes("h4"),
     cst_h5=caml_string_of_jsbytes("h5"),
     cst_h6=caml_string_of_jsbytes("h6"),
     cst_hgroup=caml_string_of_jsbytes("hgroup"),
     cst_address=caml_string_of_jsbytes("address"),
     cst_blockquote=caml_string_of_jsbytes("blockquote"),
     cst_div=caml_string_of_jsbytes("div"),
     cst_p=caml_string_of_jsbytes("p"),
     cst_pre=caml_string_of_jsbytes("pre"),
     cst_abbr=caml_string_of_jsbytes("abbr"),
     cst_br=caml_string_of_jsbytes("br"),
     cst_cite$0=caml_string_of_jsbytes("cite"),
     cst_code=caml_string_of_jsbytes("code"),
     cst_dfn=caml_string_of_jsbytes("dfn"),
     cst_em$0=caml_string_of_jsbytes("em"),
     cst_kbd=caml_string_of_jsbytes("kbd"),
     cst_q=caml_string_of_jsbytes("q"),
     cst_samp=caml_string_of_jsbytes("samp"),
     cst_span$0=caml_string_of_jsbytes("span"),
     cst_strong=caml_string_of_jsbytes("strong"),
     cst_time=caml_string_of_jsbytes("time"),
     cst_var=caml_string_of_jsbytes("var"),
     cst_a$1=caml_string_of_jsbytes("a"),
     cst_dl=caml_string_of_jsbytes("dl"),
     cst_ol=caml_string_of_jsbytes("ol"),
     cst_ul=caml_string_of_jsbytes("ul"),
     cst_dd=caml_string_of_jsbytes("dd"),
     cst_dt=caml_string_of_jsbytes("dt"),
     cst_li=caml_string_of_jsbytes("li"),
     cst_hr=caml_string_of_jsbytes("hr"),
     cst_b$0=caml_string_of_jsbytes("b"),
     cst_i=caml_string_of_jsbytes("i"),
     cst_u=caml_string_of_jsbytes("u"),
     cst_small=caml_string_of_jsbytes("small"),
     cst_sub=caml_string_of_jsbytes("sub"),
     cst_sup=caml_string_of_jsbytes("sup"),
     cst_mark=caml_string_of_jsbytes("mark"),
     cst_rp=caml_string_of_jsbytes("rp"),
     cst_rt=caml_string_of_jsbytes("rt"),
     cst_ruby=caml_string_of_jsbytes("ruby"),
     cst_wbr=caml_string_of_jsbytes("wbr"),
     cst_datetime=caml_string_of_jsbytes("datetime"),
     cst_usemap=caml_string_of_jsbytes("usemap"),
     cst_defer=caml_string_of_jsbytes("defer"),
     cst_label=caml_string_of_jsbytes("label"),
     cst_map=caml_string_of_jsbytes("map"),
     cst_del=caml_string_of_jsbytes("del"),
     cst_ins=caml_string_of_jsbytes("ins"),
     cst_script$0=caml_string_of_jsbytes("script"),
     cst_noscript=caml_string_of_jsbytes("noscript"),
     cst_template=caml_string_of_jsbytes("template"),
     cst_article=caml_string_of_jsbytes("article"),
     cst_aside=caml_string_of_jsbytes("aside"),
     cst_main=caml_string_of_jsbytes("main"),
     cst_audio=caml_string_of_jsbytes("audio"),
     cst_video=caml_string_of_jsbytes("video"),
     cst_canvas=caml_string_of_jsbytes("canvas"),
     cst_embed=caml_string_of_jsbytes("embed"),
     cst_source=caml_string_of_jsbytes("source"),
     cst_meter=caml_string_of_jsbytes("meter"),
     cst_output=caml_string_of_jsbytes("output"),
     cst_form$0=caml_string_of_jsbytes("form"),
     cst_input=caml_string_of_jsbytes("input"),
     cst_keygen=caml_string_of_jsbytes("keygen"),
     cst_label$0=caml_string_of_jsbytes("label"),
     cst_option=caml_string_of_jsbytes("option"),
     cst_select=caml_string_of_jsbytes("select"),
     cst_textarea=caml_string_of_jsbytes("textarea"),
     cst_button=caml_string_of_jsbytes("button"),
     cst_progress=caml_string_of_jsbytes("progress"),
     cst_legend=caml_string_of_jsbytes("legend"),
     cst_summary$0=caml_string_of_jsbytes("summary"),
     cst_figcaption=caml_string_of_jsbytes("figcaption"),
     cst_caption=caml_string_of_jsbytes("caption"),
     cst_td=caml_string_of_jsbytes("td"),
     cst_th=caml_string_of_jsbytes("th"),
     cst_tr=caml_string_of_jsbytes("tr"),
     cst_colgroup=caml_string_of_jsbytes("colgroup"),
     cst_col=caml_string_of_jsbytes("col"),
     cst_thead=caml_string_of_jsbytes("thead"),
     cst_tbody=caml_string_of_jsbytes("tbody"),
     cst_tfoot=caml_string_of_jsbytes("tfoot"),
     cst_iframe=caml_string_of_jsbytes("iframe"),
     cst_param=caml_string_of_jsbytes("param"),
     cst_meta=caml_string_of_jsbytes("meta"),
     cst_base=caml_string_of_jsbytes("base"),
     Stdlib=global_data.Stdlib,
     Stdlib_List=global_data.Stdlib__List,
     Stdlib_Seq=global_data.Stdlib__Seq,
     Stdlib_Printf=global_data.Stdlib__Printf,
     Stdlib_String=global_data.Stdlib__String,
     Stdlib_Format=global_data.Stdlib__Format,
     Stdlib_Set=global_data.Stdlib__Set,
     Stdlib_Uchar=global_data.Stdlib__Uchar,
     Stdlib_Buffer=global_data.Stdlib__Buffer,
     Uutf=global_data.Uutf,
     Re=global_data.Re,
     _L_=[0,[2,0,[12,61,[2,0,0]]],caml_string_of_jsbytes("%s=%s")],
     _H_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _I_=[0,[12,34,[4,0,0,0,[12,34,0]]],caml_string_of_jsbytes('"%d"')],
     _J_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _K_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _F_=
      [0,
       [2,0,[17,[0,caml_string_of_jsbytes("@,"),0,0],0]],
       caml_string_of_jsbytes("%s@,")],
     _G_=
      [0,
       [11,
        caml_string_of_jsbytes("<!-- "),
        [2,
         0,
         [11,
          caml_string_of_jsbytes(" -->"),
          [17,[0,caml_string_of_jsbytes("@,"),0,0],0]]]],
       caml_string_of_jsbytes("<!-- %s -->@,")],
     _C_=
      [0,
       [12,
        60,
        [16,
         [15,
          [12,
           62,
           [16,
            [15,[16,[16,[11,caml_string_of_jsbytes("<\/"),[2,0,partial]]]]]]]]]],
       caml_string_of_jsbytes("<%t%a>%t%a%t%t<\/%s>")],
     _D_=
      [0,
       [11,
        caml_string_of_jsbytes("<!--"),
        [2,0,[11,caml_string_of_jsbytes("-->"),0]]],
       caml_string_of_jsbytes("<!--%s-->")],
     _E_=[0,[12,38,[2,0,[12,59,0]]],caml_string_of_jsbytes("&%s;")],
     _A_=
      [0,
       [12,60,[15,[11,caml_string_of_jsbytes("/>"),0]]],
       caml_string_of_jsbytes("<%a/>")],
     _B_=
      [0,
       [12,
        60,
        [15,[12,62,[16,[11,caml_string_of_jsbytes("<\/"),[2,0,[12,62,0]]]]]]],
       caml_string_of_jsbytes("<%a>%t<\/%s>")],
     _z_=[0,[2,0,[15,[16,0]]],caml_string_of_jsbytes("%s%a%t")],
     _y_=[0,[16,[2,0,[12,61,[15,0]]]],caml_string_of_jsbytes("%t%s=%a")],
     _u_=[0,[12,34,[15,[12,34,0]]],caml_string_of_jsbytes('"%a"')],
     _v_=[0,[12,34,[4,0,0,0,[12,34,0]]],caml_string_of_jsbytes('"%d"')],
     _w_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _x_=[0,[12,34,[15,[12,34,0]]],caml_string_of_jsbytes('"%a"')],
     _t_=[0,[12,44,[16,0]],caml_string_of_jsbytes(",%t")],
     _s_=
      [0,
       [18,[1,[0,0,caml_string_of_jsbytes("")]],[15,[17,0,0]]],
       caml_string_of_jsbytes("@[%a@]")],
     _r_=[0,[15,0],caml_string_of_jsbytes("%a")],
     _n_=[0,[4,0,0,0,[12,101,[4,0,0,0,0]]],caml_string_of_jsbytes("%de%d")],
     _o_=[0,[8,[0,0,3],0,[0,12],0],caml_string_of_jsbytes("%.12g")],
     _p_=[0,[8,[0,0,3],0,[0,15],0],caml_string_of_jsbytes("%.15g")],
     _q_=[0,[8,[0,0,3],0,[0,18],0],caml_string_of_jsbytes("%.18g")],
     _m_=[0,1],
     _c_=[0,[12,34,[2,0,[12,34,0]]],caml_string_of_jsbytes('"%s"')],
     _d_=
      [0,
       [11,caml_string_of_jsbytes(" PUBLIC "),[15,0]],
       caml_string_of_jsbytes(" PUBLIC %a")],
     _e_=
      [0,
       [11,caml_string_of_jsbytes("<!DOCTYPE "),[2,0,[15,[12,62,0]]]],
       caml_string_of_jsbytes("<!DOCTYPE %s%a>")],
     _b_=
      [0,
       [11,
        caml_string_of_jsbytes('<?xml version="'),
        [2,
         0,
         [11,
          caml_string_of_jsbytes('" encoding="'),
          [2,0,[11,caml_string_of_jsbytes('"?>\\n'),0]]]]],
       caml_string_of_jsbytes('<?xml version="%s" encoding="%s"?>\\n')],
     _X_=
      [0,
       [11,caml_string_of_jsbytes("skewY("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes("skewY(%s)")],
     _Y_=
      [0,
       [11,caml_string_of_jsbytes("skewX("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes("skewX(%s)")],
     _Z_=
      [0,
       [11,caml_string_of_jsbytes("scale("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes("scale(%s)")],
     ___=
      [0,
       [8,[0,0,3],0,0,[12,32,[8,[0,0,3],0,0,0]]],
       caml_string_of_jsbytes("%g %g")],
     _$_=
      [0,
       [11,caml_string_of_jsbytes("rotate("),[2,0,[12,32,[2,0,[12,41,0]]]]],
       caml_string_of_jsbytes("rotate(%s %s)")],
     _aa_=
      [0,
       [11,
        caml_string_of_jsbytes("matrix("),
        [8,
         [0,0,3],
         0,
         0,
         [12,
          32,
          [8,
           [0,0,3],
           0,
           0,
           [12,
            32,
            [8,
             [0,0,3],
             0,
             0,
             [12,32,[8,[0,0,3],0,0,[12,32,[8,partial$1,0,0,partial$0]]]]]]]]]],
       caml_string_of_jsbytes("matrix(%g %g %g %g %g %g)")],
     _ab_=
      [0,
       [11,caml_string_of_jsbytes("translate("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes("translate(%s)")],
     _U_=
      [0,
       [8,[0,0,3],0,0,[11,caml_string_of_jsbytes(", "),[8,[0,0,3],0,0,0]]],
       caml_string_of_jsbytes("%g, %g")],
     _V_=[0,[8,[0,0,3],0,0,0],caml_string_of_jsbytes("%g")],
     _T_=
      [0,
       [2,0,[12,32,[2,0,[12,32,[2,0,[12,32,[2,0,0]]]]]]],
       caml_string_of_jsbytes("%s %s %s %s")],
     _S_=
      [0,
       [8,[0,0,3],0,0,[11,caml_string_of_jsbytes(", "),[8,[0,0,3],0,0,0]]],
       caml_string_of_jsbytes("%g, %g")],
     _W_=[0,caml_string_of_jsbytes("; ")],
     _R_=
      [0,
       caml_string_of_jsbytes("-//W3C//DTD SVG 1.1//EN"),
       [0,
        caml_string_of_jsbytes
         ("http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"),
        0]],
     _Q_=[0,[8,[0,0,3],0,0,[2,0,0]],caml_string_of_jsbytes("%g%s")],
     _P_=
      [0,
       [11,caml_string_of_jsbytes("url("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes("url(%s)")],
     _ag_=[0,[2,0,[12,32,[2,0,[12,120,0]]]],caml_string_of_jsbytes("%s %sx")],
     _af_=[0,[2,0,[12,32,[2,0,[12,119,0]]]],caml_string_of_jsbytes("%s %sw")],
     _ae_=[0,[4,0,0,0,[12,120,[4,0,0,0,0]]],caml_string_of_jsbytes("%dx%d")];
    function fmap(f){return f}
    function nil(param){return 0}
    function singleton(x){return [0,x,0]}
    function cons(x,xs){return [0,x,xs]}
    function append(x,y){return caml_call2(Stdlib[37],x,y)}
    var
     map=Stdlib_List[19],
     Xml_wrap=
      [0,[0,function(_nk_){return _nk_},fmap,nil,singleton,cons,append,map]];
    caml_register_global(1088,Xml_wrap,"Xml_wrap");
    var
     Malformed_stream=
      [248,cst_Xml_stream_Malformed_strea,runtime.caml_fresh_oo_id(0)];
    function _a_(Xml)
     {function of_list(l)
       {var _nh_=caml_call1(Xml[1][3],0);
        function _ni_(a,b)
         {var _nj_=caml_call1(Xml[1][1],a);
          return caml_call2(Xml[1][5],_nj_,b)}
        return caml_call3(Stdlib_List[26],_ni_,l,_nh_)}
      function mk(children,seq)
       {var children$0=children,seq$0=seq;
        for(;;)
         {var match=caml_call1(seq$0,0);
          if(match)
           {var _m$_=match[1];
            if(typeof _m$_ === "number")
             {var rest=match[2];
              return [0,of_list(caml_call1(Stdlib_List[9],children$0)),rest]}
            var _na_=_m$_[1];
            if(856096383 === _na_)
             {var
               q=match[2],
               _nb_=_m$_[2],
               attrs=_nb_[2],
               match$0=_nb_[1],
               name=match$0[2],
               f=
                function(param)
                 {var
                   v=param[2],
                   match=param[1],
                   name=match[2],
                   _ng_=caml_call1(Xml[1][1],v);
                  return caml_call2(Xml[6],name,_ng_)},
               a=caml_call2(Stdlib_List[19],f,attrs),
               match$1=mk(0,q),
               rest$0=match$1[2],
               sub_children=match$1[1],
               children$1=
                [0,caml_call3(Xml[21],[0,a],name,sub_children),children$0],
               children$0=children$1,
               seq$0=rest$0;
              continue}
            if(936573133 <= _na_)
             {var
               q$0=match[2],
               s=_m$_[2],
               _nc_=
                function(x)
                 {var _nf_=caml_call1(Xml[1][1],x);
                  return caml_call1(Xml[17],_nf_)},
               _nd_=caml_call2(Stdlib_List[19],_nc_,s),
               children$2=caml_call2(Stdlib[37],_nd_,children$0),
               children$0=children$2,
               seq$0=q$0;
              continue}
            var
             q$1=match[2],
             s$0=_m$_[2],
             children$3=[0,caml_call1(Xml[16],s$0),children$0],
             children$0=children$3,
             seq$0=q$1;
            continue}
          var _ne_=Stdlib_Seq[18];
          return [0,of_list(caml_call1(Stdlib_List[9],children$0)),_ne_]}}
      function of_seq(seq)
       {var
         match=mk(0,seq),
         rest=match[2],
         l=match[1],
         match$0=caml_call1(rest,0);
        if(match$0)throw Malformed_stream;
        return l}
      return [0,of_seq]}
    var Xml_stream=[0,Malformed_stream,_a_];
    caml_register_global(1090,Xml_stream,"Xml_stream");
    function add_unsafe_char(b,c)
     {if(34 === c)return caml_call2(Stdlib_Buffer[16],b,cst_quot);
      if(60 <= c)
       {if(! (63 <= c))
         switch(c - 60 | 0)
          {case 0:return caml_call2(Stdlib_Buffer[16],b,cst_lt);
           case 1:break;
           default:return caml_call2(Stdlib_Buffer[16],b,cst_gt)}}
      else
       if(38 === c)return caml_call2(Stdlib_Buffer[16],b,cst_amp);
      var _m4_=c <= 8?1:0;
      if(_m4_)
       var _m5_=_m4_;
      else
       {var _m6_=11 === c?1:0;
        if(_m6_)
         var _m5_=_m6_;
        else
         {var _m7_=12 === c?1:0;
          if(_m7_)
           var _m5_=_m7_;
          else
           var
            _m8_=14 <= c?1:0,
            _m9_=_m8_?c <= 31?1:0:_m8_,
            _m5_=_m9_ || (127 === c?1:0)}}
      if(_m5_)
       {caml_call2(Stdlib_Buffer[16],b,cst);
        var _m__=caml_call1(Stdlib[33],c);
        caml_call2(Stdlib_Buffer[16],b,_m__);
        return caml_call2(Stdlib_Buffer[16],b,cst$0)}
      return caml_call2(Stdlib_Buffer[12],b,c)}
    function encode_unsafe_char(s)
     {var b=caml_call1(Stdlib_Buffer[1],caml_ml_string_length(s));
      function _m2_(_m3_){return add_unsafe_char(b,_m3_)}
      caml_call2(Stdlib_String[29],_m2_,s);
      return caml_call1(Stdlib_Buffer[2],b)}
    function encode_unsafe_char_and_at(s)
     {var b=caml_call1(Stdlib_Buffer[1],caml_ml_string_length(s));
      function f(c)
       {return 64 === c
                ?caml_call2(Stdlib_Buffer[16],b,cst_64)
                :add_unsafe_char(b,c)}
      caml_call2(Stdlib_String[29],f,s);
      return caml_call1(Stdlib_Buffer[2],b)}
    function compose_decl(opt,_m1_,param)
     {if(opt)var sth=opt[1],version=sth;else var version=cst_1_0;
      if(_m1_)var sth$0=_m1_[1],encoding=sth$0;else var encoding=cst_UTF_8;
      return caml_call3(Stdlib_Format[132],_b_,version,encoding)}
    function compose_doctype(dt,args)
     {function pp_args(fmt,l)
       {if(l)
         {var
           _mZ_=function(fmt){return caml_call2(Stdlib_Format[129],fmt,_c_)},
           _m0_=caml_call2(Stdlib_Format[123],[0,Stdlib_Format[27]],_mZ_);
          return caml_call4(Stdlib_Format[129],fmt,_d_,_m0_,l)}
        return 0}
      return caml_call4(Stdlib_Format[133],_e_,dt,pp_args,args)}
    var
     _f_=[0,caml_call1(Re[23],cst$1),0],
     _g_=[0,caml_call1(Re[23],cst$2),_f_],
     _h_=[0,caml_call1(Re[23],cst$3),0],
     _i_=[0,caml_call1(Re[26],[0,Re[37],_h_]),_g_],
     _j_=[0,caml_call1(Re[23],cst$4),0],
     _k_=[0,caml_call1(Re[26],[0,Re[37],_j_]),_i_],
     _l_=caml_call1(Re[25],_k_),
     re_end_comment=caml_call1(Re[2],_l_);
    function pp_number(fmt,v)
     {if(v == Stdlib[22])
       return caml_call2(Stdlib_Format[13],fmt,cst_Infinity);
      if(v == Stdlib[23])
       return caml_call2(Stdlib_Format[13],fmt,cst_Infinity$0);
      if(v != v)return caml_call2(Stdlib_Format[13],fmt,cst_NaN);
      var n=v | 0;
      if(n == v)
       {var n$0=n,i=0;
        for(;;)
         {if(0 !== n$0 && 0 === (n$0 % 10 | 0))
           {var i$0=i + 1 | 0,n$1=n$0 / 10 | 0,n$0=n$1,i=i$0;continue}
          return 2 < i
                  ?caml_call4(Stdlib_Format[129],fmt,_n_,n$0,i)
                  :caml_call2(Stdlib_Format[19],fmt,n)}}
      var s1=caml_call2(Stdlib_Printf[4],_o_,v);
      if(v == caml_float_of_string(s1))
       return caml_call2(Stdlib_Format[13],fmt,s1);
      var s2=caml_call2(Stdlib_Printf[4],_p_,v);
      return v == caml_float_of_string(s2)
              ?caml_call2(Stdlib_Format[13],fmt,s2)
              :caml_call3(Stdlib_Format[129],fmt,_q_,v)}
    function string_of_number(v)
     {return caml_call3(Stdlib_Format[133],_r_,pp_number,v)}
    function normalize(src)
     {var
       warn=[0,0],
       buffer=caml_call1(Stdlib_Buffer[1],caml_ml_string_length(src)),
       _mV_=0;
      function _mW_(param,_mY_,d)
       {if(852405675 <= d[1])
         {var code=d[2];return caml_call2(Uutf[23][1],buffer,code)}
        caml_call2(Uutf[23][1],buffer,Uutf[2]);
        warn[1] = 1;
        return 0}
      caml_call5(Uutf[22][2],0,0,_mW_,_mV_,src);
      var _mX_=warn[1];
      return [0,caml_call1(Stdlib_Buffer[2],buffer),_mX_]}
    function normalize_html(src)
     {var l=caml_ml_string_length(src),i=0;
      for(;;)
       {var _mP_=i < l?1:0;
        if(_mP_)
         {var match=runtime.caml_string_get(src,i),switch$0=0;
          if(35 <= match)
           {if(61 <= match)
             {if(62 === match)switch$0 = 1;else if(127 <= match)switch$0 = 2}
            else
             if(38 === match || 60 <= match)switch$0 = 1}
          else
           if(11 <= match)
            {if(32 <= match)
              {if(34 <= match)switch$0 = 1}
             else
              if(13 !== match)switch$0 = 2}
           else
            if(! (9 <= match))switch$0 = 2;
          switch(switch$0)
           {case 2:var _mQ_=1;break;
            case 1:var _mQ_=1;break;
            default:var i$0=i + 1 | 0,i=i$0;continue}}
        else
         var _mQ_=_mP_;
        if(_mQ_)
         {var
           warn=[0,0],
           buffer=caml_call1(Stdlib_Buffer[1],caml_ml_string_length(src)),
           _mR_=0,
           _mS_=
            function(param,_mU_,d)
             {if(852405675 <= d[1])
               {var u=d[2],code=caml_call1(Stdlib_Uchar[10],u);
                if(34 === code)
                 return caml_call2(Stdlib_Buffer[16],buffer,cst_quot$0);
                if(60 <= code)
                 {if(! (63 <= code))
                   switch(code - 60 | 0)
                    {case 0:
                      return caml_call2(Stdlib_Buffer[16],buffer,cst_lt$0);
                     case 1:break;
                     default:return caml_call2(Stdlib_Buffer[16],buffer,cst_gt$4)}}
                else
                 if(38 === code)
                  return caml_call2(Stdlib_Buffer[16],buffer,cst_amp$0);
                var switch$0=0;
                if(! (31 < code) && 9 !== code && 10 !== code && 13 !== code)
                 switch$0 = 1;
                var switch$1=0;
                if(! switch$0)
                 {var switch$2=0;
                  if(127 <= code && ! (159 < code))switch$2 = 1;
                  if
                   (!
                    switch$2
                    &&
                    65534
                    !==
                    (code & 65535)
                    &&
                    65535
                    !==
                    (code & 65535))
                   {var u$0=u;switch$1 = 1}}
                if(! switch$1){warn[1] = 1;var u$0=Uutf[2]}
                return caml_call2(Uutf[23][1],buffer,u$0)}
              caml_call2(Uutf[23][1],buffer,Uutf[2]);
              warn[1] = 1;
              return 0};
          caml_call5(Uutf[22][2],0,0,_mS_,_mR_,src);
          var _mT_=warn[1];
          return [0,caml_call1(Stdlib_Buffer[2],buffer),_mT_]}
        return [0,src,0]}}
    function pp_noop(fmt,param){return 0}
    function Make_fmt(Xml,_lY_)
     {function open_box(indent,fmt)
       {return indent?caml_call2(Stdlib_Format[1],fmt,0):0}
      function close_box(indent,fmt)
       {return indent?caml_call2(Stdlib_Format[3],fmt,0):0}
      function sp(indent,fmt)
       {return indent
                ?caml_call2(Stdlib_Format[27],fmt,0)
                :caml_call2(Stdlib_Format[13],fmt,cst$9)}
      function cut(indent,fmt)
       {return indent?caml_call2(Stdlib_Format[29],fmt,0):0}
      var S=caml_call1(Stdlib_Set[1],[0,Stdlib_String[9]]),_lZ_=_lY_[1];
      if(_lZ_)
       var
        _l0_=S[1],
        _l1_=function(s,x){return caml_call2(S[4],x,s)},
        set=caml_call3(Stdlib_List[25],_l1_,_l0_,_lZ_),
        is_emptytag=function(x){return caml_call2(S[3],x,set)};
      else
       var is_emptytag=function(param){return 0};
      function pp_encode(encode,indent,fmt,s)
       {var s$0=caml_call1(encode,s);
        return indent
                ?caml_call4(Stdlib_Format[129],fmt,_s_,Stdlib_Format[125],s$0)
                :caml_call2(Stdlib_Format[13],fmt,s$0)}
      function pp_sep(indent,param)
       {return param
                ?function(fmt,param)
                  {function _mN_(_mO_){return sp(indent,_mO_)}
                   return caml_call3(Stdlib_Format[129],fmt,_t_,_mN_)}
                :function(fmt,param){return sp(indent,fmt)}}
      function pp_attrib_value(encode,indent,fmt,a)
       {var match=caml_call1(Xml[26],a);
        switch(match[0])
         {case 0:
           var f=match[1];
           return caml_call4(Stdlib_Format[129],fmt,_u_,pp_number,f);
          case 1:
           var i=match[1];return caml_call3(Stdlib_Format[129],fmt,_v_,i);
          case 2:
           var s=match[1],_mH_=caml_call1(encode,s);
           return caml_call3(Stdlib_Format[129],fmt,_w_,_mH_);
          default:
           var
            slist=match[2],
            sep=match[1],
            _mI_=
             function(_mL_,_mM_){return pp_encode(encode,indent,_mL_,_mM_)},
            _mJ_=[0,pp_sep(indent,sep)],
            _mK_=caml_call2(Stdlib_Format[123],_mJ_,_mI_);
           return caml_call4(Stdlib_Format[129],fmt,_x_,_mK_,slist)}}
      function pp_attrib(encode,indent,fmt,a)
       {function _mB_(_mF_,_mG_)
         {return pp_attrib_value(encode,indent,_mF_,_mG_)}
        var _mC_=caml_call1(Xml[25],a);
        function _mD_(_mE_){return sp(indent,_mE_)}
        return caml_call6(Stdlib_Format[129],fmt,_y_,_mD_,_mC_,_mB_,a)}
      function pp_attribs(encode,indent)
       {function _my_(_mz_,_mA_){return pp_attrib(encode,indent,_mz_,_mA_)}
        return caml_call2(Stdlib_Format[123],[0,pp_noop],_my_)}
      function pp_tag_and_attribs(encode,indent,fmt,param)
       {var attrs=param[2],tag=param[1];
        open_box(indent,fmt);
        function _mv_(_mx_){return cut(indent,_mx_)}
        var _mw_=pp_attribs(encode,indent);
        caml_call6(Stdlib_Format[129],fmt,_z_,tag,_mw_,attrs,_mv_);
        return close_box(indent,fmt)}
      function pp_closedtag(encode,indent,fmt,tag,attrs)
       {if(is_emptytag(tag))
         {var
           _ml_=[0,tag,attrs],
           _mm_=
            function(_mt_,_mu_)
             {return pp_tag_and_attribs(encode,indent,_mt_,_mu_)};
          return caml_call4(Stdlib_Format[129],fmt,_A_,_mm_,_ml_)}
        open_box(indent,fmt);
        function _mn_(_ms_){return cut(indent,_ms_)}
        var _mo_=[0,tag,attrs];
        function _mp_(_mq_,_mr_)
         {return pp_tag_and_attribs(encode,indent,_mq_,_mr_)}
        caml_call6(Stdlib_Format[129],fmt,_B_,_mp_,_mo_,_mn_,tag);
        return close_box(indent,fmt)}
      function pp_elts(encode,indent)
       {function _mh_(_mj_,_mk_){return pp_elt(encode,indent,_mj_,_mk_)}
        var _mi_=[0,function(fmt,param){return cut(indent,fmt)}];
        return caml_call2(Stdlib_Format[123],_mi_,_mh_)}
      function pp_tag(encode,indent,fmt,tag,attrs,children)
       {if(children)
         {open_box(indent,fmt);
          var
           _l6_=function(_mg_){return cut(indent,_mg_)},
           _l7_=function(_mf_){return close_box(indent,_mf_)},
           _l8_=pp_elts(encode,indent),
           _l9_=function(_me_){return cut(indent,_me_)},
           _l__=[0,tag,attrs],
           _l$_=
            function(_mc_,_md_)
             {return pp_tag_and_attribs(encode,indent,_mc_,_md_)},
           _ma_=function(_mb_){return open_box(indent,_mb_)};
          caml_call11
           (Stdlib_Format[129],
            fmt,
            _C_,
            _ma_,
            _l$_,
            _l__,
            _l9_,
            _l8_,
            children,
            _l7_,
            _l6_,
            tag);
          return close_box(indent,fmt)}
        return pp_closedtag(encode,indent,fmt,tag,attrs)}
      function pp_elt(encode,indent,fmt,elt)
       {var match=caml_call1(Xml[27],elt);
        if(typeof match === "number")
         return 0;
        else
         switch(match[0])
          {case 0:
            var
             texte=match[1],
             f=
              function(g)
               {var s=caml_call2(Re[1][1],g,0);
                return caml_string_notequal(s,cst$5)
                        ?caml_string_notequal(s,cst$6)
                          ?caml_string_notequal(s,cst$7)
                            ?caml_string_notequal(s,cst$8)?s:cst_gt$0
                            :cst_gt$1
                          :cst_gt$2
                        :cst_gt$3},
             _l5_=caml_call6(Re[21],0,0,_m_,re_end_comment,f,texte);
            return caml_call3(Stdlib_Format[129],fmt,_D_,_l5_);
           case 1:
            var texte$0=match[1];
            return caml_call2(Stdlib_Format[13],fmt,texte$0);
           case 2:
            var texte$1=match[1];return pp_encode(encode,indent,fmt,texte$1);
           case 3:
            var e=match[1];return caml_call3(Stdlib_Format[129],fmt,_E_,e);
           case 4:
            var xh_attrs=match[2],name=match[1];
            return pp_closedtag(encode,indent,fmt,name,xh_attrs);
           default:
            var xh_taglist=match[3],xh_attrs$0=match[2],name$0=match[1];
            return pp_tag(encode,indent,fmt,name$0,xh_attrs$0,xh_taglist)}}
      function pp(opt,_l2_,param)
       {if(opt)var sth=opt[1],encode=sth;else var encode=encode_unsafe_char;
        if(_l2_)var sth$0=_l2_[1],indent=sth$0;else var indent=0;
        return function(_l3_,_l4_){return pp_elt(encode,indent,_l3_,_l4_)}}
      return [0,
              open_box,
              close_box,
              sp,
              cut,
              S,
              is_emptytag,
              pp_encode,
              pp_sep,
              pp_attrib_value,
              pp_attrib,
              pp_attribs,
              pp_tag_and_attribs,
              pp_closedtag,
              pp_tag,
              pp_elt,
              pp_elts,
              pp]}
    function Make(Xml,I,O)
     {var symbol=O[2];
      function separator_to_string(param){return param?cst$10:cst$11}
      function attrib_value_to_string(encode,a)
       {var match=caml_call1(Xml[26],a);
        switch(match[0])
         {case 0:
           var f=match[1],_lU_=string_of_number(f);
           return caml_call2(Stdlib_Printf[4],_H_,_lU_);
          case 1:var i=match[1];return caml_call2(Stdlib_Printf[4],_I_,i);
          case 2:
           var s=match[1],_lV_=caml_call1(encode,s);
           return caml_call2(Stdlib_Printf[4],_J_,_lV_);
          default:
           var
            slist=match[2],
            sep=match[1],
            _lW_=separator_to_string(sep),
            _lX_=caml_call1(encode,caml_call2(Stdlib_String[6],_lW_,slist));
           return caml_call2(Stdlib_Printf[4],_K_,_lX_)}}
      function attrib_to_string(encode,a)
       {var _lS_=attrib_value_to_string(encode,a),_lT_=caml_call1(Xml[25],a);
        return caml_call3(Stdlib_Printf[4],_L_,_lT_,_lS_)}
      function xh_print_attrs(encode,attrs)
       {if(attrs)
         {var
           queue=attrs[2],
           attr=attrs[1],
           _lP_=xh_print_attrs(encode,queue),
           _lQ_=attrib_to_string(encode,attr),
           _lR_=caml_call2(Stdlib[28],cst$12,_lQ_);
          return caml_call2(symbol,caml_call1(O[3],_lR_),_lP_)}
        return O[1]}
      function xh_print_closedtag(encode,tag,attrs)
       {if(0 !== I[1] && ! caml_call2(Stdlib_List[36],tag,I[1]))
         {var
           _lK_=caml_call2(Stdlib[28],tag,cst$15),
           _lL_=caml_call2(Stdlib[28],cst$16,_lK_),
           _lM_=caml_call1(O[3],_lL_),
           _lN_=xh_print_attrs(encode,attrs),
           _lO_=caml_call2(Stdlib[28],cst$17,tag);
          return caml_call2
                  (symbol,caml_call2(symbol,caml_call1(O[3],_lO_),_lN_),_lM_)}
        var
         _lH_=caml_call1(O[3],cst$13),
         _lI_=xh_print_attrs(encode,attrs),
         _lJ_=caml_call2(Stdlib[28],cst$14,tag);
        return caml_call2
                (symbol,caml_call2(symbol,caml_call1(O[3],_lJ_),_lI_),_lH_)}
      function xh_print_taglist(encode,taglist)
       {var taglist$0=taglist;
        for(;;)
         {if(taglist$0)
           {var
             queue=taglist$0[2],
             elt=taglist$0[1],
             match=caml_call1(Xml[27],elt);
            if(typeof match === "number")
             {var taglist$0=queue;continue}
            else
             switch(match[0])
              {case 0:
                var
                 texte=match[1],
                 _lx_=xh_print_taglist(encode,queue),
                 _ly_=caml_call1(encode,texte),
                 _lz_=caml_call2(Stdlib[28],_ly_,cst$22),
                 _lA_=caml_call2(Stdlib[28],cst$23,_lz_);
                return caml_call2(symbol,caml_call1(O[3],_lA_),_lx_);
               case 1:
                var texte$0=match[1],_lB_=xh_print_taglist(encode,queue);
                return caml_call2(symbol,caml_call1(O[3],texte$0),_lB_);
               case 2:
                var
                 texte$1=match[1],
                 _lC_=xh_print_taglist(encode,queue),
                 _lD_=caml_call1(encode,texte$1);
                return caml_call2(symbol,caml_call1(O[3],_lD_),_lC_);
               case 3:
                var
                 e=match[1],
                 _lE_=xh_print_taglist(encode,queue),
                 _lF_=caml_call2(Stdlib[28],e,cst$24),
                 _lG_=caml_call2(Stdlib[28],cst$25,_lF_);
                return caml_call2(symbol,caml_call1(O[3],_lG_),_lE_);
               case 4:
                var xh_attrs=match[2],name=match[1];
                return print_nodes(encode,name,xh_attrs,0,queue);
               default:
                var xh_taglist=match[3],xh_attrs$0=match[2],name$0=match[1];
                return print_nodes(encode,name$0,xh_attrs$0,xh_taglist,queue)}}
          return O[1]}}
      function print_nodes(encode,name,xh_attrs,xh_taglist,queue)
       {var _lw_=xh_print_taglist(encode,queue);
        return caml_call2
                (symbol,xh_print_tag(encode,name,xh_attrs,xh_taglist),_lw_)}
      function xh_print_tag(encode,tag,attrs,taglist)
       {if(0 === taglist)return xh_print_closedtag(encode,tag,attrs);
        var
         _lp_=caml_call2(Stdlib[28],tag,cst$18),
         _lq_=caml_call2(Stdlib[28],cst$19,_lp_),
         _lr_=caml_call1(O[3],_lq_),
         _ls_=xh_print_taglist(encode,taglist),
         _lt_=caml_call1(O[3],cst$20),
         _lu_=xh_print_attrs(encode,attrs),
         _lv_=caml_call2(Stdlib[28],cst$21,tag);
        return caml_call2
                (symbol,
                 caml_call2
                  (symbol,
                   caml_call2
                    (symbol,caml_call2(symbol,caml_call1(O[3],_lv_),_lu_),_lt_),
                   _ls_),
                 _lr_)}
      function print_list(opt,foret)
       {if(opt)var sth=opt[1],encode=sth;else var encode=encode_unsafe_char;
        var _lo_=xh_print_taglist(encode,foret);
        return caml_call1(O[4],_lo_)}
      return [0,
              symbol,
              separator_to_string,
              attrib_value_to_string,
              attrib_to_string,
              xh_print_attrs,
              xh_print_closedtag,
              xh_print_tag,
              print_nodes,
              xh_print_taglist,
              print_list]}
    function Make_typed(Xml,Typed_xml,O)
     {var P=Make(Xml,[0,Typed_xml[1][7]],O),symbol=O[2];
      function print_list(opt,foret)
       {if(opt)var sth=opt[1],encode=sth;else var encode=encode_unsafe_char;
        var
         _lm_=caml_call2(Stdlib_List[19],Typed_xml[2],foret),
         _ln_=caml_call2(P[9],encode,_lm_);
        return caml_call1(O[4],_ln_)}
      function print(opt,_lf_,doc)
       {if(opt)var sth=opt[1],encode=sth;else var encode=encode_unsafe_char;
        if(_lf_)var sth$0=_lf_[1],advert=sth$0;else var advert=cst$30;
        var
         doc$0=caml_call1(Typed_xml[3],doc),
         match=caml_call1(Xml[27],doc$0),
         switch$0=0;
        if(typeof match !== "number" && 5 === match[0])
         {var
           c=match[3],
           a=match[2],
           n=match[1],
           _ll_=
            function(a)
             {return caml_string_equal(caml_call1(Xml[25],a),cst_xmlns$1)},
           a$0=
            caml_call2(Stdlib_List[33],_ll_,a)
             ?a
             :[0,caml_call2(Xml[6],cst_xmlns$2,Typed_xml[1][5]),a],
           doc$1=caml_call3(Xml[21],[0,a$0],n,c);
          switch$0 = 1}
        if(! switch$0)var doc$1=doc$0;
        var _lg_=caml_call2(P[9],encode,[0,doc$1,0]);
        if(caml_string_notequal(advert,cst$26))
         var
          _lh_=caml_call2(Stdlib[28],advert,cst$27),
          _li_=caml_call2(Stdlib[28],cst$28,_lh_);
        else
         var _li_=cst$29;
        var
         _lj_=caml_call1(O[3],_li_),
         _lk_=
          caml_call2
           (symbol,
            caml_call2(symbol,caml_call1(O[3],Typed_xml[1][6]),_lj_),
            _lg_);
        return caml_call1(O[4],_lk_)}
      return [0,P,symbol,print_list,print]}
    function Simple_output(M)
     {function empty(param){return 0}
      function concat(f1,f2,param){caml_call1(f1,0);return caml_call1(f2,0)}
      function put(s,param){return caml_call1(M[1],s)}
      function make(f){return caml_call1(f,0)}
      return [0,empty,concat,put,make]}
    function Make_simple(Xml,I)
     {function print_list(output)
       {return Make(Xml,I,Simple_output([0,output]))[10]}
      return [0,print_list]}
    function Make_typed_simple(Xml,Typed_xml)
     {function print_list(output)
       {return Make_typed(Xml,Typed_xml,Simple_output([0,output]))[3]}
      function print(output)
       {return Make_typed(Xml,Typed_xml,Simple_output([0,output]))[4]}
      return [0,print_list,print]}
    function _M_(_ld_,_lc_,_lb_)
     {var _le_=Make_typed(_ld_,_lc_,_lb_);return [0,_le_[3],_le_[4]]}
    function _N_(_la_,_k$_,_k__){return [0,Make(_la_,_k$_,_k__)[10]]}
    function _O_(_k9_,_k8_){return [0,Make_fmt(_k9_,_k8_)[17]]}
    var
     Xml_print=
      [0,
       encode_unsafe_char,
       encode_unsafe_char_and_at,
       [0,normalize,normalize_html],
       compose_decl,
       compose_doctype,
       string_of_number,
       pp_number,
       function(Xml,Typed_xml)
        {var P=Make_fmt(Xml,[0,Typed_xml[1][7]]);
         function pp_elt(opt,_k6_,param,fmt,foret)
          {if(opt)
            var sth=opt[1],encode=sth;
           else
            var encode=encode_unsafe_char;
           if(_k6_)var sth$0=_k6_[1],indent=sth$0;else var indent=0;
           var _k7_=caml_call1(Typed_xml[2],foret);
           return caml_call4(P[15],encode,indent,fmt,_k7_)}
         function pp(opt,_k4_,advert,param,fmt,doc$0)
          {if(opt)
            var sth=opt[1],encode=sth;
           else
            var encode=encode_unsafe_char;
           if(_k4_)var sth$0=_k4_[1],indent=sth$0;else var indent=0;
           caml_call2(Stdlib_Format[7],fmt,0);
           caml_call3(Stdlib_Format[129],fmt,_F_,Typed_xml[1][6]);
           if(advert)
            {var s=advert[1];caml_call3(Stdlib_Format[129],fmt,_G_,s)}
           var
            doc=caml_call1(Typed_xml[3],doc$0),
            match=caml_call1(Xml[27],doc),
            switch$0=0;
           if(typeof match !== "number" && 5 === match[0])
            {var
              c=match[3],
              a=match[2],
              n=match[1],
              _k3_=
               function(a)
                {return caml_string_equal(caml_call1(Xml[25],a),cst_xmlns)},
              a$0=
               caml_call2(Stdlib_List[33],_k3_,a)
                ?a
                :[0,caml_call2(Xml[6],cst_xmlns$0,Typed_xml[1][5]),a],
              _k5_=caml_call3(Xml[21],[0,a$0],n,c);
             switch$0 = 1}
           if(! switch$0)var _k5_=doc;
           caml_call4(P[15],encode,indent,fmt,_k5_);
           return caml_call2(Stdlib_Format[3],fmt,0)}
         return [0,pp_elt,pp]},
       _O_,
       _N_,
       _M_,
       Make_simple,
       Make_typed_simple];
    caml_register_global(1099,Xml_print,"Xml_print");
    var
     Xml_iter=
      [0,
       function(Xml)
        {function amap1(f,n)
          {var match=caml_call1(Xml[27],n);
           if(typeof match !== "number")
            switch(match[0])
             {case 4:
               var
                attribs=match[2],
                name=match[1],
                _k1_=[0,caml_call2(f,name,attribs)];
               return caml_call2(Xml[20],_k1_,name);
              case 5:
               var
                elts=match[3],
                attribs$0=match[2],
                name$0=match[1],
                _k2_=[0,caml_call2(f,name$0,attribs$0)];
               return caml_call3(Xml[21],_k2_,name$0,elts)
              }
           return n}
         function amap(f,n)
          {var match=caml_call1(Xml[27],n);
           if(typeof match !== "number")
            switch(match[0])
             {case 4:
               var
                attribs=match[2],
                name=match[1],
                _kW_=[0,caml_call2(f,name,attribs)];
               return caml_call2(Xml[20],_kW_,name);
              case 5:
               var
                elts=match[3],
                attribs$0=match[2],
                name$0=match[1],
                _kX_=function(_k0_){return amap(f,_k0_)},
                _kY_=caml_call2(Stdlib_List[19],_kX_,elts),
                _kZ_=[0,caml_call2(f,name$0,attribs$0)];
               return caml_call3(Xml[21],_kZ_,name$0,_kY_)
              }
           return n}
         function add_float_attrib(name,value,param)
          {if(param)
            {var head=param[1],tail=param[2];
             if(caml_string_equal(caml_call1(Xml[25],head),name))
              return [0,caml_call2(Xml[4],name,value),tail];
             var tail$0=param[2];
             return [0,head,add_float_attrib(name,value,tail$0)]}
           return [0,caml_call2(Xml[4],name,value),0]}
         function map_float_attrib(is_attrib,f,l)
          {function aux(head)
            {var match=caml_call1(Xml[26],head);
             if(0 === match[0])
              {var value=match[1];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {var _kU_=caml_call1(f,value),_kV_=caml_call1(Xml[25],head);
                 return caml_call2(Xml[4],_kV_,_kU_)}}
             return head}
           return caml_call2(Stdlib_List[19],aux,l)}
         function add_int_attrib(name,value,param)
          {if(param)
            {var head=param[1],tail=param[2];
             if(caml_string_equal(caml_call1(Xml[25],head),name))
              return [0,caml_call2(Xml[5],name,value),tail];
             var tail$0=param[2];
             return [0,head,add_int_attrib(name,value,tail$0)]}
           return [0,caml_call2(Xml[5],name,value),0]}
         function rm_attrib(is_attrib,param)
          {var param$0=param;
           for(;;)
            {if(param$0)
              {var head=param$0[1],tail=param$0[2];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {var param$0=tail;continue}
               var tail$0=param$0[2];
               return [0,head,rm_attrib(is_attrib,tail$0)]}
             return 0}}
         function map_int_attrib(is_attrib,f,l)
          {function aux(head)
            {var match=caml_call1(Xml[26],head);
             if(1 === match[0])
              {var value=match[1];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {var _kS_=caml_call1(f,value),_kT_=caml_call1(Xml[25],head);
                 return caml_call2(Xml[5],_kT_,_kS_)}}
             return head}
           return caml_call2(Stdlib_List[19],aux,l)}
         function add_string_attrib(name,value,param)
          {if(param)
            {var head=param[1],tail=param[2];
             if(caml_string_equal(caml_call1(Xml[25],head),name))
              return [0,caml_call2(Xml[6],name,value),tail];
             var tail$0=param[2];
             return [0,head,add_string_attrib(name,value,tail$0)]}
           return [0,caml_call2(Xml[6],name,value),0]}
         function map_string_attrib(is_attrib,f,l)
          {function aux(head)
            {var match=caml_call1(Xml[26],head);
             if(2 === match[0])
              {var value=match[1];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {var _kQ_=caml_call1(f,value),_kR_=caml_call1(Xml[25],head);
                 return caml_call2(Xml[6],_kR_,_kQ_)}}
             return head}
           return caml_call2(Stdlib_List[19],aux,l)}
         function add_space_sep_attrib(name,value,param)
          {if(param)
            {var tail=param[2],head=param[1],match=caml_call1(Xml[26],head);
             if(3 === match[0] && ! match[1])
              {var values=match[2];
               if(caml_string_equal(caml_call1(Xml[25],head),name))
                return [0,caml_call2(Xml[7],name,[0,value,values]),tail]}
             return caml_string_equal(caml_call1(Xml[25],head),name)
                     ?[0,caml_call2(Xml[7],name,[0,value,0]),tail]
                     :[0,head,add_space_sep_attrib(name,value,tail)]}
           return [0,caml_call2(Xml[7],name,[0,value,0]),0]}
         function add_comma_sep_attrib(name,value,param)
          {if(param)
            {var tail=param[2],head=param[1],match=caml_call1(Xml[26],head);
             if(3 === match[0] && match[1])
              {var values=match[2];
               if(caml_string_equal(caml_call1(Xml[25],head),name))
                return [0,caml_call2(Xml[8],name,[0,value,values]),tail]}
             return caml_string_equal(caml_call1(Xml[25],head),name)
                     ?[0,caml_call2(Xml[8],name,[0,value,0]),tail]
                     :[0,head,add_comma_sep_attrib(name,value,tail)]}
           return [0,caml_call2(Xml[8],name,[0,value,0]),0]}
         function rm_attrib_from_list(is_attrib,is_value,param)
          {if(param)
            {var tail=param[2],head=param[1],match=caml_call1(Xml[26],head);
             if(3 === match[0])
              {var values=match[2],sep=match[1];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {var
                  _kN_=function(v){return 1 - caml_call1(is_value,v)},
                  values$0=caml_call2(Stdlib_List[41],_kN_,values);
                 if(values$0)
                  {if(sep)
                    {var _kO_=caml_call1(Xml[25],head);
                     return [0,caml_call2(Xml[8],_kO_,values$0),tail]}
                   var _kP_=caml_call1(Xml[25],head);
                   return [0,caml_call2(Xml[7],_kP_,values$0),tail]}
                 return tail}}
             return [0,head,rm_attrib_from_list(is_attrib,is_value,tail)]}
           return 0}
         function map_string_attrib_in_list(is_attrib,f,l)
          {function aux(head)
            {var match=caml_call1(Xml[26],head);
             if(3 === match[0])
              {var values=match[2],sep=match[1];
               if(caml_call1(is_attrib,caml_call1(Xml[25],head)))
                {if(sep)
                  {var
                    _kJ_=caml_call2(Stdlib_List[19],f,values),
                    _kK_=caml_call1(Xml[25],head);
                   return caml_call2(Xml[8],_kK_,_kJ_)}
                 var
                  _kL_=caml_call2(Stdlib_List[19],f,values),
                  _kM_=caml_call1(Xml[25],head);
                 return caml_call2(Xml[7],_kM_,_kL_)}}
             return head}
           return caml_call2(Stdlib_List[19],aux,l)}
         function fold
          (of_empty,
           of_comment,
           of_txt,
           of_encodedpcdata,
           of_entity,
           of_leaf,
           of_node,
           n)
          {var match=caml_call1(Xml[27],n);
           if(typeof match === "number")
            return caml_call1(of_empty,0);
           else
            switch(match[0])
             {case 0:var s=match[1];return caml_call1(of_comment,s);
              case 1:var s$0=match[1];return caml_call1(of_encodedpcdata,s$0);
              case 2:var s$1=match[1];return caml_call1(of_txt,s$1);
              case 3:var s$2=match[1];return caml_call1(of_entity,s$2);
              case 4:
               var attribs=match[2],name=match[1];
               return caml_call2(of_leaf,name,attribs);
              default:
               var
                elts=match[3],
                attribs$0=match[2],
                name$0=match[1],
                _kH_=
                 function(_kI_)
                  {return fold
                           (of_empty,
                            of_comment,
                            of_txt,
                            of_encodedpcdata,
                            of_entity,
                            of_leaf,
                            of_node,
                            _kI_)};
               return caml_call3
                       (of_node,
                        name$0,
                        attribs$0,
                        caml_call2(Stdlib_List[19],_kH_,elts))}}
         function all_entities(elt)
          {function f(param){return 0}
           function _kG_(ename,attribs,elts)
            {return caml_call1(Stdlib_List[14],elts)}
           return fold(f,f,f,f,f,function(ename,attribs){return 0},_kG_,elt)}
         function flatmap(f,l)
          {var _kF_=caml_call2(Stdlib_List[19],f,l);
           return caml_call1(Stdlib_List[13],_kF_)}
         function translate
          (root_leaf,root_node,sub_leaf,sub_node,update_state,state,n)
          {function translate(state,n)
            {var match=caml_call1(Xml[27],n);
             if(typeof match !== "number")
              switch(match[0])
               {case 4:
                 var attribs=match[2],name=match[1];
                 return caml_call3(sub_leaf,state,name,attribs);
                case 5:
                 var
                  elts=match[3],
                  attribs$0=match[2],
                  name$0=match[1],
                  _kD_=caml_call3(update_state,name$0,attribs$0,state);
                 return caml_call4
                         (sub_node,
                          state,
                          name$0,
                          attribs$0,
                          flatmap(function(_kE_){return translate(_kD_,_kE_)},elts))
                }
             return [0,n,0]}
           var match=caml_call1(Xml[27],n);
           if(typeof match !== "number")
            switch(match[0])
             {case 4:
               var attribs=match[2],name=match[1];
               return caml_call2(root_leaf,name,attribs);
              case 5:
               var elts=match[3],attribs$0=match[2],name$0=match[1];
               return caml_call3
                       (root_node,
                        name$0,
                        attribs$0,
                        flatmap(function(_kC_){return translate(state,_kC_)},elts))
              }
           return n}
         return [0,
                 amap,
                 amap1,
                 rm_attrib,
                 rm_attrib_from_list,
                 map_int_attrib,
                 map_float_attrib,
                 map_string_attrib,
                 map_string_attrib_in_list,
                 add_int_attrib,
                 add_float_attrib,
                 add_string_attrib,
                 add_comma_sep_attrib,
                 add_space_sep_attrib,
                 fold,
                 all_entities,
                 translate]}];
    caml_register_global(1100,Xml_iter,"Xml_iter");
    function string_of_iri(x){return caml_call2(Stdlib_Printf[4],_P_,x)}
    function to_string(f,param)
     {var unit=param[2],n=param[1];
      if(unit)
       var unit$0=unit[1],_kB_=caml_call1(f,unit$0);
      else
       var _kB_=cst$31;
      return caml_call3(Stdlib_Printf[4],_Q_,n,_kB_)}
    function angle_names(param)
     {return 4099509 === param?cst_rad:793050094 <= param?cst_grad:cst_deg}
    function string_of_angle(a){return to_string(angle_names,a)}
    function length_names(param)
     {return 16389 <= param
              ?17280 === param
                ?cst_mm
                :17956 <= param
                  ?17960 <= param?cst_px:cst_pt
                  :17939 <= param?cst_pc:cst_in
              :15496 <= param
                ?15507 <= param?cst_ex:cst_em
                :15050 <= param?cst_cm:cst$32}
    function string_of_length(a){return to_string(length_names,a)}
    function list(opt,f,l)
     {if(opt)var sth=opt[1],sep=sth;else var sep=cst$33;
      var _kA_=caml_call2(Stdlib_List[19],f,l);
      return caml_call2(Stdlib_String[6],sep,_kA_)}
    function string_of_paint_whitout_icc(param)
     {if(typeof param === "number")
       return 870530776 <= param?cst_none:cst_currentColor;
      var match=param[2],icc=match[2],c=match[1];
      if(icc)
       {var x=icc[1],_kz_=caml_call2(Stdlib[28],sep,x);
        return caml_call2(Stdlib[28],c,_kz_)}
      return c}
    function string_of_paint(c)
     {if(typeof c !== "number" && 3652393 <= c[1])
       {var _kt_=c[2],_ku_=_kt_[2],_kv_=_kt_[1];
        if(_ku_)
         {var
           b=_ku_[1],
           _kw_=string_of_paint_whitout_icc(b),
           _kx_=caml_call2(Stdlib[28],cst$34,_kw_),
           _ky_=string_of_iri(_kv_);
          return caml_call2(Stdlib[28],_ky_,_kx_)}
        return string_of_iri(_kv_)}
      return string_of_paint_whitout_icc(c)}
    function Make_with_wrapped_functions(Xml,C)
     {var
       doctype=compose_doctype(cst_svg,_R_),
       Info=[0,content_type,0,0,version,standard,namespace,doctype],
       _fk_=Xml[2],
       _fl_=Xml[3];
      function tot(x){return x}
      function totl(x){return x}
      function toelt(x){return x}
      function toeltl(x){return x}
      function to_attrib(x){return x}
      function nullary(tag,a,param)
       {var _ks_=caml_call1(Xml[1][3],0);
        return caml_call3(Xml[21],a,tag,_ks_)}
      function unary(tag,a,elt)
       {var _kr_=caml_call1(Xml[1][4],elt);
        return caml_call3(Xml[21],a,tag,_kr_)}
      function star(tag,a,elts){return caml_call3(Xml[21],a,tag,elts)}
      function to_xmlattribs(x){return x}
      var _fm_=Xml[4],_fn_=Xml[6],_fo_=C[10],_fp_=C[10],_fq_=C[11];
      function user_attrib(f,name,v)
       {var _kq_=caml_call2(Xml[1][2],f,v);
        return caml_call2(Xml[6],name,_kq_)}
      var _fr_=Xml[6];
      function metadata(a,children)
       {return caml_call3(Xml[21],a,cst_metadata,children)}
      function foreignObject(a,children)
       {return caml_call3(Xml[21],a,cst_foreignObject,children)}
      function pcdata(s){return caml_call1(Xml[17],s)}
      var
       a_version=caml_call1(_fn_,cst_version),
       a_baseProfile=caml_call1(_fn_,cst_baseProfile);
      function a_x(_kp_){return user_attrib(_fo_,cst_x,_kp_)}
      function a_y(_ko_){return user_attrib(_fo_,cst_y,_ko_)}
      function a_width(_kn_){return user_attrib(_fp_,cst_width,_kn_)}
      function a_height(_km_){return user_attrib(_fp_,cst_height,_km_)}
      var
       a_preserveAspectRatio=caml_call1(_fn_,cst_preserveAspectRatio),
       a_contentScriptType=caml_call1(_fn_,cst_contentScriptType),
       a_contentStyleType=caml_call1(_fn_,cst_contentStyleType);
      function a_zoomAndPan(x){return user_attrib(C[4],cst_zoomAndSpan,x)}
      var
       a_href=caml_call1(_fn_,cst_href),
       a_xlink_href=caml_call1(_fn_,cst_xlink_href),
       a_requiredFeatures=caml_call1(Xml[7],cst_requiredFeatures),
       a_requiredExtensions=caml_call1(Xml[7],cst_requiredExtension),
       a_systemLanguage=caml_call1(Xml[8],cst_systemLanguage),
       _fs_=C[3];
      function a_externalRessourcesRequired(_kl_)
       {return user_attrib(_fs_,cst_externalRessourcesRequired,_kl_)}
      var a_id=caml_call1(_fn_,cst_id);
      function a_user_data(name)
       {return caml_call1(_fn_,caml_call2(Stdlib[28],cst_data,name))}
      var
       a_xml_base=caml_call1(_fn_,cst_xml_base),
       a_xml_lang=caml_call1(_fn_,cst_xml_lang);
      function a_xml_space(x){return user_attrib(C[4],cst_xml_space,x)}
      var
       a_type=caml_call1(_fn_,cst_type),
       a_media=caml_call1(Xml[8],cst_media),
       a_xlink_title=caml_call1(_fn_,cst_xlink_title),
       a_class=caml_call1(Xml[7],cst_class),
       a_style=caml_call1(_fn_,cst_style),
       _ft_=C[21];
      function a_transform(_kk_){return user_attrib(_ft_,cst_transform,_kk_)}
      var _fu_=C[7];
      function a_viewBox(_kj_){return user_attrib(_fu_,cst_viewBox,_kj_)}
      var
       a_d=caml_call1(_fn_,cst_d),
       a_pathLength=caml_call1(_fm_,cst_pathLength);
      function a_rx(_ki_){return user_attrib(_fp_,cst_rx,_ki_)}
      function a_ry(_kh_){return user_attrib(_fp_,cst_ry,_kh_)}
      function a_cx(_kg_){return user_attrib(_fp_,cst_cx,_kg_)}
      function a_cy(_kf_){return user_attrib(_fp_,cst_cy,_kf_)}
      function a_r(_ke_){return user_attrib(_fp_,cst_r,_ke_)}
      function a_x1(_kd_){return user_attrib(_fo_,cst_x1,_kd_)}
      function a_y1(_kc_){return user_attrib(_fo_,cst_y1,_kc_)}
      function a_x2(_kb_){return user_attrib(_fo_,cst_x2,_kb_)}
      function a_y2(_ka_){return user_attrib(_fo_,cst_y2,_ka_)}
      var _fv_=C[5];
      function a_points(_j$_){return user_attrib(_fv_,cst_points,_j$_)}
      function a_x_list(_j__){return user_attrib(_fq_,cst_x$0,_j__)}
      function a_y_list(_j9_){return user_attrib(_fq_,cst_y$0,_j9_)}
      var _fw_=C[12];
      function a_dx(_j8_){return user_attrib(_fw_,cst_dx,_j8_)}
      var _fx_=C[12];
      function a_dy(_j7_){return user_attrib(_fx_,cst_dy,_j7_)}
      function a_dx_list(_j6_){return user_attrib(_fq_,cst_dx$0,_j6_)}
      function a_dy_list(_j5_){return user_attrib(_fq_,cst_dy$0,_j5_)}
      function a_lengthAdjust(x){return user_attrib(C[4],cst_lengthAdjust,x)}
      function a_textLength(_j4_)
       {return user_attrib(_fp_,cst_textLength,_j4_)}
      function a_text_anchor(x){return user_attrib(C[4],cst_text_anchor,x)}
      function a_text_decoration(x)
       {return user_attrib(C[4],cst_text_decoration,x)}
      function a_text_rendering(x)
       {return user_attrib(C[4],cst_text_rendering,x)}
      var _fy_=C[14];
      function a_rotate(_j3_){return user_attrib(_fy_,cst_rotate,_j3_)}
      function a_startOffset(_j2_)
       {return user_attrib(_fp_,cst_startOffset,_j2_)}
      function a_method(x){return user_attrib(C[4],cst_method,x)}
      function a_spacing(x){return user_attrib(C[4],cst_spacing,x)}
      var
       a_glyphRef=caml_call1(_fn_,cst_glyphRef),
       a_format=caml_call1(_fn_,cst_format);
      function a_markerUnits(x){return user_attrib(C[4],cst_markerUnits,x)}
      function a_refX(_j1_){return user_attrib(_fo_,cst_refX,_j1_)}
      function a_refY(_j0_){return user_attrib(_fo_,cst_refY,_j0_)}
      function a_markerWidth(_jZ_)
       {return user_attrib(_fp_,cst_markerWidth,_jZ_)}
      function a_markerHeight(_jY_)
       {return user_attrib(_fp_,cst_markerHeight,_jY_)}
      function a_orient(x){return user_attrib(C[17],cst_orient,x)}
      var a_local=caml_call1(_fn_,cst_local);
      function a_rendering_intent(x)
       {return user_attrib(C[4],cst_rendering_intent,x)}
      function a_gradientUnits(x)
       {return user_attrib(C[4],cst_gradientUnits,x)}
      var _fz_=C[21];
      function a_gradientTransform(_jX_)
       {return user_attrib(_fz_,cst_gradientTransform,_jX_)}
      function a_spreadMethod(x){return user_attrib(C[4],cst_spreadMethod,x)}
      function a_fx(_jW_){return user_attrib(_fo_,cst_fx,_jW_)}
      function a_fy(_jV_){return user_attrib(_fo_,cst_fy,_jV_)}
      function a_offset(x){return user_attrib(C[16],cst_offset,x)}
      function a_patternUnits(x){return user_attrib(C[4],cst_patternUnits,x)}
      function a_patternContentUnits(x)
       {return user_attrib(C[4],cst_patternContentUnits,x)}
      function a_patternTransform(x)
       {return user_attrib(C[21],cst_patternTransform,x)}
      function a_clipPathUnits(x)
       {return user_attrib(C[4],cst_clipPathUnits,x)}
      function a_maskUnits(x){return user_attrib(C[4],cst_maskUnits,x)}
      function a_maskContentUnits(x)
       {return user_attrib(C[4],cst_maskContentUnits,x)}
      function a_primitiveUnits(x)
       {return user_attrib(C[4],cst_primitiveUnits,x)}
      var _fA_=C[13];
      function a_filterRes(_jU_)
       {return user_attrib(_fA_,cst_filterResUnits,_jU_)}
      var a_result=caml_call1(_fn_,cst_result);
      function a_in(x){return user_attrib(C[8],cst_in$0,x)}
      function a_in2(x){return user_attrib(C[8],cst_in2,x)}
      var
       a_azimuth=caml_call1(_fm_,cst_azimuth),
       a_elevation=caml_call1(_fm_,cst_elevation),
       a_pointsAtX=caml_call1(_fm_,cst_pointsAtX),
       a_pointsAtY=caml_call1(_fm_,cst_pointsAtY),
       a_pointsAtZ=caml_call1(_fm_,cst_pointsAtZ),
       a_specularExponent=caml_call1(_fm_,cst_specularExponent),
       a_specularConstant=caml_call1(_fm_,cst_specularConstant),
       a_limitingConeAngle=caml_call1(_fm_,cst_limitingConeAngle);
      function a_mode(x){return user_attrib(C[4],cst_mode,x)}
      function a_feColorMatrix_type(x){return user_attrib(C[4],cst_type$0,x)}
      var _fB_=C[14];
      function a_values(_jT_){return user_attrib(_fB_,cst_values,_jT_)}
      function a_transfer_type(x){return user_attrib(C[4],cst_type$1,x)}
      var _fC_=C[14];
      function a_tableValues(_jS_)
       {return user_attrib(_fC_,cst_tableValues,_jS_)}
      var _fD_=C[12];
      function a_intercept(_jR_){return user_attrib(_fD_,cst_intercept,_jR_)}
      var _fE_=C[12];
      function a_amplitude(_jQ_){return user_attrib(_fE_,cst_amplitude,_jQ_)}
      var _fF_=C[12];
      function a_exponent(_jP_){return user_attrib(_fF_,cst_exponent,_jP_)}
      var _fG_=C[12];
      function a_transfer_offset(_jO_)
       {return user_attrib(_fG_,cst_offset$0,_jO_)}
      function a_feComposite_operator(x)
       {return user_attrib(C[4],cst_operator,x)}
      var _fH_=C[12];
      function a_k1(_jN_){return user_attrib(_fH_,cst_k1,_jN_)}
      var _fI_=C[12];
      function a_k2(_jM_){return user_attrib(_fI_,cst_k2,_jM_)}
      var _fJ_=C[12];
      function a_k3(_jL_){return user_attrib(_fJ_,cst_k3,_jL_)}
      var _fK_=C[12];
      function a_k4(_jK_){return user_attrib(_fK_,cst_k4,_jK_)}
      var _fL_=C[13];
      function a_order(_jJ_){return user_attrib(_fL_,cst_order,_jJ_)}
      var _fM_=C[14];
      function a_kernelMatrix(_jI_)
       {return user_attrib(_fM_,cst_kernelMatrix,_jI_)}
      var _fN_=C[12];
      function a_divisor(_jH_){return user_attrib(_fN_,cst_divisor,_jH_)}
      var _fO_=C[12];
      function a_bias(_jG_){return user_attrib(_fO_,cst_bias,_jG_)}
      var _fP_=C[13];
      function a_kernelUnitLength(_jF_)
       {return user_attrib(_fP_,cst_kernelUnitLength,_jF_)}
      var _fQ_=C[9];
      function a_targetX(_jE_){return user_attrib(_fQ_,cst_targetX,_jE_)}
      var _fR_=C[9];
      function a_targetY(_jD_){return user_attrib(_fR_,cst_targetY,_jD_)}
      function a_edgeMode(x){return user_attrib(C[4],cst_targetY$0,x)}
      var _fS_=C[3];
      function a_preserveAlpha(_jC_)
       {return user_attrib(_fS_,cst_preserveAlpha,_jC_)}
      var _fT_=C[12];
      function a_surfaceScale(_jB_)
       {return user_attrib(_fT_,cst_surfaceScale,_jB_)}
      var _fU_=C[12];
      function a_diffuseConstant(_jA_)
       {return user_attrib(_fU_,cst_diffuseConstant,_jA_)}
      var _fV_=C[12];
      function a_scale(_jz_){return user_attrib(_fV_,cst_scale,_jz_)}
      function a_xChannelSelector(x)
       {return user_attrib(C[4],cst_xChannelSelector,x)}
      function a_yChannelSelector(x)
       {return user_attrib(C[4],cst_yChannelSelector,x)}
      var _fW_=C[13];
      function a_stdDeviation(_jy_)
       {return user_attrib(_fW_,cst_stdDeviation,_jy_)}
      function a_feMorphology_operator(x)
       {return user_attrib(C[4],cst_operator$0,x)}
      var _fX_=C[13];
      function a_radius(_jx_){return user_attrib(_fX_,cst_radius,_jx_)}
      var _fY_=C[13];
      function a_baseFrenquency(_jw_)
       {return user_attrib(_fY_,cst_baseFrequency,_jw_)}
      var _fZ_=C[9];
      function a_numOctaves(_jv_)
       {return user_attrib(_fZ_,cst_numOctaves,_jv_)}
      var _f0_=C[12];
      function a_seed(_ju_){return user_attrib(_f0_,cst_seed,_ju_)}
      function a_stitchTiles(x){return user_attrib(C[4],cst_stitchTiles,x)}
      function a_feTurbulence_type(x){return user_attrib(C[4],cst_type$2,x)}
      function a_xlink_show(x){return user_attrib(C[4],cst_xlink_show,x)}
      function a_xlink_actuate(x)
       {return user_attrib(C[4],cst_xlink_actuate,x)}
      var
       a_target=caml_call1(_fn_,cst_xlink_target),
       a_viewTarget=caml_call1(_fn_,cst_viewTarget),
       a_attributeName=caml_call1(_fn_,cst_attributeName);
      function a_attributeType(x)
       {return user_attrib(C[4],cst_attributeType,x)}
      var
       a_begin=caml_call1(_fn_,cst_begin),
       a_dur=caml_call1(_fn_,cst_dur),
       a_min=caml_call1(_fn_,cst_min),
       a_max=caml_call1(_fn_,cst_max);
      function a_restart(x){return user_attrib(C[4],cst_restart,x)}
      var
       a_repeatCount=caml_call1(_fn_,cst_repeatCount),
       a_repeatDur=caml_call1(_fn_,cst_repeatDur),
       _f1_=C[18];
      function a_fill(_jt_){return user_attrib(_f1_,cst_fill,_jt_)}
      function a_animation_fill(x){return user_attrib(C[4],cst_fill$0,x)}
      function a_calcMode(x){return user_attrib(C[4],cst_calcMode,x)}
      var
       a_animation_values=caml_call1(Xml[8],cst_values$0),
       a_keyTimes=caml_call1(Xml[8],cst_keyTimes),
       a_keySplines=caml_call1(Xml[8],cst_keySplines),
       a_from=caml_call1(_fn_,cst_from),
       a_to=caml_call1(_fn_,cst_to),
       a_by=caml_call1(_fn_,cst_by);
      function a_additive(x){return user_attrib(C[4],cst_additive,x)}
      function a_accumulate(x){return user_attrib(C[4],cst_accumulate,x)}
      var _f2_=C[15];
      function a_keyPoints(_js_){return user_attrib(_f2_,cst_keyPoints,_js_)}
      var a_path=caml_call1(_fn_,cst_path),_f3_=C[4];
      function a_animateTransform_type(_jr_)
       {return user_attrib(_f3_,cst_type$3,_jr_)}
      var _f4_=C[12];
      function a_horiz_origin_x(_jq_)
       {return user_attrib(_f4_,cst_horiz_origin_x,_jq_)}
      var _f5_=C[12];
      function a_horiz_origin_y(_jp_)
       {return user_attrib(_f5_,cst_horiz_origin_y,_jp_)}
      var _f6_=C[12];
      function a_horiz_adv_x(_jo_)
       {return user_attrib(_f6_,cst_horiz_adv_x,_jo_)}
      var _f7_=C[12];
      function a_vert_origin_x(_jn_)
       {return user_attrib(_f7_,cst_vert_origin_x,_jn_)}
      var _f8_=C[12];
      function a_vert_origin_y(_jm_)
       {return user_attrib(_f8_,cst_vert_origin_y,_jm_)}
      var _f9_=C[12];
      function a_vert_adv_y(_jl_)
       {return user_attrib(_f9_,cst_vert_adv_y,_jl_)}
      var
       a_unicode=caml_call1(_fn_,cst_unicode),
       a_glyph_name=caml_call1(_fn_,cst_glyphname);
      function a_orientation(x){return user_attrib(C[4],cst_orientation,x)}
      function a_arabic_form(x){return user_attrib(C[4],cst_arabic_form,x)}
      var
       a_lang=caml_call1(_fn_,cst_lang),
       a_u1=caml_call1(_fn_,cst_u1),
       a_u2=caml_call1(_fn_,cst_u2),
       a_g1=caml_call1(_fn_,cst_g1),
       a_g2=caml_call1(_fn_,cst_g2),
       a_k=caml_call1(_fn_,cst_k),
       a_font_family=caml_call1(_fn_,cst_font_family),
       a_font_style=caml_call1(_fn_,cst_font_style),
       a_font_variant=caml_call1(_fn_,cst_font_variant),
       a_font_weight=caml_call1(_fn_,cst_font_weight),
       a_font_stretch=caml_call1(_fn_,cst_font_stretch),
       a_font_size=caml_call1(_fn_,cst_font_size),
       a_unicode_range=caml_call1(_fn_,cst_unicode_range),
       a_units_per_em=caml_call1(_fn_,cst_units_per_em),
       _f__=C[12];
      function a_stemv(_jk_){return user_attrib(_f__,cst_stemv,_jk_)}
      var _f$_=C[12];
      function a_stemh(_jj_){return user_attrib(_f$_,cst_stemh,_jj_)}
      var _ga_=C[12];
      function a_slope(_ji_){return user_attrib(_ga_,cst_slope,_ji_)}
      var _gb_=C[12];
      function a_cap_height(_jh_)
       {return user_attrib(_gb_,cst_cap_height,_jh_)}
      var _gc_=C[12];
      function a_x_height(_jg_){return user_attrib(_gc_,cst_x_height,_jg_)}
      var _gd_=C[12];
      function a_accent_height(_jf_)
       {return user_attrib(_gd_,cst_accent_height,_jf_)}
      var _ge_=C[12];
      function a_ascent(_je_){return user_attrib(_ge_,cst_ascent,_je_)}
      var
       a_widths=caml_call1(_fn_,cst_widths),
       a_bbox=caml_call1(_fn_,cst_bbox),
       _gf_=C[12];
      function a_ideographic(_jd_)
       {return user_attrib(_gf_,cst_ideographic,_jd_)}
      var _gg_=C[12];
      function a_alphabetic(_jc_)
       {return user_attrib(_gg_,cst_alphabetic,_jc_)}
      var _gh_=C[12];
      function a_mathematical(_jb_)
       {return user_attrib(_gh_,cst_mathematical,_jb_)}
      var _gi_=C[12];
      function a_hanging(_ja_){return user_attrib(_gi_,cst_hanging,_ja_)}
      var _gj_=C[12];
      function a_videographic(_i$_)
       {return user_attrib(_gj_,cst_v_ideographic,_i$_)}
      var _gk_=C[12];
      function a_v_alphabetic(_i__)
       {return user_attrib(_gk_,cst_v_alphabetic,_i__)}
      var _gl_=C[12];
      function a_v_mathematical(_i9_)
       {return user_attrib(_gl_,cst_v_mathematical,_i9_)}
      var _gm_=C[12];
      function a_v_hanging(_i8_){return user_attrib(_gm_,cst_v_hanging,_i8_)}
      var _gn_=C[12];
      function a_underline_position(_i7_)
       {return user_attrib(_gn_,cst_underline_position,_i7_)}
      var _go_=C[12];
      function a_underline_thickness(_i6_)
       {return user_attrib(_go_,cst_underline_thickness,_i6_)}
      var _gp_=C[12];
      function a_strikethrough_position(_i5_)
       {return user_attrib(_gp_,cst_strikethrough_position,_i5_)}
      var _gq_=C[12];
      function a_strikethrough_thickness(_i4_)
       {return user_attrib(_gq_,cst_strikethrough_thickness,_i4_)}
      var _gr_=C[12];
      function a_overline_position(_i3_)
       {return user_attrib(_gr_,cst_overline_position,_i3_)}
      var _gs_=C[12];
      function a_overline_thickness(_i2_)
       {return user_attrib(_gs_,cst_overline_thickness,_i2_)}
      var
       a_string=caml_call1(_fn_,cst_string),
       a_name=caml_call1(_fn_,cst_name);
      function a_alignment_baseline(x)
       {return user_attrib(C[2],cst_alignment_baseline,x)}
      function a_dominant_baseline(x)
       {return user_attrib(C[6],cst_dominant_baseline,x)}
      var
       a_onabort=caml_call1(Xml[9],cst_onabort),
       a_onactivate=caml_call1(Xml[9],cst_onactivate),
       a_onbegin=caml_call1(Xml[9],cst_onbegin),
       a_onend=caml_call1(Xml[9],cst_onend),
       a_onerror=caml_call1(Xml[9],cst_onerror),
       a_onfocusin=caml_call1(Xml[9],cst_onfocusin),
       a_onfocusout=caml_call1(Xml[9],cst_onfocusout),
       a_onload=caml_call1(Xml[9],cst_onload),
       a_onrepeat=caml_call1(Xml[9],cst_onrepeat),
       a_onresize=caml_call1(Xml[9],cst_onresize),
       a_onscroll=caml_call1(Xml[9],cst_onscroll),
       a_onunload=caml_call1(Xml[9],cst_onunload),
       a_onzoom=caml_call1(Xml[9],cst_onzoom),
       a_onclick=caml_call1(Xml[10],cst_onclick),
       a_onmousedown=caml_call1(Xml[10],cst_onmousedown),
       a_onmouseup=caml_call1(Xml[10],cst_onmouseup),
       a_onmouseover=caml_call1(Xml[10],cst_onmouseover),
       a_onmouseout=caml_call1(Xml[10],cst_onmouseout),
       a_onmousemove=caml_call1(Xml[10],cst_onmousemove),
       a_ontouchstart=caml_call1(Xml[12],cst_ontouchstart),
       a_ontouchend=caml_call1(Xml[12],cst_ontouchend),
       a_ontouchmove=caml_call1(Xml[12],cst_ontouchmove),
       a_ontouchcancel=caml_call1(Xml[12],cst_ontouchcancel),
       a_stop_color=caml_call1(_fr_,cst_stop_color),
       _gt_=C[12];
      function a_stop_opacity(_i1_)
       {return user_attrib(_gt_,cst_stop_opacity,_i1_)}
      var _gu_=C[18];
      function a_stroke(_i0_){return user_attrib(_gu_,cst_stroke,_i0_)}
      var _gv_=C[10];
      function a_stroke_width(_iZ_)
       {return user_attrib(_gv_,cst_stroke_width,_iZ_)}
      function a_stroke_linecap(x)
       {return user_attrib(C[4],cst_stroke_linecap,x)}
      function a_stroke_linejoin(x)
       {return user_attrib(C[4],cst_stroke_linejoin,x)}
      var _gw_=C[12];
      function a_stroke_miterlimit(_iY_)
       {return user_attrib(_gw_,cst_stroke_miterlimit,_iY_)}
      function a_stroke_dasharray(x)
       {return user_attrib(C[19],cst_stroke_dasharray,x)}
      var _gx_=C[10];
      function a_stroke_dashoffset(_iX_)
       {return user_attrib(_gx_,cst_stroke_dashoffset,_iX_)}
      var _gy_=C[12];
      function a_stroke_opacity(_iW_)
       {return user_attrib(_gy_,cst_stroke_opacity,_iW_)}
      function svg(opt,children)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var
         _iV_=
          [0,
           caml_call2
            (_fn_,
             cst_xmlns_xlink,
             caml_call1(Xml[1][1],cst_http_www_w3_org_1999_xlink)),
           a],
         attribs=
          [0,
           caml_call2
            (_fn_,
             cst_xmlns$3,
             caml_call1(Xml[1][1],cst_http_www_w3_org_2000_svg)),
           _iV_];
        return star(cst_svg$0,[0,attribs],children)}
      function g(_iT_,_iU_){return star(cst_g,_iT_,_iU_)}
      function defs(_iR_,_iS_){return star(cst_defs,_iR_,_iS_)}
      function desc(_iP_,_iQ_){return unary(cst_desc,_iP_,_iQ_)}
      function title(_iN_,_iO_){return unary(cst_title,_iN_,_iO_)}
      function symbol(_iL_,_iM_){return star(cst_symbol,_iL_,_iM_)}
      function use(_iJ_,_iK_){return star(cst_use,_iJ_,_iK_)}
      function image(_iH_,_iI_){return star(cst_image,_iH_,_iI_)}
      function switch$0(_iF_,_iG_){return star(cst_switch,_iF_,_iG_)}
      function style(_iD_,_iE_){return unary(cst_style$0,_iD_,_iE_)}
      function path(_iB_,_iC_){return star(cst_path$0,_iB_,_iC_)}
      function rect(_iz_,_iA_){return star(cst_rect,_iz_,_iA_)}
      function circle(_ix_,_iy_){return star(cst_circle,_ix_,_iy_)}
      function ellipse(_iv_,_iw_){return star(cst_ellipse,_iv_,_iw_)}
      function line(_it_,_iu_){return star(cst_line,_it_,_iu_)}
      function polyline(_ir_,_is_){return star(cst_polyline,_ir_,_is_)}
      function polygon(_ip_,_iq_){return star(cst_polygon,_ip_,_iq_)}
      function text(_in_,_io_){return star(cst_text,_in_,_io_)}
      function tspan(_il_,_im_){return star(cst_tspan,_il_,_im_)}
      function tref(_ij_,_ik_){return star(cst_tref,_ij_,_ik_)}
      function textPath(_ih_,_ii_){return star(cst_textPath,_ih_,_ii_)}
      function altGlyph(_if_,_ig_){return unary(cst_altGlyph,_if_,_ig_)}
      function altGlyphDef(_id_,_ie_){return unary(cst_altGlyphDef,_id_,_ie_)}
      function altGlyphItem(_ib_,_ic_)
       {return star(cst_altGlyphItem,_ib_,_ic_)}
      function glyphRef(_h$_,_ia_){return nullary(cst_glyphRef$0,_h$_,_ia_)}
      function marker(_h9_,_h__){return star(cst_marker,_h9_,_h__)}
      function color_profile(_h7_,_h8_)
       {return star(cst_color_profile,_h7_,_h8_)}
      function linearGradient(_h5_,_h6_)
       {return star(cst_linearGradient,_h5_,_h6_)}
      function radialGradient(_h3_,_h4_)
       {return star(cst_radialGradient,_h3_,_h4_)}
      function stop(_h1_,_h2_){return star(cst_stop,_h1_,_h2_)}
      function pattern(_hZ_,_h0_){return star(cst_pattern,_hZ_,_h0_)}
      function clipPath(_hX_,_hY_){return star(cst_clipPath,_hX_,_hY_)}
      function filter(_hV_,_hW_){return star(cst_filter,_hV_,_hW_)}
      function feDistantLight(_hT_,_hU_)
       {return star(cst_feDistantLight,_hT_,_hU_)}
      function fePointLight(_hR_,_hS_)
       {return star(cst_fePointLight,_hR_,_hS_)}
      function feSpotLight(_hP_,_hQ_){return star(cst_feSpotLight,_hP_,_hQ_)}
      function feBlend(_hN_,_hO_){return star(cst_feBlend,_hN_,_hO_)}
      function feColorMatrix(_hL_,_hM_)
       {return star(cst_feColorMatrix,_hL_,_hM_)}
      function feComponentTransfer(_hJ_,_hK_)
       {return star(cst_feComponentTransfer,_hJ_,_hK_)}
      function feFuncA(_hH_,_hI_){return star(cst_feFuncA,_hH_,_hI_)}
      function feFuncG(_hF_,_hG_){return star(cst_feFuncG,_hF_,_hG_)}
      function feFuncB(_hD_,_hE_){return star(cst_feFuncB,_hD_,_hE_)}
      function feFuncR(_hB_,_hC_){return star(cst_feFuncR,_hB_,_hC_)}
      function feComposite(_hz_,_hA_){return star(cst_feComposite,_hz_,_hA_)}
      function feConvolveMatrix(_hx_,_hy_)
       {return star(cst_feConvolveMatrix,_hx_,_hy_)}
      function feDiffuseLighting(_hv_,_hw_)
       {return star(cst_feDiffuseLighting,_hv_,_hw_)}
      function feDisplacementMap(_ht_,_hu_)
       {return star(cst_feDisplacementMap,_ht_,_hu_)}
      function feFlood(_hr_,_hs_){return star(cst_feFlood,_hr_,_hs_)}
      function feGaussianBlur(_hp_,_hq_)
       {return star(cst_feGaussianBlur,_hp_,_hq_)}
      function feImage(_hn_,_ho_){return star(cst_feImage,_hn_,_ho_)}
      function feMerge(_hl_,_hm_){return star(cst_feMerge,_hl_,_hm_)}
      function feMorphology(_hj_,_hk_)
       {return star(cst_feMorphology,_hj_,_hk_)}
      function feOffset(_hh_,_hi_){return star(cst_feOffset,_hh_,_hi_)}
      function feSpecularLighting(_hf_,_hg_)
       {return star(cst_feSpecularLighting,_hf_,_hg_)}
      function feTile(_hd_,_he_){return star(cst_feTile,_hd_,_he_)}
      function feTurbulence(_hb_,_hc_)
       {return star(cst_feTurbulence,_hb_,_hc_)}
      function cursor(_g$_,_ha_){return star(cst_cursor,_g$_,_ha_)}
      function a(_g9_,_g__){return star(cst_a,_g9_,_g__)}
      function view(_g7_,_g8_){return star(cst_view,_g7_,_g8_)}
      function script(_g5_,_g6_){return unary(cst_script,_g5_,_g6_)}
      function animation(_g3_,_g4_){return star(cst_animate,_g3_,_g4_)}
      function set(_g1_,_g2_){return star(cst_set,_g1_,_g2_)}
      function animateMotion(_gZ_,_g0_)
       {return star(cst_animateMotion,_gZ_,_g0_)}
      function mpath(_gX_,_gY_){return star(cst_mpath,_gX_,_gY_)}
      function animateColor(_gV_,_gW_)
       {return star(cst_animateColor,_gV_,_gW_)}
      function animateTransform(_gT_,_gU_)
       {return star(cst_animateTransform,_gT_,_gU_)}
      function font(_gR_,_gS_){return star(cst_font,_gR_,_gS_)}
      function glyph(_gP_,_gQ_){return star(cst_glyph,_gP_,_gQ_)}
      function missing_glyph(_gN_,_gO_)
       {return star(cst_missing_glyph,_gN_,_gO_)}
      function hkern(_gL_,_gM_){return nullary(cst_hkern,_gL_,_gM_)}
      function vkern(_gJ_,_gK_){return nullary(cst_vkern,_gJ_,_gK_)}
      function font_face(_gH_,_gI_){return nullary(cst_font_face,_gH_,_gI_)}
      function font_face_src(_gF_,_gG_)
       {return star(cst_font_face_src,_gF_,_gG_)}
      function font_face_uri(_gD_,_gE_)
       {return star(cst_font_face_uri,_gD_,_gE_)}
      function font_face_format(_gB_,_gC_)
       {return nullary(cst_font_face_uri$0,_gB_,_gC_)}
      function font_face_name(_gz_,_gA_)
       {return nullary(cst_font_face_name,_gz_,_gA_)}
      function doc_toelt(x){return x}
      var I=_a_(Xml);
      function of_seq(s){return caml_call1(I[1],s)}
      function data(s){return caml_call1(Xml[18],s)}
      function leaf(tag,a,param){return caml_call2(Xml[20],a,tag)}
      function node(tag,a,elts){return caml_call3(Xml[21],a,tag,elts)}
      function coerce_elt(x){return x}
      var float_attrib=Xml[4],int_attrib=Xml[5],string_attrib=Xml[6];
      function uri_attrib(a,s){return caml_call2(Xml[13],a,s)}
      var
       space_sep_attrib=Xml[7],
       comma_sep_attrib=Xml[8],
       Unsafe=
        [0,
         data,
         leaf,
         node,
         coerce_elt,
         float_attrib,
         int_attrib,
         string_attrib,
         uri_attrib,
         space_sep_attrib,
         comma_sep_attrib];
      return [0,
              Xml,
              Info,
              _fk_,
              _fl_,
              tot,
              totl,
              toelt,
              toeltl,
              to_attrib,
              nullary,
              unary,
              star,
              to_xmlattribs,
              _fm_,
              _fn_,
              _fo_,
              _fp_,
              _fq_,
              user_attrib,
              _fm_,
              _fr_,
              metadata,
              foreignObject,
              pcdata,
              pcdata,
              a_version,
              a_baseProfile,
              a_x,
              a_y,
              a_width,
              a_height,
              a_preserveAspectRatio,
              a_contentScriptType,
              a_contentStyleType,
              a_zoomAndPan,
              a_href,
              a_xlink_href,
              a_requiredFeatures,
              a_requiredExtensions,
              a_systemLanguage,
              a_externalRessourcesRequired,
              a_id,
              a_user_data,
              a_xml_base,
              a_xml_lang,
              a_xml_space,
              a_type,
              a_media,
              a_xlink_title,
              a_class,
              a_style,
              a_transform,
              a_viewBox,
              a_d,
              a_pathLength,
              a_rx,
              a_ry,
              a_cx,
              a_cy,
              a_r,
              a_x1,
              a_y1,
              a_x2,
              a_y2,
              a_points,
              a_x_list,
              a_y_list,
              a_dx,
              a_dy,
              a_dx_list,
              a_dy_list,
              a_lengthAdjust,
              a_textLength,
              a_text_anchor,
              a_text_decoration,
              a_text_rendering,
              a_rotate,
              a_startOffset,
              a_method,
              a_spacing,
              a_glyphRef,
              a_format,
              a_markerUnits,
              a_refX,
              a_refY,
              a_markerWidth,
              a_markerHeight,
              a_orient,
              a_local,
              a_rendering_intent,
              a_gradientUnits,
              a_gradientTransform,
              a_spreadMethod,
              a_fx,
              a_fy,
              a_offset,
              a_patternUnits,
              a_patternContentUnits,
              a_patternTransform,
              a_clipPathUnits,
              a_maskUnits,
              a_maskContentUnits,
              a_primitiveUnits,
              a_filterRes,
              a_result,
              a_in,
              a_in2,
              a_azimuth,
              a_elevation,
              a_pointsAtX,
              a_pointsAtY,
              a_pointsAtZ,
              a_specularExponent,
              a_specularConstant,
              a_limitingConeAngle,
              a_mode,
              a_feColorMatrix_type,
              a_values,
              a_transfer_type,
              a_tableValues,
              a_intercept,
              a_amplitude,
              a_exponent,
              a_transfer_offset,
              a_feComposite_operator,
              a_k1,
              a_k2,
              a_k3,
              a_k4,
              a_order,
              a_kernelMatrix,
              a_divisor,
              a_bias,
              a_kernelUnitLength,
              a_targetX,
              a_targetY,
              a_edgeMode,
              a_preserveAlpha,
              a_surfaceScale,
              a_diffuseConstant,
              a_scale,
              a_xChannelSelector,
              a_yChannelSelector,
              a_stdDeviation,
              a_feMorphology_operator,
              a_radius,
              a_baseFrenquency,
              a_numOctaves,
              a_seed,
              a_stitchTiles,
              a_feTurbulence_type,
              a_xlink_show,
              a_xlink_actuate,
              a_target,
              a_viewTarget,
              a_attributeName,
              a_attributeType,
              a_begin,
              a_dur,
              a_min,
              a_max,
              a_restart,
              a_repeatCount,
              a_repeatDur,
              a_fill,
              a_animation_fill,
              a_calcMode,
              a_animation_values,
              a_keyTimes,
              a_keySplines,
              a_from,
              a_to,
              a_by,
              a_additive,
              a_accumulate,
              a_keyPoints,
              a_path,
              a_animateTransform_type,
              a_horiz_origin_x,
              a_horiz_origin_y,
              a_horiz_adv_x,
              a_vert_origin_x,
              a_vert_origin_y,
              a_vert_adv_y,
              a_unicode,
              a_glyph_name,
              a_orientation,
              a_arabic_form,
              a_lang,
              a_u1,
              a_u2,
              a_g1,
              a_g2,
              a_k,
              a_font_family,
              a_font_style,
              a_font_variant,
              a_font_weight,
              a_font_stretch,
              a_font_size,
              a_unicode_range,
              a_units_per_em,
              a_stemv,
              a_stemh,
              a_slope,
              a_cap_height,
              a_x_height,
              a_accent_height,
              a_ascent,
              a_widths,
              a_bbox,
              a_ideographic,
              a_alphabetic,
              a_mathematical,
              a_hanging,
              a_videographic,
              a_v_alphabetic,
              a_v_mathematical,
              a_v_hanging,
              a_underline_position,
              a_underline_thickness,
              a_strikethrough_position,
              a_strikethrough_thickness,
              a_overline_position,
              a_overline_thickness,
              a_string,
              a_name,
              a_alignment_baseline,
              a_dominant_baseline,
              a_onabort,
              a_onactivate,
              a_onbegin,
              a_onend,
              a_onerror,
              a_onfocusin,
              a_onfocusout,
              a_onload,
              a_onrepeat,
              a_onresize,
              a_onscroll,
              a_onunload,
              a_onzoom,
              a_onclick,
              a_onmousedown,
              a_onmouseup,
              a_onmouseover,
              a_onmouseout,
              a_onmousemove,
              a_ontouchstart,
              a_ontouchend,
              a_ontouchmove,
              a_ontouchcancel,
              a_stop_color,
              a_stop_opacity,
              a_stroke,
              a_stroke_width,
              a_stroke_linecap,
              a_stroke_linejoin,
              a_stroke_miterlimit,
              a_stroke_dasharray,
              a_stroke_dashoffset,
              a_stroke_opacity,
              svg,
              g,
              defs,
              desc,
              title,
              symbol,
              use,
              image,
              switch$0,
              style,
              path,
              rect,
              circle,
              ellipse,
              line,
              polyline,
              polygon,
              text,
              tspan,
              tref,
              textPath,
              altGlyph,
              altGlyphDef,
              altGlyphItem,
              glyphRef,
              marker,
              color_profile,
              linearGradient,
              radialGradient,
              stop,
              pattern,
              clipPath,
              filter,
              feDistantLight,
              fePointLight,
              feSpotLight,
              feBlend,
              feColorMatrix,
              feComponentTransfer,
              feFuncA,
              feFuncG,
              feFuncB,
              feFuncR,
              feComposite,
              feConvolveMatrix,
              feDiffuseLighting,
              feDisplacementMap,
              feFlood,
              feGaussianBlur,
              feImage,
              feMerge,
              feMorphology,
              feOffset,
              feSpecularLighting,
              feTile,
              feTurbulence,
              cursor,
              a,
              view,
              script,
              animation,
              set,
              animateMotion,
              mpath,
              animateColor,
              animateTransform,
              font,
              glyph,
              missing_glyph,
              hkern,
              vkern,
              font_face,
              font_face_src,
              font_face_uri,
              font_face_format,
              font_face_name,
              doc_toelt,
              I,
              of_seq,
              Unsafe]}
    function Wrapped_functions(Xml)
     {function string_of_alignment_baseline(param)
       {return -72987685 <= param
                ?354434192 <= param
                  ?881373037 <= param
                    ?1018879136 <= param?cst_after_edge:cst_alphabetic$0
                    :726666127 <= param?cst_auto:cst_hanging$0
                  :15943541 === param
                    ?cst_middle
                    :218255880 <= param?cst_mathematical$0:cst_inherit
                :-840627829 <= param
                  ?-415175851 <= param
                    ?-354838363 <= param?cst_baseline:cst_central
                    :-693588957 <= param?cst_ideographic$0:cst_text_before_edge
                  :-863864035 <= param?cst_before_edge:cst_text_after_edge}
      function string_of_big_variant(param)
       {return 3350435 <= param
                ?476616093 <= param
                  ?744337004 <= param
                    ?914009117 <= param
                      ?970483178 <= param
                        ?1040349136 <= param
                          ?1071251601 <= param?cst_stitch:cst_onRequest
                          :990972795 <= param?cst_repeat:cst_wrap
                        :958206052 <= param?cst_remove:cst_reflect
                      :870530776 <= param
                        ?884917925 <= param
                          ?889668530 <= param?cst_noStitch:cst$35
                          :881966452 <= param?cst_over:cst_none$0
                        :861714216 <= param?cst_medial:cst_never
                    :568588039 <= param
                      ?716799946 <= param
                        ?726666127 <= param
                          ?737755699 <= param?cst_butt:cst_auto$0
                          :726615284 <= param?cst_atop:cst_arithmetic
                        :698610924 <= param?cst_underline:cst_gamma
                      :512807795 <= param
                        ?518168424 <= param
                          ?557106693 <= param?cst_linear:cst_overline
                          :517347077 <= param?cst_onLoad:cst_turbulence
                        :504440814 <= param?cst_table:cst_geometricPrecision
                  :163178525 <= param
                    ?316735838 <= param
                      ?389604418 <= param
                        ?463106021 <= param
                          ?466749770 <= param?cst_optimizeSpeed:cst_miter
                          :418396260 <= param?cst_initial:cst_start
                        :384893183 <= param?cst_whenNotActive:cst_identity
                      :201080426 <= param
                        ?289998318 <= param
                          ?289998319 <= param?cst_skewY:cst_skewX
                          :226915517 <= param?cst_square:cst_scale$0
                        :172069535 <= param?cst_exact:cst_perceptual
                    :4393399 <= param
                      ?9660462 <= param
                        ?106228547 <= param
                          ?118574553 <= param?cst_discrete:cst_erode
                          :15943541 <= param?cst_middle$0:cst_round
                        :4401019 <= param?cst_xor:cst_XML
                      :3901504 <= param
                        ?4000051 <= param
                          ?4153707 <= param?cst_sum:cst_pad
                          :3954798 <= param?cst_out:cst_new
                        :3455931 <= param?cst_end:cst_CSS
                :-453122489 <= param
                  ?-72987685 <= param
                    ?66 <= param
                      ?72 <= param
                        ?86 <= param
                          ?16389 <= param?cst_in$1:cst_v
                          :82 <= param?cst_r$0:cst_h
                        :71 <= param?cst_g$0:cst_b
                      :-68046964 <= param
                        ?-4932997 <= param
                          ?65 <= param?cst_a$0:cst_rotate$0
                          :-22441528 <= param?cst_disable:cst_screen
                        :-72678338 <= param?cst_absolute_colorimetric:cst_inherit$0
                    :-262362527 <= param
                      ?-197222844 <= param
                        ?-115006565 <= param
                          ?-76840209 <= param?cst_always:cst_spacingAndGlyphs
                          :-126259180 <= param?cst_replace:cst_multiply
                        :-197983439 <= param?cst_spline:cst_matrix
                      :-384499551 <= param
                        ?-318472885 <= param
                          ?-313337870 <= param?cst_saturation:cst_dilate
                          :-346900690 <= param?cst_translate:cst_default
                        :-415993185 <= param?cst_lighten:cst_normal
                  :-839430911 <= param
                    ?-672592881 <= param
                      ?-552838301 <= param
                        ?-505547199 <= param
                          ?-474415497 <= param?cst_freeze:cst_magnify
                          :-543144685 <= param?cst_hueRotate:cst_spacing$0
                        :-621842423 <= param?cst_fractalNoise:cst_saturate
                      :-797470191 <= param
                        ?-699926424 <= param
                          ?-689066995 <= param
                            ?cst_userSpaceOnUse
                            :cst_objectBoundingBox
                          :-707876225 <= param?cst_darken:cst_paced
                        :-824137927 <= param?cst_isolated:cst_optimizeLegibility
                    :-951087346 <= param
                      ?-912466532 <= param
                        ?-851306022 <= param
                          ?-851300629 <= param?cst_luminanceToAlpha:cst_line_through
                          :-912009552 <= param?cst_other:cst_terminal
                        :-937074372 <= param?cst_blink:cst_stroke_width$0
                      :-1044642615 === param
                        ?cst_relative_colorimetric
                        :-1014056864 <= param
                          ?-1012636187 <= param?cst_stretch:cst_bevel
                          :-1024851605 <= param?cst_duplicate:cst_preserve}
      var _eX_=Stdlib[30];
      function _eY_(param)
       {var b=param[2],a=param[1];return caml_call3(Stdlib_Printf[4],_S_,a,b)}
      var _eZ_=0;
      function string_of_coords(_fj_){return list(_eZ_,_eY_,_fj_)}
      function string_of_dominant_baseline(param)
       {return -72987685 <= param
                ?354434192 <= param
                  ?881373037 <= param
                    ?945233102 <= param?cst_nochange:cst_alphabetic$1
                    :726666127 <= param?cst_auto$1:cst_hanging$1
                  :15943541 === param
                    ?cst_middle$1
                    :218255880 <= param?cst_mathematical$1:cst_inherit$1
                :-840627829 <= param
                  ?-504734109 <= param
                    ?-415175851 <= param?cst_central$0:cst_usescript
                    :-693588957 <= param?cst_ideographic$1:cst_textbeforeedge
                  :-880506735 <= param?cst_resetsize:cst_textafteredge}
      function string_of_in_value(param)
       {if(typeof param === "number")
         return 198492909 <= param
                 ?885982307 <= param
                   ?976982182 <= param?cst_strokePaint:cst_sourceAlpha
                   :768130555 <= param?cst_fillPaint:cst_sourceGraphic
                 :-522189715 <= param?cst_backgroundImage:cst_backgroundAlpha;
        var svg=param[2];
        return svg}
      var _e0_=Stdlib[33],_e1_=0;
      function string_of_lengths(_fi_)
       {return list(_e1_,string_of_length,_fi_)}
      function string_of_percentage(x)
       {var _fh_=string_of_number(x);
        return caml_call2(Stdlib[28],_fh_,cst$36)}
      function string_of_fourfloats(param)
       {var
         d=param[4],
         c=param[3],
         b=param[2],
         a=param[1],
         _fd_=string_of_number(d),
         _fe_=string_of_number(c),
         _ff_=string_of_number(b),
         _fg_=string_of_number(a);
        return caml_call5(Stdlib_Printf[4],_T_,_fg_,_ff_,_fe_,_fd_)}
      function string_of_number_optional_numb(param)
       {var _fb_=param[2],_fc_=param[1];
        if(_fb_){var y=_fb_[1];return caml_call3(Stdlib_Printf[4],_U_,_fc_,y)}
        return caml_call2(Stdlib_Printf[4],_V_,_fc_)}
      var _e2_=0;
      function string_of_numbers(_fa_)
       {return list(_e2_,string_of_number,_fa_)}
      function string_of_numbers_semicolon(_e$_)
       {return list(_W_,string_of_number,_e$_)}
      function string_of_offset(param)
       {if(-488794310 <= param[1])
         {var x=param[2];return string_of_percentage(x)}
        var x$0=param[2];
        return string_of_number(x$0)}
      function string_of_orient(param)
       {if(param){var svg=param[1];return string_of_angle(svg)}
        return cst_auto$2}
      function string_of_strokedasharray(l)
       {return l?list(0,string_of_length,l):cst_none$1}
      function string_of_transform(param)
       {var _e4_=param[1];
        if(-4932997 <= _e4_)
         {if(289998318 <= _e4_)
           {if(289998319 <= _e4_)
             {var angle=param[2],_e5_=string_of_angle(angle);
              return caml_call2(Stdlib_Printf[4],_X_,_e5_)}
            var angle$0=param[2],_e6_=string_of_angle(angle$0);
            return caml_call2(Stdlib_Printf[4],_Y_,_e6_)}
          if(201080426 <= _e4_)
           {var x=param[2],_e7_=string_of_number_optional_numb(x);
            return caml_call2(Stdlib_Printf[4],_Z_,_e7_)}
          var match=param[2],x$0=match[2],angle$1=match[1];
          if(x$0)
           var
            match$0=x$0[1],
            y=match$0[2],
            x$1=match$0[1],
            _e8_=caml_call3(Stdlib_Printf[4],___,x$1,y);
          else
           var _e8_=cst$37;
          var _e9_=string_of_angle(angle$1);
          return caml_call3(Stdlib_Printf[4],_$_,_e9_,_e8_)}
        if(-262362527 <= _e4_)
         {var
           match$1=param[2],
           f=match$1[6],
           e=match$1[5],
           d=match$1[4],
           c=match$1[3],
           b=match$1[2],
           a=match$1[1];
          return caml_call7(Stdlib_Printf[4],_aa_,a,b,c,d,e,f)}
        var x$2=param[2],_e__=string_of_number_optional_numb(x$2);
        return caml_call2(Stdlib_Printf[4],_ab_,_e__)}
      function string_of_transforms(l)
       {var _e3_=caml_call2(Stdlib_List[19],string_of_transform,l);
        return caml_call2(Stdlib_String[6],cst$38,_e3_)}
      return [0,
              Xml,
              string_of_alignment_baseline,
              string_of_big_variant,
              _eX_,
              string_of_coords,
              string_of_dominant_baseline,
              string_of_in_value,
              _e0_,
              string_of_length,
              string_of_lengths,
              string_of_number,
              string_of_percentage,
              string_of_fourfloats,
              string_of_number_optional_numb,
              string_of_numbers,
              string_of_numbers_semicolon,
              string_of_offset,
              string_of_orient,
              string_of_paint,
              string_of_strokedasharray,
              string_of_transform,
              string_of_transforms]}
    function _ac_(_eT_,_eS_)
     {var
       _eU_=Make_with_wrapped_functions(_eT_,_eS_),
       _eV_=_eU_[342],
       _eW_=_eU_[2];
      return [0,
              _eU_[1],
              [0,_eW_[1],_eW_[2],_eW_[4],_eW_[5],_eW_[6],_eW_[7],_eW_[3]],
              _eU_[3],
              _eU_[4],
              _eU_[26],
              _eU_[27],
              _eU_[28],
              _eU_[29],
              _eU_[30],
              _eU_[31],
              _eU_[32],
              _eU_[33],
              _eU_[34],
              _eU_[35],
              _eU_[36],
              _eU_[37],
              _eU_[38],
              _eU_[39],
              _eU_[40],
              _eU_[41],
              _eU_[42],
              _eU_[43],
              _eU_[44],
              _eU_[45],
              _eU_[46],
              _eU_[47],
              _eU_[48],
              _eU_[49],
              _eU_[50],
              _eU_[51],
              _eU_[52],
              _eU_[53],
              _eU_[54],
              _eU_[55],
              _eU_[56],
              _eU_[57],
              _eU_[58],
              _eU_[59],
              _eU_[60],
              _eU_[61],
              _eU_[62],
              _eU_[63],
              _eU_[64],
              _eU_[65],
              _eU_[66],
              _eU_[67],
              _eU_[68],
              _eU_[69],
              _eU_[70],
              _eU_[71],
              _eU_[72],
              _eU_[73],
              _eU_[74],
              _eU_[75],
              _eU_[76],
              _eU_[77],
              _eU_[78],
              _eU_[79],
              _eU_[80],
              _eU_[81],
              _eU_[82],
              _eU_[83],
              _eU_[84],
              _eU_[85],
              _eU_[86],
              _eU_[87],
              _eU_[88],
              _eU_[89],
              _eU_[90],
              _eU_[91],
              _eU_[92],
              _eU_[93],
              _eU_[94],
              _eU_[95],
              _eU_[96],
              _eU_[97],
              _eU_[98],
              _eU_[99],
              _eU_[100],
              _eU_[101],
              _eU_[102],
              _eU_[103],
              _eU_[104],
              _eU_[105],
              _eU_[106],
              _eU_[107],
              _eU_[108],
              _eU_[109],
              _eU_[110],
              _eU_[111],
              _eU_[112],
              _eU_[113],
              _eU_[114],
              _eU_[115],
              _eU_[116],
              _eU_[117],
              _eU_[118],
              _eU_[119],
              _eU_[120],
              _eU_[121],
              _eU_[122],
              _eU_[123],
              _eU_[124],
              _eU_[125],
              _eU_[126],
              _eU_[127],
              _eU_[128],
              _eU_[129],
              _eU_[130],
              _eU_[131],
              _eU_[132],
              _eU_[133],
              _eU_[134],
              _eU_[135],
              _eU_[136],
              _eU_[137],
              _eU_[138],
              _eU_[139],
              _eU_[140],
              _eU_[141],
              _eU_[142],
              _eU_[143],
              _eU_[144],
              _eU_[145],
              _eU_[146],
              _eU_[147],
              _eU_[148],
              _eU_[149],
              _eU_[150],
              _eU_[151],
              _eU_[152],
              _eU_[153],
              _eU_[154],
              _eU_[155],
              _eU_[156],
              _eU_[157],
              _eU_[158],
              _eU_[159],
              _eU_[160],
              _eU_[161],
              _eU_[162],
              _eU_[163],
              _eU_[164],
              _eU_[165],
              _eU_[166],
              _eU_[167],
              _eU_[168],
              _eU_[169],
              _eU_[170],
              _eU_[171],
              _eU_[172],
              _eU_[173],
              _eU_[174],
              _eU_[175],
              _eU_[176],
              _eU_[177],
              _eU_[178],
              _eU_[179],
              _eU_[180],
              _eU_[181],
              _eU_[182],
              _eU_[183],
              _eU_[184],
              _eU_[185],
              _eU_[186],
              _eU_[187],
              _eU_[188],
              _eU_[189],
              _eU_[190],
              _eU_[191],
              _eU_[192],
              _eU_[193],
              _eU_[194],
              _eU_[195],
              _eU_[196],
              _eU_[197],
              _eU_[198],
              _eU_[199],
              _eU_[200],
              _eU_[201],
              _eU_[202],
              _eU_[203],
              _eU_[204],
              _eU_[205],
              _eU_[206],
              _eU_[207],
              _eU_[208],
              _eU_[209],
              _eU_[210],
              _eU_[211],
              _eU_[212],
              _eU_[213],
              _eU_[214],
              _eU_[215],
              _eU_[216],
              _eU_[217],
              _eU_[218],
              _eU_[219],
              _eU_[220],
              _eU_[221],
              _eU_[222],
              _eU_[223],
              _eU_[224],
              _eU_[225],
              _eU_[226],
              _eU_[227],
              _eU_[228],
              _eU_[229],
              _eU_[253],
              _eU_[254],
              _eU_[255],
              _eU_[256],
              _eU_[257],
              _eU_[258],
              _eU_[259],
              _eU_[260],
              _eU_[261],
              _eU_[262],
              _eU_[230],
              _eU_[231],
              _eU_[232],
              _eU_[233],
              _eU_[234],
              _eU_[235],
              _eU_[236],
              _eU_[237],
              _eU_[238],
              _eU_[239],
              _eU_[240],
              _eU_[241],
              _eU_[242],
              _eU_[243],
              _eU_[244],
              _eU_[245],
              _eU_[246],
              _eU_[247],
              _eU_[248],
              _eU_[249],
              _eU_[250],
              _eU_[251],
              _eU_[252],
              _eU_[24],
              _eU_[263],
              _eU_[264],
              _eU_[265],
              _eU_[266],
              _eU_[267],
              _eU_[268],
              _eU_[269],
              _eU_[270],
              _eU_[271],
              _eU_[272],
              _eU_[273],
              _eU_[274],
              _eU_[275],
              _eU_[276],
              _eU_[277],
              _eU_[278],
              _eU_[279],
              _eU_[280],
              _eU_[281],
              _eU_[282],
              _eU_[283],
              _eU_[284],
              _eU_[285],
              _eU_[286],
              _eU_[287],
              _eU_[288],
              _eU_[289],
              _eU_[290],
              _eU_[291],
              _eU_[292],
              _eU_[293],
              _eU_[294],
              _eU_[295],
              _eU_[296],
              _eU_[297],
              _eU_[298],
              _eU_[299],
              _eU_[300],
              _eU_[301],
              _eU_[302],
              _eU_[303],
              _eU_[304],
              _eU_[305],
              _eU_[306],
              _eU_[307],
              _eU_[308],
              _eU_[309],
              _eU_[310],
              _eU_[311],
              _eU_[312],
              _eU_[313],
              _eU_[314],
              _eU_[315],
              _eU_[316],
              _eU_[317],
              _eU_[318],
              _eU_[319],
              _eU_[320],
              _eU_[321],
              _eU_[322],
              _eU_[323],
              _eU_[324],
              _eU_[325],
              _eU_[326],
              _eU_[327],
              _eU_[328],
              _eU_[329],
              _eU_[330],
              _eU_[331],
              _eU_[332],
              _eU_[333],
              _eU_[334],
              _eU_[335],
              _eU_[336],
              _eU_[337],
              _eU_[338],
              _eU_[22],
              _eU_[23],
              _eU_[25],
              _eU_[341],
              _eU_[5],
              _eU_[6],
              _eU_[7],
              _eU_[8],
              _eU_[339],
              _eU_[13],
              _eU_[9],
              [0,
               _eV_[1],
               _eV_[3],
               _eV_[2],
               _eV_[4],
               _eV_[7],
               _eV_[5],
               _eV_[6],
               _eV_[8],
               _eV_[9],
               _eV_[10]]]}
    function _ad_(_eQ_)
     {var _eR_=Wrapped_functions(_eQ_);
      return [0,
              _eR_[1],
              _eR_[2],
              _eR_[4],
              _eR_[3],
              _eR_[5],
              _eR_[6],
              _eR_[13],
              _eR_[7],
              _eR_[8],
              _eR_[9],
              _eR_[10],
              _eR_[11],
              _eR_[14],
              _eR_[15],
              _eR_[16],
              _eR_[17],
              _eR_[18],
              _eR_[19],
              _eR_[20],
              _eR_[21],
              _eR_[22]]}
    var
     Svg_f=
      [0,
       function(_eM_)
        {var
          _eL_=Wrapped_functions(_eM_),
          _eP_=
           Make_with_wrapped_functions
            (_eM_,
             [0,
              _eL_[1],
              _eL_[2],
              _eL_[4],
              _eL_[3],
              _eL_[5],
              _eL_[6],
              _eL_[13],
              _eL_[7],
              _eL_[8],
              _eL_[9],
              _eL_[10],
              _eL_[11],
              _eL_[14],
              _eL_[15],
              _eL_[16],
              _eL_[17],
              _eL_[18],
              _eL_[19],
              _eL_[20],
              _eL_[21],
              _eL_[22]]),
          _eN_=_eP_[342],
          _eO_=_eP_[2];
         return [0,
                 _eP_[1],
                 [0,_eO_[1],_eO_[2],_eO_[4],_eO_[5],_eO_[6],_eO_[7],_eO_[3]],
                 _eP_[3],
                 _eP_[4],
                 _eP_[26],
                 _eP_[27],
                 _eP_[28],
                 _eP_[29],
                 _eP_[30],
                 _eP_[31],
                 _eP_[32],
                 _eP_[33],
                 _eP_[34],
                 _eP_[35],
                 _eP_[36],
                 _eP_[37],
                 _eP_[38],
                 _eP_[39],
                 _eP_[40],
                 _eP_[41],
                 _eP_[42],
                 _eP_[43],
                 _eP_[44],
                 _eP_[45],
                 _eP_[46],
                 _eP_[47],
                 _eP_[48],
                 _eP_[49],
                 _eP_[50],
                 _eP_[51],
                 _eP_[52],
                 _eP_[53],
                 _eP_[54],
                 _eP_[55],
                 _eP_[56],
                 _eP_[57],
                 _eP_[58],
                 _eP_[59],
                 _eP_[60],
                 _eP_[61],
                 _eP_[62],
                 _eP_[63],
                 _eP_[64],
                 _eP_[65],
                 _eP_[66],
                 _eP_[67],
                 _eP_[68],
                 _eP_[69],
                 _eP_[70],
                 _eP_[71],
                 _eP_[72],
                 _eP_[73],
                 _eP_[74],
                 _eP_[75],
                 _eP_[76],
                 _eP_[77],
                 _eP_[78],
                 _eP_[79],
                 _eP_[80],
                 _eP_[81],
                 _eP_[82],
                 _eP_[83],
                 _eP_[84],
                 _eP_[85],
                 _eP_[86],
                 _eP_[87],
                 _eP_[88],
                 _eP_[89],
                 _eP_[90],
                 _eP_[91],
                 _eP_[92],
                 _eP_[93],
                 _eP_[94],
                 _eP_[95],
                 _eP_[96],
                 _eP_[97],
                 _eP_[98],
                 _eP_[99],
                 _eP_[100],
                 _eP_[101],
                 _eP_[102],
                 _eP_[103],
                 _eP_[104],
                 _eP_[105],
                 _eP_[106],
                 _eP_[107],
                 _eP_[108],
                 _eP_[109],
                 _eP_[110],
                 _eP_[111],
                 _eP_[112],
                 _eP_[113],
                 _eP_[114],
                 _eP_[115],
                 _eP_[116],
                 _eP_[117],
                 _eP_[118],
                 _eP_[119],
                 _eP_[120],
                 _eP_[121],
                 _eP_[122],
                 _eP_[123],
                 _eP_[124],
                 _eP_[125],
                 _eP_[126],
                 _eP_[127],
                 _eP_[128],
                 _eP_[129],
                 _eP_[130],
                 _eP_[131],
                 _eP_[132],
                 _eP_[133],
                 _eP_[134],
                 _eP_[135],
                 _eP_[136],
                 _eP_[137],
                 _eP_[138],
                 _eP_[139],
                 _eP_[140],
                 _eP_[141],
                 _eP_[142],
                 _eP_[143],
                 _eP_[144],
                 _eP_[145],
                 _eP_[146],
                 _eP_[147],
                 _eP_[148],
                 _eP_[149],
                 _eP_[150],
                 _eP_[151],
                 _eP_[152],
                 _eP_[153],
                 _eP_[154],
                 _eP_[155],
                 _eP_[156],
                 _eP_[157],
                 _eP_[158],
                 _eP_[159],
                 _eP_[160],
                 _eP_[161],
                 _eP_[162],
                 _eP_[163],
                 _eP_[164],
                 _eP_[165],
                 _eP_[166],
                 _eP_[167],
                 _eP_[168],
                 _eP_[169],
                 _eP_[170],
                 _eP_[171],
                 _eP_[172],
                 _eP_[173],
                 _eP_[174],
                 _eP_[175],
                 _eP_[176],
                 _eP_[177],
                 _eP_[178],
                 _eP_[179],
                 _eP_[180],
                 _eP_[181],
                 _eP_[182],
                 _eP_[183],
                 _eP_[184],
                 _eP_[185],
                 _eP_[186],
                 _eP_[187],
                 _eP_[188],
                 _eP_[189],
                 _eP_[190],
                 _eP_[191],
                 _eP_[192],
                 _eP_[193],
                 _eP_[194],
                 _eP_[195],
                 _eP_[196],
                 _eP_[197],
                 _eP_[198],
                 _eP_[199],
                 _eP_[200],
                 _eP_[201],
                 _eP_[202],
                 _eP_[203],
                 _eP_[204],
                 _eP_[205],
                 _eP_[206],
                 _eP_[207],
                 _eP_[208],
                 _eP_[209],
                 _eP_[210],
                 _eP_[211],
                 _eP_[212],
                 _eP_[213],
                 _eP_[214],
                 _eP_[215],
                 _eP_[216],
                 _eP_[217],
                 _eP_[218],
                 _eP_[219],
                 _eP_[220],
                 _eP_[221],
                 _eP_[222],
                 _eP_[223],
                 _eP_[224],
                 _eP_[225],
                 _eP_[226],
                 _eP_[227],
                 _eP_[228],
                 _eP_[229],
                 _eP_[253],
                 _eP_[254],
                 _eP_[255],
                 _eP_[256],
                 _eP_[257],
                 _eP_[258],
                 _eP_[259],
                 _eP_[260],
                 _eP_[261],
                 _eP_[262],
                 _eP_[230],
                 _eP_[231],
                 _eP_[232],
                 _eP_[233],
                 _eP_[234],
                 _eP_[235],
                 _eP_[236],
                 _eP_[237],
                 _eP_[238],
                 _eP_[239],
                 _eP_[240],
                 _eP_[241],
                 _eP_[242],
                 _eP_[243],
                 _eP_[244],
                 _eP_[245],
                 _eP_[246],
                 _eP_[247],
                 _eP_[248],
                 _eP_[249],
                 _eP_[250],
                 _eP_[251],
                 _eP_[252],
                 _eP_[24],
                 _eP_[263],
                 _eP_[264],
                 _eP_[265],
                 _eP_[266],
                 _eP_[267],
                 _eP_[268],
                 _eP_[269],
                 _eP_[270],
                 _eP_[271],
                 _eP_[272],
                 _eP_[273],
                 _eP_[274],
                 _eP_[275],
                 _eP_[276],
                 _eP_[277],
                 _eP_[278],
                 _eP_[279],
                 _eP_[280],
                 _eP_[281],
                 _eP_[282],
                 _eP_[283],
                 _eP_[284],
                 _eP_[285],
                 _eP_[286],
                 _eP_[287],
                 _eP_[288],
                 _eP_[289],
                 _eP_[290],
                 _eP_[291],
                 _eP_[292],
                 _eP_[293],
                 _eP_[294],
                 _eP_[295],
                 _eP_[296],
                 _eP_[297],
                 _eP_[298],
                 _eP_[299],
                 _eP_[300],
                 _eP_[301],
                 _eP_[302],
                 _eP_[303],
                 _eP_[304],
                 _eP_[305],
                 _eP_[306],
                 _eP_[307],
                 _eP_[308],
                 _eP_[309],
                 _eP_[310],
                 _eP_[311],
                 _eP_[312],
                 _eP_[313],
                 _eP_[314],
                 _eP_[315],
                 _eP_[316],
                 _eP_[317],
                 _eP_[318],
                 _eP_[319],
                 _eP_[320],
                 _eP_[321],
                 _eP_[322],
                 _eP_[323],
                 _eP_[324],
                 _eP_[325],
                 _eP_[326],
                 _eP_[327],
                 _eP_[328],
                 _eP_[329],
                 _eP_[330],
                 _eP_[331],
                 _eP_[332],
                 _eP_[333],
                 _eP_[334],
                 _eP_[335],
                 _eP_[336],
                 _eP_[337],
                 _eP_[338],
                 _eP_[22],
                 _eP_[23],
                 _eP_[25],
                 _eP_[341],
                 _eP_[5],
                 _eP_[6],
                 _eP_[7],
                 _eP_[8],
                 _eP_[339],
                 _eP_[13],
                 _eP_[9],
                 [0,
                  _eN_[1],
                  _eN_[3],
                  _eN_[2],
                  _eN_[4],
                  _eN_[7],
                  _eN_[5],
                  _eN_[6],
                  _eN_[8],
                  _eN_[9],
                  _eN_[10]]]},
       _ad_,
       _ac_];
    caml_register_global(1101,Svg_f,"Svg_f");
    function Make_with_wrapped_functions$0(Xml,C,Svg)
     {var
       doctype=compose_doctype(cst_html,0),
       Info=
        [0,
         content_type$0,
         alternative_content_types,
         version$0,
         standard$0,
         namespace$0,
         doctype,
         emptytags],
       _aH_=Xml[2],
       _aI_=Xml[3];
      function to_xmlattribs(x){return x}
      function to_attrib(x){return x}
      var _aJ_=Xml[4],_aK_=Xml[5],_aL_=Xml[6];
      function uri_attrib(a,s){return caml_call2(Xml[13],a,s)}
      var _aM_=Xml[7],_aN_=Xml[8];
      function user_attrib(f,name,v)
       {var _eK_=caml_call2(Xml[1][2],f,v);
        return caml_call2(Xml[6],name,_eK_)}
      var _aO_=C[3];
      function bool_attrib(_eI_,_eJ_){return user_attrib(_aO_,_eI_,_eJ_)}
      function constant_attrib(a,param)
       {return caml_call2(_aL_,a,caml_call1(Xml[1][1],a))}
      function linktypes_attrib(name,x){return user_attrib(C[8],name,x)}
      function mediadesc_attrib(name,x){return user_attrib(C[9],name,x)}
      function srcset_attrib(name,x){return user_attrib(C[14],name,x)}
      var a_class=caml_call1(_aM_,cst_class$0),a_id=caml_call1(_aL_,cst_id$0);
      function a_user_data(name)
       {return caml_call1(_aL_,caml_call2(Stdlib[28],cst_data$0,name))}
      var
       a_title=caml_call1(_aL_,cst_title$0),
       a_xml_lang=caml_call1(_aL_,cst_xml_lang$0),
       a_lang=caml_call1(_aL_,cst_lang$0),
       a_style=caml_call1(_aL_,cst_style$1),
       a_property=caml_call1(_aL_,cst_property),
       a_onabort=caml_call1(Xml[9],cst_onabort$0),
       a_onafterprint=caml_call1(Xml[9],cst_onafterprint),
       a_onbeforeprint=caml_call1(Xml[9],cst_onbeforeprint),
       a_onbeforeunload=caml_call1(Xml[9],cst_onbeforeunload),
       a_onblur=caml_call1(Xml[9],cst_onblur),
       a_oncanplay=caml_call1(Xml[9],cst_oncanplay),
       a_oncanplaythrough=caml_call1(Xml[9],cst_oncanplaythrough),
       a_onchange=caml_call1(Xml[9],cst_onchange),
       a_ondurationchange=caml_call1(Xml[9],cst_ondurationchange),
       a_onemptied=caml_call1(Xml[9],cst_onemptied),
       a_onended=caml_call1(Xml[9],cst_onended),
       a_onerror=caml_call1(Xml[9],cst_onerror$0),
       a_onfocus=caml_call1(Xml[9],cst_onfocus),
       a_onformchange=caml_call1(Xml[9],cst_onformchange),
       a_onforminput=caml_call1(Xml[9],cst_onforminput),
       a_onhashchange=caml_call1(Xml[9],cst_onhashchange),
       a_oninput=caml_call1(Xml[9],cst_oninput),
       a_oninvalid=caml_call1(Xml[9],cst_oninvalid),
       a_onoffline=caml_call1(Xml[9],cst_onoffline),
       a_ononline=caml_call1(Xml[9],cst_ononline),
       a_onpause=caml_call1(Xml[9],cst_onpause),
       a_onplay=caml_call1(Xml[9],cst_onplay),
       a_onplaying=caml_call1(Xml[9],cst_onplaying),
       a_onpagehide=caml_call1(Xml[9],cst_onpagehide),
       a_onpageshow=caml_call1(Xml[9],cst_onpageshow),
       a_onpopstate=caml_call1(Xml[9],cst_onpopstate),
       a_onprogress=caml_call1(Xml[9],cst_onprogress),
       a_onratechange=caml_call1(Xml[9],cst_onratechange),
       a_onreadystatechange=caml_call1(Xml[9],cst_onreadystatechange),
       a_onredo=caml_call1(Xml[9],cst_onredo),
       a_onresize=caml_call1(Xml[9],cst_onresize$0),
       a_onscroll=caml_call1(Xml[9],cst_onscroll$0),
       a_onseeked=caml_call1(Xml[9],cst_onseeked),
       a_onseeking=caml_call1(Xml[9],cst_onseeking),
       a_onselect=caml_call1(Xml[9],cst_onselect),
       a_onshow=caml_call1(Xml[9],cst_onshow),
       a_onstalled=caml_call1(Xml[9],cst_onstalled),
       a_onstorage=caml_call1(Xml[9],cst_onstorage),
       a_onsubmit=caml_call1(Xml[9],cst_onsubmit),
       a_onsuspend=caml_call1(Xml[9],cst_onsuspend),
       a_ontimeupdate=caml_call1(Xml[9],cst_ontimeupdate),
       a_onundo=caml_call1(Xml[9],cst_onundo),
       a_onunload=caml_call1(Xml[9],cst_onunload$0),
       a_onvolumechange=caml_call1(Xml[9],cst_onvolumechange),
       a_onwaiting=caml_call1(Xml[9],cst_onwaiting),
       a_onload=caml_call1(Xml[9],cst_onload$0),
       a_onloadeddata=caml_call1(Xml[9],cst_onloadeddata),
       a_onloadedmetadata=caml_call1(Xml[9],cst_onloadedmetadata),
       a_onloadstart=caml_call1(Xml[9],cst_onloadstart),
       a_onmessage=caml_call1(Xml[9],cst_onmessage),
       a_onmousewheel=caml_call1(Xml[9],cst_onmousewheel),
       a_onclick=caml_call1(Xml[10],cst_onclick$0),
       a_oncontextmenu=caml_call1(Xml[10],cst_oncontextmenu),
       a_ondblclick=caml_call1(Xml[10],cst_ondblclick),
       a_ondrag=caml_call1(Xml[10],cst_ondrag),
       a_ondragend=caml_call1(Xml[10],cst_ondragend),
       a_ondragenter=caml_call1(Xml[10],cst_ondragenter),
       a_ondragleave=caml_call1(Xml[10],cst_ondragleave),
       a_ondragover=caml_call1(Xml[10],cst_ondragover),
       a_ondragstart=caml_call1(Xml[10],cst_ondragstart),
       a_ondrop=caml_call1(Xml[10],cst_ondrop),
       a_onmousedown=caml_call1(Xml[10],cst_onmousedown$0),
       a_onmouseup=caml_call1(Xml[10],cst_onmouseup$0),
       a_onmouseover=caml_call1(Xml[10],cst_onmouseover$0),
       a_onmousemove=caml_call1(Xml[10],cst_onmousemove$0),
       a_onmouseout=caml_call1(Xml[10],cst_onmouseout$0),
       a_ontouchstart=caml_call1(Xml[12],cst_ontouchstart$0),
       a_ontouchend=caml_call1(Xml[12],cst_ontouchend$0),
       a_ontouchmove=caml_call1(Xml[12],cst_ontouchmove$0),
       a_ontouchcancel=caml_call1(Xml[12],cst_ontouchcancel$0),
       a_onkeypress=caml_call1(Xml[11],cst_onkeypress),
       a_onkeydown=caml_call1(Xml[11],cst_onkeydown),
       a_onkeyup=caml_call1(Xml[11],cst_onkeyup),
       a_version=caml_call1(_aL_,cst_version$0);
      function a_xmlns(x){return user_attrib(C[2],cst_xmlns$4,x)}
      function a_manifest(_eH_){return uri_attrib(cst_manifest,_eH_)}
      function a_cite(_eG_){return uri_attrib(cst_cite,_eG_)}
      function a_xml_space(x){return user_attrib(C[2],cst_xml_space$0,x)}
      function a_accesskey(c){return user_attrib(C[5],cst_accesskey,c)}
      var
       a_charset=caml_call1(_aL_,cst_charset),
       a_accept_charset=caml_call1(_aM_,cst_accept_charset),
       a_accept=caml_call1(_aN_,cst_accept);
      function a_href(_eF_){return uri_attrib(cst_href$0,_eF_)}
      var a_hreflang=caml_call1(_aL_,cst_hreflang);
      function a_download(file){return user_attrib(C[16],cst_download,file)}
      function a_rel(_eE_){return linktypes_attrib(cst_rel,_eE_)}
      var
       a_tabindex=caml_call1(_aK_,cst_tabindex),
       a_mime_type=caml_call1(_aL_,cst_type$4),
       a_alt=caml_call1(_aL_,cst_alt);
      function a_height(p){return caml_call2(_aK_,cst_height$0,p)}
      function a_src(_eD_){return uri_attrib(cst_src,_eD_)}
      function a_width(p){return caml_call2(_aK_,cst_width$0,p)}
      var
       a_for=caml_call1(_aL_,cst_for),
       a_for_list=caml_call1(_aM_,cst_for$0);
      function a_selected(_eC_){return constant_attrib(cst_selected,_eC_)}
      var
       a_text_value=caml_call1(_aL_,cst_value),
       a_int_value=caml_call1(_aK_,cst_value$0),
       a_value=caml_call1(_aL_,cst_value$1),
       a_float_value=caml_call1(_aJ_,cst_value$2);
      function a_action(_eB_){return uri_attrib(cst_action,_eB_)}
      function a_formmethod(x){return user_attrib(C[2],cst_method$0,x)}
      var a_enctype=caml_call1(_aL_,cst_enctype);
      function a_checked(_eA_){return constant_attrib(cst_checked,_eA_)}
      function a_disabled(_ez_){return constant_attrib(cst_disabled,_ez_)}
      function a_readonly(_ey_){return constant_attrib(cst_readonly,_ey_)}
      var
       a_maxlength=caml_call1(_aK_,cst_maxlength),
       a_minlength=caml_call1(_aK_,cst_minlength),
       a_name=caml_call1(_aL_,cst_name$0);
      function a_allowfullscreen(_ex_)
       {return constant_attrib(cst_allowfullscreen,_ex_)}
      function a_allowpaymentrequest(_ew_)
       {return constant_attrib(cst_allowpaymentrequest,_ew_)}
      function a_referrerpolicy(x)
       {return user_attrib(C[10],cst_referrerpolicy,x)}
      function a_autocomplete(x){return user_attrib(C[4],cst_autocomplete,x)}
      function a_async(_ev_){return constant_attrib(cst_async,_ev_)}
      function a_autofocus(_eu_){return constant_attrib(cst_autofocus,_eu_)}
      function a_autoplay(_et_){return constant_attrib(cst_autoplay,_et_)}
      function a_muted(_es_){return constant_attrib(cst_muted,_es_)}
      function a_crossorigin(x){return user_attrib(C[2],cst_crossorigin,x)}
      var
       a_integrity=caml_call1(_aL_,cst_integrity),
       a_mediagroup=caml_call1(_aL_,cst_mediagroup),
       a_challenge=caml_call1(_aL_,cst_challenge);
      function a_contenteditable(ce)
       {return bool_attrib(cst_contenteditable,ce)}
      var a_contextmenu=caml_call1(_aL_,cst_contextmenu);
      function a_controls(_er_){return constant_attrib(cst_controls,_er_)}
      function a_dir(x){return user_attrib(C[2],cst_dir,x)}
      function a_draggable(d){return bool_attrib(cst_draggable,d)}
      var a_form=caml_call1(_aL_,cst_form);
      function a_formaction(_eq_){return uri_attrib(cst_formaction,_eq_)}
      var a_formenctype=caml_call1(_aL_,cst_formenctype);
      function a_formnovalidate(_ep_)
       {return constant_attrib(cst_formnovalidate,_ep_)}
      var a_formtarget=caml_call1(_aL_,cst_formtarget);
      function a_hidden(_eo_){return constant_attrib(cst_hidden,_eo_)}
      var a_high=caml_call1(_aJ_,cst_high);
      function a_icon(_en_){return uri_attrib(cst_icon,_en_)}
      function a_ismap(_em_){return constant_attrib(cst_ismap,_em_)}
      var
       a_keytype=caml_call1(_aL_,cst_keytype),
       a_list=caml_call1(_aL_,cst_list);
      function a_loop(_el_){return constant_attrib(cst_loop,_el_)}
      var
       a_low=caml_call1(_aJ_,cst_low),
       a_max=caml_call1(_aJ_,cst_max$0),
       _aP_=C[7];
      function a_input_max(_ek_){return user_attrib(_aP_,cst_max$1,_ek_)}
      var a_min=caml_call1(_aJ_,cst_min$0),_aQ_=C[7];
      function a_input_min(_ej_){return user_attrib(_aQ_,cst_min$1,_ej_)}
      function a_inputmode(x){return user_attrib(C[2],cst_inputmode,x)}
      function a_novalidate(_ei_){return constant_attrib(cst_novalidate,_ei_)}
      function a_open(_eh_){return constant_attrib(cst_open,_eh_)}
      var
       a_optimum=caml_call1(_aJ_,cst_optimum),
       a_pattern=caml_call1(_aL_,cst_pattern$0),
       a_placeholder=caml_call1(_aL_,cst_placeholder);
      function a_poster(_eg_){return uri_attrib(cst_poster,_eg_)}
      function a_preload(x){return user_attrib(C[2],cst_preload,x)}
      function a_pubdate(_ef_){return constant_attrib(cst_pubdate,_ef_)}
      var a_radiogroup=caml_call1(_aL_,cst_radiogroup);
      function a_required(_ee_){return constant_attrib(cst_required,_ee_)}
      function a_reversed(_ed_){return constant_attrib(cst_reserved,_ed_)}
      function a_sandbox(x){return user_attrib(C[12],cst_sandbox,x)}
      function a_spellcheck(sc){return bool_attrib(cst_spellcheck,sc)}
      function a_scoped(_ec_){return constant_attrib(cst_scoped,_ec_)}
      function a_seamless(_eb_){return constant_attrib(cst_seamless,_eb_)}
      function a_sizes(sizes){return user_attrib(C[13],cst_sizes,sizes)}
      var
       a_span=caml_call1(_aK_,cst_span),
       a_srclang=caml_call1(_aL_,cst_xml_lang$1);
      function a_srcset(_ea_){return srcset_attrib(cst_srcset,_ea_)}
      var
       a_img_sizes=caml_call1(_aN_,cst_sizes$0),
       a_start=caml_call1(_aK_,cst_start$0);
      function a_step(step){return user_attrib(C[15],cst_step,step)}
      function a_translate(x){return user_attrib(C[2],cst_translate$0,x)}
      function a_wrap(x){return user_attrib(C[2],cst_wrap$0,x)}
      var a_size=caml_call1(_aK_,cst_size);
      function a_input_type(it){return user_attrib(C[6],cst_type$5,it)}
      function a_menu_type(x){return user_attrib(C[2],cst_type$6,x)}
      function a_command_type(x){return user_attrib(C[2],cst_type$7,x)}
      function a_button_type(bt){return user_attrib(C[6],cst_type$8,bt)}
      function a_multiple(_d$_){return constant_attrib(cst_multiple,_d$_)}
      var
       a_cols=caml_call1(_aK_,cst_cols),
       a_rows=caml_call1(_aK_,cst_rows),
       a_summary=caml_call1(_aL_,cst_summary);
      function a_align(x){return user_attrib(C[2],cst_align,x)}
      var
       a_axis=caml_call1(_aL_,cst_axis),
       a_colspan=caml_call1(_aK_,cst_colspan),
       a_headers=caml_call1(_aM_,cst_headers),
       a_rowspan=caml_call1(_aK_,cst_rowspan);
      function a_scope(x){return user_attrib(C[2],cst_scope,x)}
      var a_border=caml_call1(_aK_,cst_border);
      function a_rules(x){return user_attrib(C[2],cst_rules,x)}
      function a_char(c){return user_attrib(C[5],cst_char,c)}
      function a_data(_d__){return uri_attrib(cst_data$1,_d__)}
      var a_codetype=caml_call1(_aL_,cst_codetype);
      function a_frameborder(x){return user_attrib(C[2],cst_frameborder,x)}
      var
       a_marginheight=caml_call1(_aK_,cst_marginheight),
       a_marginwidth=caml_call1(_aK_,cst_marginwidth);
      function a_scrolling(x){return user_attrib(C[2],cst_scrolling,x)}
      var
       a_target=caml_call1(_aL_,cst_target),
       a_content=caml_call1(_aL_,cst_content),
       a_http_equiv=caml_call1(_aL_,cst_http_equiv);
      function a_media(_d9_){return mediadesc_attrib(cst_media$0,_d9_)}
      var a_role=caml_call1(_aM_,cst_role);
      function a_aria(name)
       {return caml_call1(_aM_,caml_call2(Stdlib[28],cst_aria,name))}
      function terminal(tag,a,param){return caml_call2(Xml[20],a,tag)}
      function unary(tag,a,elt)
       {var _d8_=caml_call1(Xml[1][4],elt);
        return caml_call3(Xml[21],a,tag,_d8_)}
      function star(tag,a,elts){return caml_call3(Xml[21],a,tag,elts)}
      function plus(tag,a,elt,elts)
       {var _d7_=caml_call2(Xml[1][5],elt,elts);
        return caml_call3(Xml[21],a,tag,_d7_)}
      function option_cons(opt,elts)
       {if(opt){var x=opt[1];return caml_call2(Xml[1][5],x,elts)}return elts}
      function body(_d5_,_d6_){return star(cst_body,_d5_,_d6_)}
      function head(_d2_,_d3_,_d4_){return plus(cst_head,_d2_,_d3_,_d4_)}
      function title(_d0_,_d1_){return unary(cst_title$1,_d0_,_d1_)}
      function html(a,head,body)
       {var
         _dZ_=caml_call1(Xml[1][4],body),
         content=caml_call2(Xml[1][5],head,_dZ_);
        return caml_call3(Xml[21],a,cst_html$0,content)}
      function footer(_dX_,_dY_){return star(cst_footer,_dX_,_dY_)}
      function header(_dV_,_dW_){return star(cst_header,_dV_,_dW_)}
      function section(_dT_,_dU_){return star(cst_section,_dT_,_dU_)}
      function nav(_dR_,_dS_){return star(cst_nav,_dR_,_dS_)}
      function pcdata(s){return caml_call1(Xml[17],s)}
      var _aR_=Xml[19];
      function space(param){return caml_call1(_aR_,cst_nbsp)}
      var _aS_=Xml[22],_aT_=Xml[23],_aU_=Xml[24];
      function h1(_dP_,_dQ_){return star(cst_h1,_dP_,_dQ_)}
      function h2(_dN_,_dO_){return star(cst_h2,_dN_,_dO_)}
      function h3(_dL_,_dM_){return star(cst_h3,_dL_,_dM_)}
      function h4(_dJ_,_dK_){return star(cst_h4,_dJ_,_dK_)}
      function h5(_dH_,_dI_){return star(cst_h5,_dH_,_dI_)}
      function h6(_dF_,_dG_){return star(cst_h6,_dF_,_dG_)}
      function hgroup(_dD_,_dE_){return star(cst_hgroup,_dD_,_dE_)}
      function address(_dB_,_dC_){return star(cst_address,_dB_,_dC_)}
      function blockquote(_dz_,_dA_){return star(cst_blockquote,_dz_,_dA_)}
      function div(_dx_,_dy_){return star(cst_div,_dx_,_dy_)}
      function p(_dv_,_dw_){return star(cst_p,_dv_,_dw_)}
      function pre(_dt_,_du_){return star(cst_pre,_dt_,_du_)}
      function abbr(_dr_,_ds_){return star(cst_abbr,_dr_,_ds_)}
      function br(_dp_,_dq_){return terminal(cst_br,_dp_,_dq_)}
      function cite(_dn_,_do_){return star(cst_cite$0,_dn_,_do_)}
      function code(_dl_,_dm_){return star(cst_code,_dl_,_dm_)}
      function dfn(_dj_,_dk_){return star(cst_dfn,_dj_,_dk_)}
      function em(_dh_,_di_){return star(cst_em$0,_dh_,_di_)}
      function kbd(_df_,_dg_){return star(cst_kbd,_df_,_dg_)}
      function q(_dd_,_de_){return star(cst_q,_dd_,_de_)}
      function samp(_db_,_dc_){return star(cst_samp,_db_,_dc_)}
      function span(_c$_,_da_){return star(cst_span$0,_c$_,_da_)}
      function strong(_c9_,_c__){return star(cst_strong,_c9_,_c__)}
      function time(_c7_,_c8_){return star(cst_time,_c7_,_c8_)}
      function var$0(_c5_,_c6_){return star(cst_var,_c5_,_c6_)}
      function a(_c3_,_c4_){return star(cst_a$1,_c3_,_c4_)}
      function dl(_c1_,_c2_){return star(cst_dl,_c1_,_c2_)}
      function ol(_cZ_,_c0_){return star(cst_ol,_cZ_,_c0_)}
      function ul(_cX_,_cY_){return star(cst_ul,_cX_,_cY_)}
      function dd(_cV_,_cW_){return star(cst_dd,_cV_,_cW_)}
      function dt(_cT_,_cU_){return star(cst_dt,_cT_,_cU_)}
      function li(_cR_,_cS_){return star(cst_li,_cR_,_cS_)}
      function hr(_cP_,_cQ_){return terminal(cst_hr,_cP_,_cQ_)}
      function b(_cN_,_cO_){return star(cst_b$0,_cN_,_cO_)}
      function i(_cL_,_cM_){return star(cst_i,_cL_,_cM_)}
      function u(_cJ_,_cK_){return star(cst_u,_cJ_,_cK_)}
      function small(_cH_,_cI_){return star(cst_small,_cH_,_cI_)}
      function sub(_cF_,_cG_){return star(cst_sub,_cF_,_cG_)}
      function sup(_cD_,_cE_){return star(cst_sup,_cD_,_cE_)}
      function mark(_cB_,_cC_){return star(cst_mark,_cB_,_cC_)}
      function rp(_cz_,_cA_){return star(cst_rp,_cz_,_cA_)}
      function rt(_cx_,_cy_){return star(cst_rt,_cx_,_cy_)}
      function ruby(_cv_,_cw_){return star(cst_ruby,_cv_,_cw_)}
      function wbr(_ct_,_cu_){return terminal(cst_wbr,_ct_,_cu_)}
      function bdo(dir,opt,elts)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _cs_=[0,[0,a_dir(dir),a]];
        return caml_call3(Xml[21],_cs_,cst_bdo,elts)}
      var a_datetime=caml_call1(_aL_,cst_datetime);
      function a_shape(x){return user_attrib(C[2],cst_shape,x)}
      function a_coords(coords){return user_attrib(C[11],cst_coords,coords)}
      var a_usemap=caml_call1(_aL_,cst_usemap);
      function a_defer(_cr_){return constant_attrib(cst_defer,_cr_)}
      var a_label=caml_call1(_aL_,cst_label);
      function area(alt,opt,param)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _cq_=[0,[0,caml_call1(a_alt,alt),a]];
        return caml_call2(Xml[20],_cq_,cst_area)}
      function map(_co_,_cp_){return star(cst_map,_co_,_cp_)}
      function del(_cm_,_cn_){return star(cst_del,_cm_,_cn_)}
      function ins(_ck_,_cl_){return star(cst_ins,_ck_,_cl_)}
      function script(_ci_,_cj_){return unary(cst_script$0,_ci_,_cj_)}
      function noscript(_cg_,_ch_){return star(cst_noscript,_cg_,_ch_)}
      function template(_ce_,_cf_){return star(cst_template,_ce_,_cf_)}
      function article(_cc_,_cd_){return star(cst_article,_cc_,_cd_)}
      function aside(_ca_,_cb_){return star(cst_aside,_ca_,_cb_)}
      function main(_b__,_b$_){return star(cst_main,_b__,_b$_)}
      function video_audio(name,src,srcs,opt,elts)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        if(src)var uri=src[1],a$0=[0,a_src(uri),a];else var a$0=a;
        if(srcs)
         {var srcs$0=srcs[1],_b9_=caml_call2(Xml[1][6],srcs$0,elts);
          return caml_call3(Xml[21],[0,a$0],name,_b9_)}
        return caml_call3(Xml[21],[0,a$0],name,elts)}
      function audio(_b5_,_b6_,_b7_,_b8_)
       {return video_audio(cst_audio,_b5_,_b6_,_b7_,_b8_)}
      function video(_b1_,_b2_,_b3_,_b4_)
       {return video_audio(cst_video,_b1_,_b2_,_b3_,_b4_)}
      function canvas(_bZ_,_b0_){return star(cst_canvas,_bZ_,_b0_)}
      function command(label,opt,param)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _bY_=[0,[0,caml_call1(a_label,label),a]];
        return caml_call2(Xml[20],_bY_,cst_command)}
      function menu(children,a,param)
       {if(children)
         var match=children[1],l=match[2],children$0=l;
        else
         var children$0=caml_call1(Xml[1][3],0);
        return caml_call3(Xml[21],a,cst_menu,children$0)}
      function embed(_bW_,_bX_){return terminal(cst_embed,_bW_,_bX_)}
      function source(_bU_,_bV_){return terminal(cst_source,_bU_,_bV_)}
      function meter(_bS_,_bT_){return star(cst_meter,_bS_,_bT_)}
      function output_elt(_bQ_,_bR_){return star(cst_output,_bQ_,_bR_)}
      function form(_bO_,_bP_){return star(cst_form$0,_bO_,_bP_)}
      function svg(opt,children)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _bN_=caml_call2(Svg[242],[0,a],children);
        return caml_call1(Svg[324],_bN_)}
      function input(_bL_,_bM_){return terminal(cst_input,_bL_,_bM_)}
      function keygen(_bJ_,_bK_){return terminal(cst_keygen,_bJ_,_bK_)}
      function label(_bH_,_bI_){return star(cst_label$0,_bH_,_bI_)}
      function option(_bF_,_bG_){return unary(cst_option,_bF_,_bG_)}
      function select(_bD_,_bE_){return star(cst_select,_bD_,_bE_)}
      function textarea(_bB_,_bC_){return unary(cst_textarea,_bB_,_bC_)}
      function button(_bz_,_bA_){return star(cst_button,_bz_,_bA_)}
      function datalist(children,a,param)
       {if(children)
         var match=children[1],x=match[2],children$0=x;
        else
         var children$0=caml_call1(Xml[1][3],0);
        return caml_call3(Xml[21],a,cst_datalist,children$0)}
      function progress(_bx_,_by_){return star(cst_progress,_bx_,_by_)}
      function legend(_bv_,_bw_){return star(cst_legend,_bv_,_bw_)}
      function details(summary,a,children)
       {return plus(cst_details,a,summary,children)}
      function summary(_bt_,_bu_){return star(cst_summary$0,_bt_,_bu_)}
      function fieldset(legend,a,elts)
       {var _bs_=option_cons(legend,elts);
        return caml_call3(Xml[21],a,cst_fieldset,_bs_)}
      function optgroup(label,opt,elts)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _br_=[0,[0,caml_call1(a_label,label),a]];
        return caml_call3(Xml[21],_br_,cst_optgroup,elts)}
      function figcaption(_bp_,_bq_){return star(cst_figcaption,_bp_,_bq_)}
      function figure(figcaption,a,elts)
       {if(figcaption)
         {var _bm_=figcaption[1];
          if(437082891 <= _bm_[1])
           var
            c=_bm_[2],
            _bn_=caml_call1(Xml[1][4],c),
            _bo_=caml_call2(Xml[1][6],elts,_bn_);
          else
           var c$0=_bm_[2],_bo_=caml_call2(Xml[1][5],c$0,elts);
          var content=_bo_}
        else
         var content=elts;
        return caml_call3(Xml[21],a,cst_figure,content)}
      function caption(_bk_,_bl_){return star(cst_caption,_bk_,_bl_)}
      function table(caption,columns,thead,tfoot,a,elts)
       {var content=option_cons(thead,option_cons(tfoot,elts));
        if(columns)
         var
          columns$0=columns[1],
          content$0=caml_call2(Xml[1][6],columns$0,content);
        else
         var content$0=content;
        var content$1=option_cons(caption,content$0);
        return caml_call3(Xml[21],a,cst_table$0,content$1)}
      function td(_bi_,_bj_){return star(cst_td,_bi_,_bj_)}
      function th(_bg_,_bh_){return star(cst_th,_bg_,_bh_)}
      function tr(_be_,_bf_){return star(cst_tr,_be_,_bf_)}
      function colgroup(_bc_,_bd_){return star(cst_colgroup,_bc_,_bd_)}
      function col(_ba_,_bb_){return terminal(cst_col,_ba_,_bb_)}
      function thead(_a__,_a$_){return star(cst_thead,_a__,_a$_)}
      function tbody(_a8_,_a9_){return star(cst_tbody,_a8_,_a9_)}
      function tfoot(_a6_,_a7_){return star(cst_tfoot,_a6_,_a7_)}
      function iframe(_a4_,_a5_){return star(cst_iframe,_a4_,_a5_)}
      function object(params,opt,elts)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        if(params)
         var e=params[1],elts$0=caml_call2(Xml[1][6],e,elts);
        else
         var elts$0=elts;
        return caml_call3(Xml[21],[0,a],cst_object,elts$0)}
      function param(_a2_,_a3_){return terminal(cst_param,_a2_,_a3_)}
      function img(src,alt,opt,param)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _a1_=[0,caml_call1(a_alt,alt),a],a$0=[0,a_src(src),_a1_];
        return caml_call2(Xml[20],[0,a$0],cst_img)}
      function picture(img,a,elts)
       {var content=caml_call2(Xml[1][5],img,elts);
        return caml_call3(Xml[21],a,cst_picture,content)}
      function meta(_aZ_,_a0_){return terminal(cst_meta,_aZ_,_a0_)}
      function style(opt,elts)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        return caml_call3(Xml[21],[0,a],cst_style$2,elts)}
      function link(rel,href,opt,param)
       {if(opt)var sth=opt[1],a=sth;else var a=0;
        var _aX_=[0,a_href(href),a],_aY_=[0,[0,a_rel(rel),_aX_]];
        return caml_call2(Xml[20],_aY_,cst_link)}
      function base(_aV_,_aW_){return terminal(cst_base,_aV_,_aW_)}
      function tot(x){return x}
      function totl(x){return x}
      function toelt(x){return x}
      function toeltl(x){return x}
      function doc_toelt(x){return x}
      var I=_a_(Xml);
      function of_seq(s){return caml_call1(I[1],s)}
      function data(s){return caml_call1(Xml[18],s)}
      function leaf(tag,a,param){return caml_call2(Xml[20],a,tag)}
      function node(tag,a,elts){return caml_call3(Xml[21],a,tag,elts)}
      function coerce_elt(x){return x}
      var float_attrib=Xml[4],int_attrib=Xml[5],string_attrib=Xml[6];
      function uri_attrib$0(a,s){return caml_call2(Xml[13],a,s)}
      var
       space_sep_attrib=Xml[7],
       comma_sep_attrib=Xml[8],
       Unsafe=
        [0,
         data,
         leaf,
         node,
         coerce_elt,
         float_attrib,
         int_attrib,
         string_attrib,
         uri_attrib$0,
         space_sep_attrib,
         comma_sep_attrib];
      return [0,
              Xml,
              Info,
              _aH_,
              _aI_,
              to_xmlattribs,
              to_attrib,
              _aJ_,
              _aK_,
              _aL_,
              uri_attrib,
              _aM_,
              _aN_,
              user_attrib,
              bool_attrib,
              constant_attrib,
              linktypes_attrib,
              mediadesc_attrib,
              srcset_attrib,
              a_class,
              a_id,
              a_user_data,
              a_title,
              a_xml_lang,
              a_lang,
              a_style,
              a_property,
              a_onabort,
              a_onafterprint,
              a_onbeforeprint,
              a_onbeforeunload,
              a_onblur,
              a_oncanplay,
              a_oncanplaythrough,
              a_onchange,
              a_ondurationchange,
              a_onemptied,
              a_onended,
              a_onerror,
              a_onfocus,
              a_onformchange,
              a_onforminput,
              a_onhashchange,
              a_oninput,
              a_oninvalid,
              a_onoffline,
              a_ononline,
              a_onpause,
              a_onplay,
              a_onplaying,
              a_onpagehide,
              a_onpageshow,
              a_onpopstate,
              a_onprogress,
              a_onratechange,
              a_onreadystatechange,
              a_onredo,
              a_onresize,
              a_onscroll,
              a_onseeked,
              a_onseeking,
              a_onselect,
              a_onshow,
              a_onstalled,
              a_onstorage,
              a_onsubmit,
              a_onsuspend,
              a_ontimeupdate,
              a_onundo,
              a_onunload,
              a_onvolumechange,
              a_onwaiting,
              a_onload,
              a_onloadeddata,
              a_onloadedmetadata,
              a_onloadstart,
              a_onmessage,
              a_onmousewheel,
              a_onclick,
              a_oncontextmenu,
              a_ondblclick,
              a_ondrag,
              a_ondragend,
              a_ondragenter,
              a_ondragleave,
              a_ondragover,
              a_ondragstart,
              a_ondrop,
              a_onmousedown,
              a_onmouseup,
              a_onmouseover,
              a_onmousemove,
              a_onmouseout,
              a_ontouchstart,
              a_ontouchend,
              a_ontouchmove,
              a_ontouchcancel,
              a_onkeypress,
              a_onkeydown,
              a_onkeyup,
              a_version,
              a_xmlns,
              a_manifest,
              a_cite,
              a_xml_space,
              a_accesskey,
              a_charset,
              a_accept_charset,
              a_accept,
              a_href,
              a_hreflang,
              a_download,
              a_rel,
              a_tabindex,
              a_mime_type,
              a_alt,
              a_height,
              a_src,
              a_width,
              a_for,
              a_for,
              a_for_list,
              a_for_list,
              a_selected,
              a_text_value,
              a_int_value,
              a_value,
              a_float_value,
              a_action,
              a_formmethod,
              a_formmethod,
              a_enctype,
              a_checked,
              a_disabled,
              a_readonly,
              a_maxlength,
              a_minlength,
              a_name,
              a_allowfullscreen,
              a_allowpaymentrequest,
              a_referrerpolicy,
              a_autocomplete,
              a_async,
              a_autofocus,
              a_autoplay,
              a_muted,
              a_crossorigin,
              a_integrity,
              a_mediagroup,
              a_challenge,
              a_contenteditable,
              a_contextmenu,
              a_controls,
              a_dir,
              a_draggable,
              a_form,
              a_formaction,
              a_formenctype,
              a_formnovalidate,
              a_formtarget,
              a_hidden,
              a_high,
              a_icon,
              a_ismap,
              a_keytype,
              a_list,
              a_loop,
              a_low,
              a_max,
              a_input_max,
              a_min,
              a_input_min,
              a_inputmode,
              a_novalidate,
              a_open,
              a_optimum,
              a_pattern,
              a_placeholder,
              a_poster,
              a_preload,
              a_pubdate,
              a_radiogroup,
              a_required,
              a_reversed,
              a_sandbox,
              a_spellcheck,
              a_scoped,
              a_seamless,
              a_sizes,
              a_span,
              a_srclang,
              a_srcset,
              a_img_sizes,
              a_start,
              a_step,
              a_translate,
              a_wrap,
              a_size,
              a_input_type,
              a_menu_type,
              a_command_type,
              a_button_type,
              a_multiple,
              a_cols,
              a_rows,
              a_summary,
              a_align,
              a_axis,
              a_colspan,
              a_headers,
              a_rowspan,
              a_scope,
              a_border,
              a_rules,
              a_char,
              a_data,
              a_codetype,
              a_frameborder,
              a_marginheight,
              a_marginwidth,
              a_scrolling,
              a_target,
              a_content,
              a_http_equiv,
              a_media,
              a_role,
              a_aria,
              terminal,
              unary,
              star,
              plus,
              option_cons,
              body,
              head,
              title,
              html,
              footer,
              header,
              section,
              nav,
              pcdata,
              pcdata,
              _aR_,
              space,
              _aS_,
              _aT_,
              _aU_,
              h1,
              h2,
              h3,
              h4,
              h5,
              h6,
              hgroup,
              address,
              blockquote,
              div,
              p,
              pre,
              abbr,
              br,
              cite,
              code,
              dfn,
              em,
              kbd,
              q,
              samp,
              span,
              strong,
              time,
              var$0,
              a,
              dl,
              ol,
              ul,
              dd,
              dt,
              li,
              hr,
              b,
              i,
              u,
              small,
              sub,
              sup,
              mark,
              rp,
              rt,
              ruby,
              wbr,
              bdo,
              a_datetime,
              a_shape,
              a_coords,
              a_usemap,
              a_defer,
              a_label,
              area,
              map,
              del,
              ins,
              script,
              noscript,
              template,
              article,
              aside,
              main,
              video_audio,
              audio,
              video,
              canvas,
              command,
              menu,
              embed,
              source,
              meter,
              output_elt,
              form,
              svg,
              input,
              keygen,
              label,
              option,
              select,
              textarea,
              button,
              datalist,
              progress,
              legend,
              details,
              summary,
              fieldset,
              optgroup,
              figcaption,
              figure,
              caption,
              table,
              table,
              td,
              th,
              tr,
              colgroup,
              col,
              thead,
              tbody,
              tfoot,
              iframe,
              object,
              param,
              img,
              picture,
              meta,
              style,
              link,
              base,
              tot,
              totl,
              toelt,
              toeltl,
              doc_toelt,
              I,
              of_seq,
              Unsafe]}
    function Wrapped_functions$0(Xml)
     {function string_of_sandbox_token(param)
       {return -177579325 <= param
                ?642066717 <= param
                  ?961985737 <= param?cst_allow_same_origin:cst_allow_popups
                  :-141440231 <= param?cst_allow_forms:cst_allow_pointer_lock
                :-237921695 <= param?cst_allow_script:cst_allow_top_navigation}
      function string_of_linktype(param)
       {if(typeof param === "number")
         return 381789656 <= param
                 ?814486425 <= param
                   ?870035731 <= param
                     ?1021867988 <= param
                       ?1026883179 <= param?cst_external:cst_canonical
                       :892857107 <= param?cst_prev:cst_next
                     :847656566 <= param?cst_last:cst_icon$0
                   :395967329 <= param
                     ?693914176 <= param
                       ?803495649 <= param?cst_help:cst_noreferrer
                       :672161451 <= param?cst_author:cst_license
                     :395056008 <= param?cst_search:cst_noopener
                 :-289155950 <= param
                   ?19067 <= param
                     ?212027606 <= param
                       ?332064784 <= param?cst_first:cst_bookmark
                       :4198970 <= param?cst_tag:cst_up
                     :-123098695 <= param?cst_pingback:cst_nofollow
                   :-837966724 <= param
                     ?-687429350 <= param
                       ?-543567890 <= param?cst_stylesheet:cst_alternate
                       :-784200974 <= param?cst_index:cst_sidebar
                     :-954191215 <= param?cst_archives:cst_prefetch;
        var s=param[2];
        return s}
      function string_of_mediadesc_token(param)
       {if(typeof param === "number")
         return 3256577 <= param
                 ?67844052 <= param
                   ?985170249 <= param
                     ?993823919 <= param?cst_projection:cst_aural
                     :741408196 <= param?cst_handheld:cst_embossed
                   :4203225 <= param?cst_tty:cst_all
                 :-321929715 === param
                   ?cst_braille
                   :-68046964 <= param
                     ?18850 <= param?cst_tv:cst_screen$0
                     :-275811774 <= param?cst_speech:cst_print;
        var s=param[2];
        return s}
      function string_of_referrerpolicy(param)
       {return 128179133 <= param
                ?516162486 === param
                  ?cst_unsafe_url
                  :880519217 <= param
                    ?1065162943 <= param
                      ?cst_same_origin
                      :cst_origin_when_cross_origin
                    :808133042 <= param
                      ?cst_no_referrer_when_downgrade
                      :cst_no_referrer
                :-6975994 <= param
                  ?50834029 <= param?cst$39:cst_origin
                  :-512964804 <= param
                    ?cst_strict_origin
                    :cst_strict_origin_when_cross_o}
      function string_of_big_variant(param)
       {if(typeof param === "number")
         return 4448519 <= param
                 ?748545107 <= param
                   ?892709484 <= param
                     ?936387931 <= param
                       ?984475830 <= param
                         ?1003109192 <= param
                           ?1026883179 <= param?cst_external$0:cst_0
                           :995986491 <= param?cst_formnovalidate$0:cst_audio$0
                         :936573133 === param
                           ?cst_text$0
                           :963342108 <= param?cst_async$0:cst_toolbar
                       :892857107 <= param
                         ?914891065 <= param
                           ?925976842 <= param?cst_soft:cst_rows$0
                           :914389316 <= param?cst_rect$0:cst_prev$0
                         :892711040 <= param?cst_POST:cst_poly
                     :847852583 <= param
                       ?870035731 <= param
                         ?874830961 <= param
                           ?881668074 <= param?cst_open$0:cst_decimal
                           :870530776 <= param?cst_none$2:cst_next$0
                         :848351876 <= param?cst_loop$0:cst_left
                       :803495649 <= param
                         ?836565865 <= param
                           ?847656566 <= param?cst_last$0:cst_kana
                           :814486425 <= param?cst_icon$1:cst_help$0
                         :803298059 <= param?cst_hard:cst_cols$0
                   :306241015 <= param
                     ?475573507 <= param
                       ?672161451 <= param
                         ?726666127 <= param
                           ?748194550 <= param?cst_char$0:cst_auto$3
                           :693914176 <= param?cst_noreferrer$0:cst_author$0
                         :596180811 <= param?cst_muted$0:cst_autoplay$0
                       :395056008 <= param
                         ?432776079 <= param
                           ?434500685 <= param?cst_anonymous:cst_metadata$0
                           :395967329 <= param?cst_license$0:cst_search$0
                         :332064784 <= param?cst_first$0:cst_novalidate$0
                     :140750597 <= param
                       ?186574459 <= param
                         ?212027606 <= param
                           ?292438678 <= param?cst_controls$0:cst_bookmark$0
                           :202657151 <= param?cst_required$0:cst_selected$0
                         :178382384 <= param?cst_circle$0:cst_rowgroup
                       :48900580 <= param
                         ?95509868 <= param
                           ?111644259 <= param?cst_checkbox:cst_katakana
                           :50085628 <= param?cst_email:cst_latin
                         :19559306 <= param?cst_hidden$0:cst_yes
                 :-363872942 <= param
                   ?19067 <= param
                     ?3953222 <= param
                       ?4103754 <= param
                         ?4199867 <= param
                           ?4252495 <= param?cst_url:cst_tel
                           :4198970 <= param?cst_tag$0:cst_rtl
                         :4102650 <= param?cst_row:cst_1
                       :3257036 <= param
                         ?3553398 <= param
                           ?3805386 <= param?cst_ltr:cst_GET
                           :3356704 <= param?cst_col$0:cst_any
                         :3256577 <= param?cst_all$0:cst_up$0
                     :-146439973 <= param
                       ?-116258131 <= param
                         ?-57574468 <= param
                           ?17505 <= param?cst_no:cst_right
                           :-100768656 <= param?cst_scoped$0:cst_numeric
                         :-123098695 <= param?cst_pingback$0:cst_radio
                       :-247853591 <= param
                         ?-197222864 <= param
                           ?-165772469 <= param?cst_pubdate$0:cst_multiple$0
                           :-200275514 <= param?cst_latin_name:cst_autofocus$0
                         :-289155950 <= param?cst_nofollow$0:cst_defer$0
                   :-773209244 <= param
                     ?-543567890 <= param
                       ?-514572330 <= param
                         ?-384499551 <= param
                           ?-369291781 <= param?cst_full_width_latin:cst_default$0
                           :-423051825 <= param?cst_context:cst_verbatim
                         :-529147129 <= param?cst_checked$0:cst_stylesheet$0
                       :-709493348 <= param
                         ?-687429350 <= param
                           ?-613973726 <= param?cst_reserved$0:cst_alternate$0
                           :-707104822 <= param
                             ?cst_http_www_w3_org_1999_xhtml
                             :cst_disabled$0
                         :-728306478 <= param?cst_ismap$0:cst_use_credentials
                     :-872161756 <= param
                       ?-826369749 <= param
                         ?-788068560 <= param
                           ?-784200974 <= param?cst_index$0:cst_justify
                           :-792946572 <= param?cst_groups:cst_command$0
                         :-837966724 <= param?cst_sidebar$0:cst_latin_prose
                       :-967956361 <= param
                         ?-931002593 <= param
                           ?-883155966 <= param?cst_readonly$0:cst_colgroup$0
                           :-954191215 <= param?cst_archives$0:cst_seamless$0
                         :-1000861353 <= param?cst_prefetch$0:cst_preserve$0;
        var s=param[2];
        return s}
      function string_of_input_type(param)
       {return 50085628 <= param
                ?612668487 <= param
                  ?781515420 <= param
                    ?936769581 <= param
                      ?969837588 <= param?cst_week:cst_time$0
                      :936573133 <= param?cst_text$1:cst_file
                    :758940238 <= param?cst_date:cst_datetime_local
                  :242538002 <= param
                    ?529348384 <= param
                      ?578936635 <= param?cst_password:cst_month
                      :395056008 <= param?cst_search$1:cst_button$0
                    :111644259 <= param?cst_checkbox$0:cst_email$0
                :-146439973 <= param
                  ?-101336657 <= param
                    ?4252495 <= param
                      ?19559306 <= param?cst_hidden$1:cst_url$0
                      :4199867 <= param?cst_tel$0:cst_reset
                    :-145943139 <= param?cst_range:cst_radio$0
                  :-795439301 <= param
                    ?-578166461 <= param
                      ?-528289822 <= param?cst_readonly$1:cst_color
                      :-703661335 <= param?cst_number:cst_image$0
                    :-828715976 <= param?cst_submit:cst_datetime$0}
      function string_of_number_or_datetime(param)
       {if(-703661335 <= param[1])
         {var n=param[2];return caml_call1(Stdlib[33],n)}
        var t=param[2];
        return t}
      var
       string_of_character=caml_call1(Stdlib_String[1],1),
       string_of_number$0=Stdlib[33],
       string_of_bool=Stdlib[30];
      function onoff_of_bool(param){return param?cst_on:cst_off}
      function unoption_string(param)
       {if(param){var x=param[1];return x}return cst$40}
      function string_of_step(param)
       {if(param){var x=param[1];return string_of_number(x)}return cst_any$0}
      function string_of_sizes(param)
       {if(param)
         {var
           l=param[1],
           _aF_=
            function(param)
             {var y=param[2],x=param[1];
              return caml_call3(Stdlib_Printf[4],_ae_,x,y)},
           _aG_=caml_call2(Stdlib_List[19],_aF_,l);
          return caml_call2(Stdlib_String[6],cst$41,_aG_)}
        return cst_any$1}
      function string_of_sandbox(l)
       {var _aE_=caml_call2(Stdlib_List[19],string_of_sandbox_token,l);
        return caml_call2(Stdlib_String[6],cst$42,_aE_)}
      function string_of_numbers(l)
       {var _aD_=caml_call2(Stdlib_List[19],string_of_number$0,l);
        return caml_call2(Stdlib_String[6],cst$43,_aD_)}
      function string_of_mediadesc(l)
       {var _aC_=caml_call2(Stdlib_List[19],string_of_mediadesc_token,l);
        return caml_call2(Stdlib_String[6],cst$44,_aC_)}
      function string_of_linktypes(l)
       {var _aB_=caml_call2(Stdlib_List[19],string_of_linktype,l);
        return caml_call2(Stdlib_String[6],cst$45,_aB_)}
      function string_of_srcset(l)
       {function f(param)
         {var _aw_=param[1];
          if(-738802218 === _aw_)
           {var
             match=param[2],
             v=match[2],
             url=match[1],
             _ax_=caml_call1(string_of_number$0,v),
             _ay_=caml_call1(Xml[2],url);
            return caml_call3(Stdlib_Printf[4],_af_,_ay_,_ax_)}
          if(4252495 <= _aw_)
           {var url$0=param[2];return caml_call1(Xml[2],url$0)}
          var
           match$0=param[2],
           v$0=match$0[2],
           url$1=match$0[1],
           _az_=string_of_number(v$0),
           _aA_=caml_call1(Xml[2],url$1);
          return caml_call3(Stdlib_Printf[4],_ag_,_aA_,_az_)}
        var _av_=caml_call2(Stdlib_List[19],f,l);
        return caml_call2(Stdlib_String[6],cst$46,_av_)}
      return [0,
              Xml,
              string_of_sandbox_token,
              string_of_linktype,
              string_of_mediadesc_token,
              string_of_referrerpolicy,
              string_of_big_variant,
              string_of_input_type,
              string_of_number_or_datetime,
              string_of_character,
              string_of_number$0,
              string_of_bool,
              onoff_of_bool,
              unoption_string,
              string_of_step,
              string_of_sizes,
              string_of_sandbox,
              string_of_numbers,
              string_of_mediadesc,
              string_of_linktypes,
              string_of_srcset]}
    function _ah_(_as_,_ar_,_aq_)
     {var _at_=Make_with_wrapped_functions$0(_as_,_ar_,_aq_),_au_=_at_[363];
      return [0,
              _at_[1],
              _at_[2],
              _at_[3],
              _at_[4],
              _at_[19],
              _at_[21],
              _at_[20],
              _at_[22],
              _at_[23],
              _at_[24],
              _at_[27],
              _at_[28],
              _at_[29],
              _at_[30],
              _at_[31],
              _at_[32],
              _at_[33],
              _at_[34],
              _at_[35],
              _at_[36],
              _at_[37],
              _at_[38],
              _at_[39],
              _at_[40],
              _at_[41],
              _at_[42],
              _at_[43],
              _at_[44],
              _at_[77],
              _at_[45],
              _at_[46],
              _at_[47],
              _at_[48],
              _at_[49],
              _at_[50],
              _at_[51],
              _at_[52],
              _at_[53],
              _at_[54],
              _at_[55],
              _at_[56],
              _at_[57],
              _at_[58],
              _at_[59],
              _at_[60],
              _at_[61],
              _at_[62],
              _at_[63],
              _at_[64],
              _at_[65],
              _at_[66],
              _at_[67],
              _at_[68],
              _at_[69],
              _at_[70],
              _at_[71],
              _at_[72],
              _at_[73],
              _at_[74],
              _at_[75],
              _at_[76],
              _at_[78],
              _at_[79],
              _at_[80],
              _at_[81],
              _at_[82],
              _at_[83],
              _at_[84],
              _at_[85],
              _at_[86],
              _at_[87],
              _at_[88],
              _at_[89],
              _at_[90],
              _at_[91],
              _at_[92],
              _at_[93],
              _at_[94],
              _at_[95],
              _at_[96],
              _at_[97],
              _at_[98],
              _at_[99],
              _at_[138],
              _at_[139],
              _at_[141],
              _at_[142],
              _at_[143],
              _at_[144],
              _at_[145],
              _at_[146],
              _at_[147],
              _at_[148],
              _at_[149],
              _at_[150],
              _at_[151],
              _at_[152],
              _at_[153],
              _at_[154],
              _at_[155],
              _at_[156],
              _at_[157],
              _at_[158],
              _at_[159],
              _at_[160],
              _at_[161],
              _at_[162],
              _at_[163],
              _at_[164],
              _at_[165],
              _at_[166],
              _at_[167],
              _at_[168],
              _at_[169],
              _at_[170],
              _at_[171],
              _at_[172],
              _at_[173],
              _at_[174],
              _at_[175],
              _at_[176],
              _at_[177],
              _at_[178],
              _at_[179],
              _at_[180],
              _at_[181],
              _at_[140],
              _at_[182],
              _at_[183],
              _at_[184],
              _at_[185],
              _at_[186],
              _at_[187],
              _at_[188],
              _at_[189],
              _at_[190],
              _at_[191],
              _at_[192],
              _at_[193],
              _at_[194],
              _at_[195],
              _at_[196],
              _at_[100],
              _at_[101],
              _at_[102],
              _at_[103],
              _at_[104],
              _at_[105],
              _at_[106],
              _at_[107],
              _at_[108],
              _at_[109],
              _at_[110],
              _at_[111],
              _at_[112],
              _at_[113],
              _at_[114],
              _at_[292],
              _at_[128],
              _at_[132],
              _at_[203],
              _at_[131],
              _at_[119],
              _at_[120],
              _at_[121],
              _at_[122],
              _at_[135],
              _at_[136],
              _at_[129],
              _at_[130],
              _at_[202],
              _at_[137],
              _at_[204],
              _at_[123],
              _at_[197],
              _at_[117],
              _at_[198],
              _at_[124],
              _at_[125],
              _at_[126],
              _at_[127],
              _at_[133],
              _at_[134],
              _at_[201],
              _at_[200],
              _at_[199],
              _at_[297],
              _at_[206],
              _at_[207],
              _at_[208],
              _at_[209],
              _at_[210],
              _at_[211],
              _at_[205],
              _at_[212],
              _at_[213],
              _at_[214],
              _at_[115],
              _at_[116],
              _at_[118],
              _at_[293],
              _at_[294],
              _at_[295],
              _at_[215],
              _at_[216],
              _at_[217],
              _at_[218],
              _at_[219],
              _at_[220],
              _at_[221],
              _at_[222],
              _at_[223],
              _at_[296],
              _at_[224],
              _at_[25],
              _at_[26],
              _at_[225],
              _at_[226],
              _at_[240],
              _at_[235],
              _at_[233],
              _at_[355],
              _at_[234],
              _at_[232],
              _at_[319],
              _at_[236],
              _at_[237],
              _at_[238],
              _at_[239],
              _at_[247],
              _at_[248],
              _at_[249],
              _at_[250],
              _at_[251],
              _at_[252],
              _at_[253],
              _at_[254],
              _at_[305],
              _at_[306],
              _at_[307],
              _at_[257],
              _at_[258],
              _at_[255],
              _at_[256],
              _at_[273],
              _at_[274],
              _at_[275],
              _at_[276],
              _at_[277],
              _at_[278],
              _at_[334],
              _at_[335],
              _at_[279],
              _at_[280],
              _at_[281],
              _at_[282],
              _at_[283],
              _at_[284],
              _at_[285],
              _at_[286],
              _at_[290],
              _at_[291],
              _at_[259],
              _at_[260],
              _at_[261],
              _at_[262],
              _at_[263],
              _at_[264],
              _at_[265],
              _at_[266],
              _at_[267],
              _at_[268],
              _at_[269],
              _at_[270],
              _at_[271],
              _at_[272],
              _at_[300],
              _at_[301],
              _at_[350],
              _at_[351],
              _at_[347],
              _at_[348],
              _at_[349],
              _at_[314],
              _at_[309],
              _at_[310],
              _at_[311],
              _at_[315],
              _at_[298],
              _at_[299],
              _at_[336],
              _at_[338],
              _at_[337],
              _at_[342],
              _at_[343],
              _at_[344],
              _at_[345],
              _at_[346],
              _at_[339],
              _at_[340],
              _at_[341],
              _at_[318],
              _at_[332],
              _at_[329],
              _at_[322],
              _at_[320],
              _at_[326],
              _at_[324],
              _at_[327],
              _at_[333],
              _at_[323],
              _at_[325],
              _at_[321],
              _at_[328],
              _at_[316],
              _at_[317],
              _at_[242],
              _at_[243],
              _at_[244],
              _at_[245],
              _at_[246],
              _at_[330],
              _at_[331],
              _at_[312],
              _at_[313],
              _at_[302],
              _at_[303],
              _at_[304],
              _at_[352],
              _at_[353],
              _at_[354],
              _at_[288],
              _at_[287],
              _at_[289],
              _at_[241],
              _at_[362],
              _at_[356],
              _at_[357],
              _at_[358],
              _at_[359],
              _at_[360],
              _at_[5],
              _at_[6],
              [0,
               _au_[1],
               _au_[3],
               _au_[2],
               _au_[4],
               _au_[7],
               _au_[5],
               _au_[6],
               _au_[8],
               _au_[9],
               _au_[10]]]}
    function _ai_(_ao_)
     {var _ap_=Wrapped_functions$0(_ao_);
      return [0,
              _ap_[1],
              _ap_[6],
              _ap_[11],
              _ap_[12],
              _ap_[9],
              _ap_[7],
              _ap_[8],
              _ap_[19],
              _ap_[18],
              _ap_[5],
              _ap_[17],
              _ap_[16],
              _ap_[15],
              _ap_[20],
              _ap_[14],
              _ap_[13]]}
    var
     Html_f=
      [0,
       function(_al_,_ak_)
        {var
          _aj_=Wrapped_functions$0(_al_),
          _an_=
           Make_with_wrapped_functions$0
            (_al_,
             [0,
              _aj_[1],
              _aj_[6],
              _aj_[11],
              _aj_[12],
              _aj_[9],
              _aj_[7],
              _aj_[8],
              _aj_[19],
              _aj_[18],
              _aj_[5],
              _aj_[17],
              _aj_[16],
              _aj_[15],
              _aj_[20],
              _aj_[14],
              _aj_[13]],
             _ak_),
          _am_=_an_[363];
         return [0,
                 _an_[1],
                 _an_[2],
                 _an_[3],
                 _an_[4],
                 _an_[19],
                 _an_[21],
                 _an_[20],
                 _an_[22],
                 _an_[23],
                 _an_[24],
                 _an_[27],
                 _an_[28],
                 _an_[29],
                 _an_[30],
                 _an_[31],
                 _an_[32],
                 _an_[33],
                 _an_[34],
                 _an_[35],
                 _an_[36],
                 _an_[37],
                 _an_[38],
                 _an_[39],
                 _an_[40],
                 _an_[41],
                 _an_[42],
                 _an_[43],
                 _an_[44],
                 _an_[77],
                 _an_[45],
                 _an_[46],
                 _an_[47],
                 _an_[48],
                 _an_[49],
                 _an_[50],
                 _an_[51],
                 _an_[52],
                 _an_[53],
                 _an_[54],
                 _an_[55],
                 _an_[56],
                 _an_[57],
                 _an_[58],
                 _an_[59],
                 _an_[60],
                 _an_[61],
                 _an_[62],
                 _an_[63],
                 _an_[64],
                 _an_[65],
                 _an_[66],
                 _an_[67],
                 _an_[68],
                 _an_[69],
                 _an_[70],
                 _an_[71],
                 _an_[72],
                 _an_[73],
                 _an_[74],
                 _an_[75],
                 _an_[76],
                 _an_[78],
                 _an_[79],
                 _an_[80],
                 _an_[81],
                 _an_[82],
                 _an_[83],
                 _an_[84],
                 _an_[85],
                 _an_[86],
                 _an_[87],
                 _an_[88],
                 _an_[89],
                 _an_[90],
                 _an_[91],
                 _an_[92],
                 _an_[93],
                 _an_[94],
                 _an_[95],
                 _an_[96],
                 _an_[97],
                 _an_[98],
                 _an_[99],
                 _an_[138],
                 _an_[139],
                 _an_[141],
                 _an_[142],
                 _an_[143],
                 _an_[144],
                 _an_[145],
                 _an_[146],
                 _an_[147],
                 _an_[148],
                 _an_[149],
                 _an_[150],
                 _an_[151],
                 _an_[152],
                 _an_[153],
                 _an_[154],
                 _an_[155],
                 _an_[156],
                 _an_[157],
                 _an_[158],
                 _an_[159],
                 _an_[160],
                 _an_[161],
                 _an_[162],
                 _an_[163],
                 _an_[164],
                 _an_[165],
                 _an_[166],
                 _an_[167],
                 _an_[168],
                 _an_[169],
                 _an_[170],
                 _an_[171],
                 _an_[172],
                 _an_[173],
                 _an_[174],
                 _an_[175],
                 _an_[176],
                 _an_[177],
                 _an_[178],
                 _an_[179],
                 _an_[180],
                 _an_[181],
                 _an_[140],
                 _an_[182],
                 _an_[183],
                 _an_[184],
                 _an_[185],
                 _an_[186],
                 _an_[187],
                 _an_[188],
                 _an_[189],
                 _an_[190],
                 _an_[191],
                 _an_[192],
                 _an_[193],
                 _an_[194],
                 _an_[195],
                 _an_[196],
                 _an_[100],
                 _an_[101],
                 _an_[102],
                 _an_[103],
                 _an_[104],
                 _an_[105],
                 _an_[106],
                 _an_[107],
                 _an_[108],
                 _an_[109],
                 _an_[110],
                 _an_[111],
                 _an_[112],
                 _an_[113],
                 _an_[114],
                 _an_[292],
                 _an_[128],
                 _an_[132],
                 _an_[203],
                 _an_[131],
                 _an_[119],
                 _an_[120],
                 _an_[121],
                 _an_[122],
                 _an_[135],
                 _an_[136],
                 _an_[129],
                 _an_[130],
                 _an_[202],
                 _an_[137],
                 _an_[204],
                 _an_[123],
                 _an_[197],
                 _an_[117],
                 _an_[198],
                 _an_[124],
                 _an_[125],
                 _an_[126],
                 _an_[127],
                 _an_[133],
                 _an_[134],
                 _an_[201],
                 _an_[200],
                 _an_[199],
                 _an_[297],
                 _an_[206],
                 _an_[207],
                 _an_[208],
                 _an_[209],
                 _an_[210],
                 _an_[211],
                 _an_[205],
                 _an_[212],
                 _an_[213],
                 _an_[214],
                 _an_[115],
                 _an_[116],
                 _an_[118],
                 _an_[293],
                 _an_[294],
                 _an_[295],
                 _an_[215],
                 _an_[216],
                 _an_[217],
                 _an_[218],
                 _an_[219],
                 _an_[220],
                 _an_[221],
                 _an_[222],
                 _an_[223],
                 _an_[296],
                 _an_[224],
                 _an_[25],
                 _an_[26],
                 _an_[225],
                 _an_[226],
                 _an_[240],
                 _an_[235],
                 _an_[233],
                 _an_[355],
                 _an_[234],
                 _an_[232],
                 _an_[319],
                 _an_[236],
                 _an_[237],
                 _an_[238],
                 _an_[239],
                 _an_[247],
                 _an_[248],
                 _an_[249],
                 _an_[250],
                 _an_[251],
                 _an_[252],
                 _an_[253],
                 _an_[254],
                 _an_[305],
                 _an_[306],
                 _an_[307],
                 _an_[257],
                 _an_[258],
                 _an_[255],
                 _an_[256],
                 _an_[273],
                 _an_[274],
                 _an_[275],
                 _an_[276],
                 _an_[277],
                 _an_[278],
                 _an_[334],
                 _an_[335],
                 _an_[279],
                 _an_[280],
                 _an_[281],
                 _an_[282],
                 _an_[283],
                 _an_[284],
                 _an_[285],
                 _an_[286],
                 _an_[290],
                 _an_[291],
                 _an_[259],
                 _an_[260],
                 _an_[261],
                 _an_[262],
                 _an_[263],
                 _an_[264],
                 _an_[265],
                 _an_[266],
                 _an_[267],
                 _an_[268],
                 _an_[269],
                 _an_[270],
                 _an_[271],
                 _an_[272],
                 _an_[300],
                 _an_[301],
                 _an_[350],
                 _an_[351],
                 _an_[347],
                 _an_[348],
                 _an_[349],
                 _an_[314],
                 _an_[309],
                 _an_[310],
                 _an_[311],
                 _an_[315],
                 _an_[298],
                 _an_[299],
                 _an_[336],
                 _an_[338],
                 _an_[337],
                 _an_[342],
                 _an_[343],
                 _an_[344],
                 _an_[345],
                 _an_[346],
                 _an_[339],
                 _an_[340],
                 _an_[341],
                 _an_[318],
                 _an_[332],
                 _an_[329],
                 _an_[322],
                 _an_[320],
                 _an_[326],
                 _an_[324],
                 _an_[327],
                 _an_[333],
                 _an_[323],
                 _an_[325],
                 _an_[321],
                 _an_[328],
                 _an_[316],
                 _an_[317],
                 _an_[242],
                 _an_[243],
                 _an_[244],
                 _an_[245],
                 _an_[246],
                 _an_[330],
                 _an_[331],
                 _an_[312],
                 _an_[313],
                 _an_[302],
                 _an_[303],
                 _an_[304],
                 _an_[352],
                 _an_[353],
                 _an_[354],
                 _an_[288],
                 _an_[287],
                 _an_[289],
                 _an_[241],
                 _an_[362],
                 _an_[356],
                 _an_[357],
                 _an_[358],
                 _an_[359],
                 _an_[360],
                 _an_[5],
                 _an_[6],
                 [0,
                  _am_[1],
                  _am_[3],
                  _am_[2],
                  _am_[4],
                  _am_[7],
                  _am_[5],
                  _am_[6],
                  _am_[8],
                  _am_[9],
                  _am_[10]]]},
       _ai_,
       _ah_];
    caml_register_global(1102,Html_f,"Html_f");
    return}
  (globalThis));


//# 1 "../.js/tyxml/tyxml.cma.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_register_global=runtime.caml_register_global,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call4(f,a0,a1,a2,a3)
     {return f.length == 4
              ?f(a0,a1,a2,a3)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3])}
    function caml_call6(f,a0,a1,a2,a3,a4,a5)
     {return f.length == 6
              ?f(a0,a1,a2,a3,a4,a5)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4,a5])}
    var
     global_data=runtime.caml_get_global_data(),
     cst$0=caml_string_of_jsbytes(""),
     cst=caml_string_of_jsbytes(""),
     cst$1=caml_string_of_jsbytes(""),
     cst_CDATA=caml_string_of_jsbytes("<![CDATA["),
     cst$2=caml_string_of_jsbytes("//"),
     cst_CDATA$0=caml_string_of_jsbytes("//<![CDATA["),
     cst$3=caml_string_of_jsbytes("/*  */"),
     cst_CDATA$1=caml_string_of_jsbytes("/* <![CDATA[ */"),
     Stdlib_Format=global_data.Stdlib__Format,
     Re=global_data.Re,
     Stdlib_Printf=global_data.Stdlib__Printf,
     Xml_wrap=global_data.Xml_wrap,
     Xml_print=global_data.Xml_print,
     Xml_iter=global_data.Xml_iter,
     Xml_stream=global_data.Xml_stream,
     Svg_f=global_data.Svg_f,
     Html_f=global_data.Html_f,
     _b_=[0,1],
     _c_=
      [0,
       [12,10,[2,0,[12,10,[2,0,[12,10,[2,0,[12,10,0]]]]]]],
       caml_string_of_jsbytes("\n%s\n%s\n%s\n")];
    function uri_of_string(s){return s}
    function string_of_uri(s){return s}
    function acontent(param){var a=param[2];return a}
    function aname(param){var name=param[1];return name}
    function float_attrib(name,value){return [0,name,[0,value]]}
    function int_attrib(name,value){return [0,name,[1,value]]}
    function string_attrib(name,value){return [0,name,[2,value]]}
    function space_sep_attrib(name,values){return [0,name,[3,0,values]]}
    function comma_sep_attrib(name,values){return [0,name,[3,1,values]]}
    function event_handler_attrib(name,value){return [0,name,[2,value]]}
    function mouse_event_handler_attrib(name,value){return [0,name,[2,value]]}
    function keyboard_event_handler_attrib(name,value)
     {return [0,name,[2,value]]}
    function touch_event_handler_attrib(name,value){return [0,name,[2,value]]}
    function uri_attrib(name,value){return [0,name,[2,value]]}
    function uris_attrib(name,values){return [0,name,[3,0,values]]}
    function content(elt){return elt}
    function empty(param){return 0}
    function comment(c){return [0,c]}
    function pcdata(d){return [2,d]}
    function encodedpcdata(d){return [1,d]}
    function entity(e){return [3,e]}
    var _a_=caml_call1(Re[23],cst),re_end_cdata=caml_call1(Re[2],_a_);
    function encoded_cdata(s1,s2,s)
     {var _j7_=caml_call6(Re[22],0,0,_b_,re_end_cdata,cst$0,s);
      return [1,caml_call4(Stdlib_Printf[4],_c_,s1,_j7_,s2)]}
    function cdata(_j6_){return encoded_cdata(cst_CDATA,cst$1,_j6_)}
    function cdata_script(_j5_){return encoded_cdata(cst_CDATA$0,cst$2,_j5_)}
    function cdata_style(_j4_){return encoded_cdata(cst_CDATA$1,cst$3,_j4_)}
    function leaf(opt,name)
     {if(opt)var sth=opt[1],a=sth;else var a=0;return [4,name,a]}
    function node(opt,name,children)
     {if(opt)var sth=opt[1],a=sth;else var a=0;return [5,name,a,children]}
    var
     print_list=
      caml_call1
        (caml_call1
          (Xml_print[12],
           [0,
            Xml_wrap[1],
            string_of_uri,
            uri_of_string,
            float_attrib,
            int_attrib,
            string_attrib,
            space_sep_attrib,
            comma_sep_attrib,
            event_handler_attrib,
            mouse_event_handler_attrib,
            keyboard_event_handler_attrib,
            touch_event_handler_attrib,
            uri_attrib,
            uris_attrib,
            empty,
            comment,
            pcdata,
            encodedpcdata,
            entity,
            leaf,
            node,
            cdata,
            cdata_script,
            cdata_style,
            aname,
            acontent,
            content]),
         [0,0])
       [1],
     include=
      caml_call1
       (Xml_iter[1],
        [0,
         Xml_wrap[1],
         string_of_uri,
         uri_of_string,
         float_attrib,
         int_attrib,
         string_attrib,
         space_sep_attrib,
         comma_sep_attrib,
         event_handler_attrib,
         mouse_event_handler_attrib,
         keyboard_event_handler_attrib,
         touch_event_handler_attrib,
         uri_attrib,
         uris_attrib,
         empty,
         comment,
         pcdata,
         encodedpcdata,
         entity,
         leaf,
         node,
         cdata,
         cdata_script,
         cdata_style,
         aname,
         acontent,
         content]),
     amap=include[1],
     amap1=include[2],
     rm_attrib=include[3],
     rm_attrib_from_list=include[4],
     map_int_attrib=include[5],
     map_string_attrib=include[7],
     map_string_attrib_in_list=include[8],
     add_int_attrib=include[9],
     add_string_attrib=include[11],
     add_comma_sep_attrib=include[12],
     add_space_sep_attrib=include[13],
     fold=include[14],
     all_entities=include[15],
     translate=include[16],
     pp=
      caml_call1
        (caml_call1
          (Xml_print[9],
           [0,
            Xml_wrap[1],
            string_of_uri,
            uri_of_string,
            float_attrib,
            int_attrib,
            string_attrib,
            space_sep_attrib,
            comma_sep_attrib,
            event_handler_attrib,
            mouse_event_handler_attrib,
            keyboard_event_handler_attrib,
            touch_event_handler_attrib,
            uri_attrib,
            uris_attrib,
            empty,
            comment,
            pcdata,
            encodedpcdata,
            entity,
            leaf,
            node,
            cdata,
            cdata_script,
            cdata_style,
            aname,
            acontent,
            content]),
         [0,0])
       [1],
     include$0=
      caml_call1
       (Xml_stream[2],
        [0,
         Xml_wrap[1],
         string_of_uri,
         uri_of_string,
         float_attrib,
         int_attrib,
         string_attrib,
         space_sep_attrib,
         comma_sep_attrib,
         event_handler_attrib,
         mouse_event_handler_attrib,
         keyboard_event_handler_attrib,
         touch_event_handler_attrib,
         uri_attrib,
         uris_attrib,
         empty,
         comment,
         pcdata,
         encodedpcdata,
         entity,
         leaf,
         node,
         cdata,
         cdata_script,
         cdata_style]),
     of_seq=include$0[1];
    function print(fmt,x)
     {return caml_call3
              (print_list,caml_call1(Stdlib_Format[13],fmt),0,[0,x,0])}
    var
     _d_=Xml_wrap[1],
     Tyxml_xml=
      [0,
       _d_,
       string_of_uri,
       uri_of_string,
       float_attrib,
       int_attrib,
       string_attrib,
       space_sep_attrib,
       comma_sep_attrib,
       event_handler_attrib,
       mouse_event_handler_attrib,
       keyboard_event_handler_attrib,
       touch_event_handler_attrib,
       uri_attrib,
       uris_attrib,
       empty,
       comment,
       pcdata,
       encodedpcdata,
       entity,
       leaf,
       node,
       cdata,
       cdata_script,
       cdata_style,
       aname,
       acontent,
       content,
       pp,
       of_seq,
       amap,
       amap1,
       rm_attrib,
       rm_attrib_from_list,
       map_int_attrib,
       map_string_attrib,
       map_string_attrib_in_list,
       add_int_attrib,
       add_string_attrib,
       add_comma_sep_attrib,
       add_space_sep_attrib,
       fold,
       all_entities,
       translate,
       print_list,
       print];
    caml_register_global(17,Tyxml_xml,"Tyxml_xml");
    var
     M=
      caml_call1
       (Svg_f[1],
        [0,
         _d_,
         string_of_uri,
         uri_of_string,
         float_attrib,
         int_attrib,
         string_attrib,
         space_sep_attrib,
         comma_sep_attrib,
         event_handler_attrib,
         mouse_event_handler_attrib,
         keyboard_event_handler_attrib,
         touch_event_handler_attrib,
         uri_attrib,
         uris_attrib,
         empty,
         comment,
         pcdata,
         encodedpcdata,
         entity,
         leaf,
         node,
         cdata,
         cdata_script,
         cdata_style]),
     _e_=[0,M[2],M[325],M[327]],
     include$1=
      caml_call1
       (caml_call1
         (Xml_print[8],
          [0,
           _d_,
           string_of_uri,
           uri_of_string,
           float_attrib,
           int_attrib,
           string_attrib,
           space_sep_attrib,
           comma_sep_attrib,
           event_handler_attrib,
           mouse_event_handler_attrib,
           keyboard_event_handler_attrib,
           touch_event_handler_attrib,
           uri_attrib,
           uris_attrib,
           empty,
           comment,
           pcdata,
           encodedpcdata,
           entity,
           leaf,
           node,
           cdata,
           cdata_script,
           cdata_style,
           aname,
           acontent,
           content]),
        _e_),
     _f_=[0,M[2],M[325],M[327]],
     Make_printer=
      caml_call1
       (caml_call1
         (Xml_print[11],
          [0,
           _d_,
           string_of_uri,
           uri_of_string,
           float_attrib,
           int_attrib,
           string_attrib,
           space_sep_attrib,
           comma_sep_attrib,
           event_handler_attrib,
           mouse_event_handler_attrib,
           keyboard_event_handler_attrib,
           touch_event_handler_attrib,
           uri_attrib,
           uris_attrib,
           empty,
           comment,
           pcdata,
           encodedpcdata,
           entity,
           leaf,
           node,
           cdata,
           cdata_script,
           cdata_style,
           aname,
           acontent,
           content]),
        _f_),
     _h_=M[2],
     _i_=M[3],
     _j_=M[4],
     _k_=M[5],
     _l_=M[6],
     _m_=M[7],
     _n_=M[8],
     _o_=M[9],
     _p_=M[10],
     _q_=M[11],
     _r_=M[12],
     _s_=M[13],
     _t_=M[14],
     _u_=M[15],
     _v_=M[16],
     _w_=M[17],
     _x_=M[18],
     _y_=M[19],
     _z_=M[20],
     _A_=M[21],
     _B_=M[22],
     _C_=M[23],
     _D_=M[24],
     _E_=M[25],
     _F_=M[26],
     _G_=M[27],
     _H_=M[28],
     _I_=M[29],
     _J_=M[30],
     _K_=M[31],
     _L_=M[32],
     _M_=M[33],
     _N_=M[34],
     _O_=M[35],
     _P_=M[36],
     _Q_=M[37],
     _R_=M[38],
     _S_=M[39],
     _T_=M[40],
     _U_=M[41],
     _V_=M[42],
     _W_=M[43],
     _X_=M[44],
     _Y_=M[45],
     _Z_=M[46],
     ___=M[47],
     _$_=M[48],
     _aa_=M[49],
     _ab_=M[50],
     _ac_=M[51],
     _ad_=M[52],
     _ae_=M[53],
     _af_=M[54],
     _ag_=M[55],
     _ah_=M[56],
     _ai_=M[57],
     _aj_=M[58],
     _ak_=M[59],
     _al_=M[60],
     _am_=M[61],
     _an_=M[62],
     _ao_=M[63],
     _ap_=M[64],
     _aq_=M[65],
     _ar_=M[66],
     _as_=M[67],
     _at_=M[68],
     _au_=M[69],
     _av_=M[70],
     _aw_=M[71],
     _ax_=M[72],
     _ay_=M[73],
     _az_=M[74],
     _aA_=M[75],
     _aB_=M[76],
     _aC_=M[77],
     _aD_=M[78],
     _aE_=M[79],
     _aF_=M[80],
     _aG_=M[81],
     _aH_=M[82],
     _aI_=M[83],
     _aJ_=M[84],
     _aK_=M[85],
     _aL_=M[86],
     _aM_=M[87],
     _aN_=M[88],
     _aO_=M[89],
     _aP_=M[90],
     _aQ_=M[91],
     _aR_=M[92],
     _aS_=M[93],
     _aT_=M[94],
     _aU_=M[95],
     _aV_=M[96],
     _aW_=M[97],
     _aX_=M[98],
     _aY_=M[99],
     _aZ_=M[100],
     _a0_=M[101],
     _a1_=M[102],
     _a2_=M[103],
     _a3_=M[104],
     _a4_=M[105],
     _a5_=M[106],
     _a6_=M[107],
     _a7_=M[108],
     _a8_=M[109],
     _a9_=M[110],
     _a__=M[111],
     _a$_=M[112],
     _ba_=M[113],
     _bb_=M[114],
     _bc_=M[115],
     _bd_=M[116],
     _be_=M[117],
     _bf_=M[118],
     _bg_=M[119],
     _bh_=M[120],
     _bi_=M[121],
     _bj_=M[122],
     _bk_=M[123],
     _bl_=M[124],
     _bm_=M[125],
     _bn_=M[126],
     _bo_=M[127],
     _bp_=M[128],
     _bq_=M[129],
     _br_=M[130],
     _bs_=M[131],
     _bt_=M[132],
     _bu_=M[133],
     _bv_=M[134],
     _bw_=M[135],
     _bx_=M[136],
     _by_=M[137],
     _bz_=M[138],
     _bA_=M[139],
     _bB_=M[140],
     _bC_=M[141],
     _bD_=M[142],
     _bE_=M[143],
     _bF_=M[144],
     _bG_=M[145],
     _bH_=M[146],
     _bI_=M[147],
     _bJ_=M[148],
     _bK_=M[149],
     _bL_=M[150],
     _bM_=M[151],
     _bN_=M[152],
     _bO_=M[153],
     _bP_=M[154],
     _bQ_=M[155],
     _bR_=M[156],
     _bS_=M[157],
     _bT_=M[158],
     _bU_=M[159],
     _bV_=M[160],
     _bW_=M[161],
     _bX_=M[162],
     _bY_=M[163],
     _bZ_=M[164],
     _b0_=M[165],
     _b1_=M[166],
     _b2_=M[167],
     _b3_=M[168],
     _b4_=M[169],
     _b5_=M[170],
     _b6_=M[171],
     _b7_=M[172],
     _b8_=M[173],
     _b9_=M[174],
     _b__=M[175],
     _b$_=M[176],
     _ca_=M[177],
     _cb_=M[178],
     _cc_=M[179],
     _cd_=M[180],
     _ce_=M[181],
     _cf_=M[182],
     _cg_=M[183],
     _ch_=M[184],
     _ci_=M[185],
     _cj_=M[186],
     _ck_=M[187],
     _cl_=M[188],
     _cm_=M[189],
     _cn_=M[190],
     _co_=M[191],
     _cp_=M[192],
     _cq_=M[193],
     _cr_=M[194],
     _cs_=M[195],
     _ct_=M[196],
     _cu_=M[197],
     _cv_=M[198],
     _cw_=M[199],
     _cx_=M[200],
     _cy_=M[201],
     _cz_=M[202],
     _cA_=M[203],
     _cB_=M[204],
     _cC_=M[205],
     _cD_=M[206],
     _cE_=M[207],
     _cF_=M[208],
     _cG_=M[209],
     _cH_=M[210],
     _cI_=M[211],
     _cJ_=M[212],
     _cK_=M[213],
     _cL_=M[214],
     _cM_=M[215],
     _cN_=M[216],
     _cO_=M[217],
     _cP_=M[218],
     _cQ_=M[219],
     _cR_=M[220],
     _cS_=M[221],
     _cT_=M[222],
     _cU_=M[223],
     _cV_=M[224],
     _cW_=M[225],
     _cX_=M[226],
     _cY_=M[227],
     _cZ_=M[228],
     _c0_=M[229],
     _c1_=M[230],
     _c2_=M[231],
     _c3_=M[232],
     _c4_=M[233],
     _c5_=M[234],
     _c6_=M[235],
     _c7_=M[236],
     _c8_=M[237],
     _c9_=M[238],
     _c__=M[239],
     _c$_=M[240],
     _da_=M[241],
     _db_=M[242],
     _dc_=M[243],
     _dd_=M[244],
     _de_=M[245],
     _df_=M[246],
     _dg_=M[247],
     _dh_=M[248],
     _di_=M[249],
     _dj_=M[250],
     _dk_=M[251],
     _dl_=M[252],
     _dm_=M[253],
     _dn_=M[254],
     _do_=M[255],
     _dp_=M[256],
     _dq_=M[257],
     _dr_=M[258],
     _ds_=M[259],
     _dt_=M[260],
     _du_=M[261],
     _dv_=M[262],
     _dw_=M[263],
     _dx_=M[264],
     _dy_=M[265],
     _dz_=M[266],
     _dA_=M[267],
     _dB_=M[268],
     _dC_=M[269],
     _dD_=M[270],
     _dE_=M[271],
     _dF_=M[272],
     _dG_=M[273],
     _dH_=M[274],
     _dI_=M[275],
     _dJ_=M[276],
     _dK_=M[277],
     _dL_=M[278],
     _dM_=M[279],
     _dN_=M[280],
     _dO_=M[281],
     _dP_=M[282],
     _dQ_=M[283],
     _dR_=M[284],
     _dS_=M[285],
     _dT_=M[286],
     _dU_=M[287],
     _dV_=M[288],
     _dW_=M[289],
     _dX_=M[290],
     _dY_=M[291],
     _dZ_=M[292],
     _d0_=M[293],
     _d1_=M[294],
     _d2_=M[295],
     _d3_=M[296],
     _d4_=M[297],
     _d5_=M[298],
     _d6_=M[299],
     _d7_=M[300],
     _d8_=M[301],
     _d9_=M[302],
     _d__=M[303],
     _d$_=M[304],
     _ea_=M[305],
     _eb_=M[306],
     _ec_=M[307],
     _ed_=M[308],
     _ee_=M[309],
     _ef_=M[310],
     _eg_=M[311],
     _eh_=M[312],
     _ei_=M[313],
     _ej_=M[314],
     _ek_=M[315],
     _el_=M[316],
     _em_=M[317],
     _en_=M[318],
     _eo_=M[319],
     _ep_=M[320],
     _eq_=M[321],
     _er_=M[322],
     _es_=M[323],
     _et_=M[324],
     _eu_=M[325],
     _ev_=M[326],
     _ew_=M[327],
     _ex_=M[328],
     _ey_=M[329],
     _ez_=M[330],
     _eA_=include$1[1],
     _eB_=include$1[2],
     _g_=M[1],
     pp$0=caml_call4(_eB_,0,0,0,0),
     pp_elt=caml_call3(_eA_,0,0,0),
     Tyxml_svg=
      [0,
       _g_,
       _h_,
       _i_,
       _j_,
       _k_,
       _l_,
       _m_,
       _n_,
       _o_,
       _p_,
       _q_,
       _r_,
       _s_,
       _t_,
       _u_,
       _v_,
       _w_,
       _x_,
       _y_,
       _z_,
       _A_,
       _B_,
       _C_,
       _D_,
       _E_,
       _F_,
       _G_,
       _H_,
       _I_,
       _J_,
       _K_,
       _L_,
       _M_,
       _N_,
       _O_,
       _P_,
       _Q_,
       _R_,
       _S_,
       _T_,
       _U_,
       _V_,
       _W_,
       _X_,
       _Y_,
       _Z_,
       ___,
       _$_,
       _aa_,
       _ab_,
       _ac_,
       _ad_,
       _ae_,
       _af_,
       _ag_,
       _ah_,
       _ai_,
       _aj_,
       _ak_,
       _al_,
       _am_,
       _an_,
       _ao_,
       _ap_,
       _aq_,
       _ar_,
       _as_,
       _at_,
       _au_,
       _av_,
       _aw_,
       _ax_,
       _ay_,
       _az_,
       _aA_,
       _aB_,
       _aC_,
       _aD_,
       _aE_,
       _aF_,
       _aG_,
       _aH_,
       _aI_,
       _aJ_,
       _aK_,
       _aL_,
       _aM_,
       _aN_,
       _aO_,
       _aP_,
       _aQ_,
       _aR_,
       _aS_,
       _aT_,
       _aU_,
       _aV_,
       _aW_,
       _aX_,
       _aY_,
       _aZ_,
       _a0_,
       _a1_,
       _a2_,
       _a3_,
       _a4_,
       _a5_,
       _a6_,
       _a7_,
       _a8_,
       _a9_,
       _a__,
       _a$_,
       _ba_,
       _bb_,
       _bc_,
       _bd_,
       _be_,
       _bf_,
       _bg_,
       _bh_,
       _bi_,
       _bj_,
       _bk_,
       _bl_,
       _bm_,
       _bn_,
       _bo_,
       _bp_,
       _bq_,
       _br_,
       _bs_,
       _bt_,
       _bu_,
       _bv_,
       _bw_,
       _bx_,
       _by_,
       _bz_,
       _bA_,
       _bB_,
       _bC_,
       _bD_,
       _bE_,
       _bF_,
       _bG_,
       _bH_,
       _bI_,
       _bJ_,
       _bK_,
       _bL_,
       _bM_,
       _bN_,
       _bO_,
       _bP_,
       _bQ_,
       _bR_,
       _bS_,
       _bT_,
       _bU_,
       _bV_,
       _bW_,
       _bX_,
       _bY_,
       _bZ_,
       _b0_,
       _b1_,
       _b2_,
       _b3_,
       _b4_,
       _b5_,
       _b6_,
       _b7_,
       _b8_,
       _b9_,
       _b__,
       _b$_,
       _ca_,
       _cb_,
       _cc_,
       _cd_,
       _ce_,
       _cf_,
       _cg_,
       _ch_,
       _ci_,
       _cj_,
       _ck_,
       _cl_,
       _cm_,
       _cn_,
       _co_,
       _cp_,
       _cq_,
       _cr_,
       _cs_,
       _ct_,
       _cu_,
       _cv_,
       _cw_,
       _cx_,
       _cy_,
       _cz_,
       _cA_,
       _cB_,
       _cC_,
       _cD_,
       _cE_,
       _cF_,
       _cG_,
       _cH_,
       _cI_,
       _cJ_,
       _cK_,
       _cL_,
       _cM_,
       _cN_,
       _cO_,
       _cP_,
       _cQ_,
       _cR_,
       _cS_,
       _cT_,
       _cU_,
       _cV_,
       _cW_,
       _cX_,
       _cY_,
       _cZ_,
       _c0_,
       _c1_,
       _c2_,
       _c3_,
       _c4_,
       _c5_,
       _c6_,
       _c7_,
       _c8_,
       _c9_,
       _c__,
       _c$_,
       _da_,
       _db_,
       _dc_,
       _dd_,
       _de_,
       _df_,
       _dg_,
       _dh_,
       _di_,
       _dj_,
       _dk_,
       _dl_,
       _dm_,
       _dn_,
       _do_,
       _dp_,
       _dq_,
       _dr_,
       _ds_,
       _dt_,
       _du_,
       _dv_,
       _dw_,
       _dx_,
       _dy_,
       _dz_,
       _dA_,
       _dB_,
       _dC_,
       _dD_,
       _dE_,
       _dF_,
       _dG_,
       _dH_,
       _dI_,
       _dJ_,
       _dK_,
       _dL_,
       _dM_,
       _dN_,
       _dO_,
       _dP_,
       _dQ_,
       _dR_,
       _dS_,
       _dT_,
       _dU_,
       _dV_,
       _dW_,
       _dX_,
       _dY_,
       _dZ_,
       _d0_,
       _d1_,
       _d2_,
       _d3_,
       _d4_,
       _d5_,
       _d6_,
       _d7_,
       _d8_,
       _d9_,
       _d__,
       _d$_,
       _ea_,
       _eb_,
       _ec_,
       _ed_,
       _ee_,
       _ef_,
       _eg_,
       _eh_,
       _ei_,
       _ej_,
       _ek_,
       _el_,
       _em_,
       _en_,
       _eo_,
       _ep_,
       _eq_,
       _er_,
       _es_,
       _et_,
       _eu_,
       _ev_,
       _ew_,
       _ex_,
       _ey_,
       _ez_,
       _eB_,
       _eA_,
       Make_printer,
       pp$0,
       pp_elt];
    caml_register_global(19,Tyxml_svg,"Tyxml_svg");
    var
     M$0=
      caml_call1
       (caml_call1
         (Html_f[1],
          [0,
           _d_,
           string_of_uri,
           uri_of_string,
           float_attrib,
           int_attrib,
           string_attrib,
           space_sep_attrib,
           comma_sep_attrib,
           event_handler_attrib,
           mouse_event_handler_attrib,
           keyboard_event_handler_attrib,
           touch_event_handler_attrib,
           uri_attrib,
           uris_attrib,
           empty,
           comment,
           pcdata,
           encodedpcdata,
           entity,
           leaf,
           node,
           cdata,
           cdata_script,
           cdata_style]),
        [0,
         _h_,
         _i_,
         _j_,
         _k_,
         _l_,
         _m_,
         _n_,
         _o_,
         _p_,
         _q_,
         _r_,
         _s_,
         _t_,
         _u_,
         _v_,
         _w_,
         _x_,
         _y_,
         _z_,
         _A_,
         _B_,
         _C_,
         _D_,
         _E_,
         _F_,
         _G_,
         _H_,
         _I_,
         _J_,
         _K_,
         _L_,
         _M_,
         _N_,
         _O_,
         _P_,
         _Q_,
         _R_,
         _S_,
         _T_,
         _U_,
         _V_,
         _W_,
         _X_,
         _Y_,
         _Z_,
         ___,
         _$_,
         _aa_,
         _ab_,
         _ac_,
         _ad_,
         _ae_,
         _af_,
         _ag_,
         _ah_,
         _ai_,
         _aj_,
         _ak_,
         _al_,
         _am_,
         _an_,
         _ao_,
         _ap_,
         _aq_,
         _ar_,
         _as_,
         _at_,
         _au_,
         _av_,
         _aw_,
         _ax_,
         _ay_,
         _az_,
         _aA_,
         _aB_,
         _aC_,
         _aD_,
         _aE_,
         _aF_,
         _aG_,
         _aH_,
         _aI_,
         _aJ_,
         _aK_,
         _aL_,
         _aM_,
         _aN_,
         _aO_,
         _aP_,
         _aQ_,
         _aR_,
         _aS_,
         _aT_,
         _aU_,
         _aV_,
         _aW_,
         _aX_,
         _aY_,
         _aZ_,
         _a0_,
         _a1_,
         _a2_,
         _a3_,
         _a4_,
         _a5_,
         _a6_,
         _a7_,
         _a8_,
         _a9_,
         _a__,
         _a$_,
         _ba_,
         _bb_,
         _bc_,
         _bd_,
         _be_,
         _bf_,
         _bg_,
         _bh_,
         _bi_,
         _bj_,
         _bk_,
         _bl_,
         _bm_,
         _bn_,
         _bo_,
         _bp_,
         _bq_,
         _br_,
         _bs_,
         _bt_,
         _bu_,
         _bv_,
         _bw_,
         _bx_,
         _by_,
         _bz_,
         _bA_,
         _bB_,
         _bC_,
         _bD_,
         _bE_,
         _bF_,
         _bG_,
         _bH_,
         _bI_,
         _bJ_,
         _bK_,
         _bL_,
         _bM_,
         _bN_,
         _bO_,
         _bP_,
         _bQ_,
         _bR_,
         _bS_,
         _bT_,
         _bU_,
         _bV_,
         _bW_,
         _bX_,
         _bY_,
         _bZ_,
         _b0_,
         _b1_,
         _b2_,
         _b3_,
         _b4_,
         _b5_,
         _b6_,
         _b7_,
         _b8_,
         _b9_,
         _b__,
         _b$_,
         _ca_,
         _cb_,
         _cc_,
         _cd_,
         _ce_,
         _cf_,
         _cg_,
         _ch_,
         _ci_,
         _cj_,
         _ck_,
         _cl_,
         _cm_,
         _cn_,
         _co_,
         _cp_,
         _cq_,
         _cr_,
         _cs_,
         _ct_,
         _cu_,
         _cv_,
         _cw_,
         _cx_,
         _cy_,
         _cz_,
         _cA_,
         _cB_,
         _cC_,
         _cD_,
         _cE_,
         _cF_,
         _cG_,
         _cH_,
         _cI_,
         _cJ_,
         _cK_,
         _cL_,
         _cM_,
         _cN_,
         _cO_,
         _cP_,
         _cQ_,
         _cR_,
         _cS_,
         _cT_,
         _cU_,
         _cV_,
         _cW_,
         _cX_,
         _cY_,
         _cZ_,
         _c0_,
         _c1_,
         _c2_,
         _c3_,
         _c4_,
         _c5_,
         _c6_,
         _c7_,
         _c8_,
         _c9_,
         _c__,
         _c$_,
         _da_,
         _db_,
         _dc_,
         _dd_,
         _de_,
         _df_,
         _dg_,
         _dh_,
         _di_,
         _dj_,
         _dk_,
         _dl_,
         _dm_,
         _dn_,
         _do_,
         _dp_,
         _dq_,
         _dr_,
         _ds_,
         _dt_,
         _du_,
         _dv_,
         _dw_,
         _dx_,
         _dy_,
         _dz_,
         _dA_,
         _dB_,
         _dC_,
         _dD_,
         _dE_,
         _dF_,
         _dG_,
         _dH_,
         _dI_,
         _dJ_,
         _dK_,
         _dL_,
         _dM_,
         _dN_,
         _dO_,
         _dP_,
         _dQ_,
         _dR_,
         _dS_,
         _dT_,
         _dU_,
         _dV_,
         _dW_,
         _dX_,
         _dY_,
         _dZ_,
         _d0_,
         _d1_,
         _d2_,
         _d3_,
         _d4_,
         _d5_,
         _d6_,
         _d7_,
         _d8_,
         _d9_,
         _d__,
         _d$_,
         _ea_,
         _eb_,
         _ec_,
         _ed_,
         _ee_,
         _ef_,
         _eg_,
         _eh_,
         _ei_,
         _ej_,
         _ek_,
         _el_,
         _em_,
         _en_,
         _eo_,
         _ep_,
         _eq_,
         _er_,
         _es_,
         _et_,
         _eu_,
         _ev_,
         _ew_,
         _ex_,
         _ey_,
         _ez_]),
     _eC_=[0,M$0[2],M$0[339],M$0[341]],
     include$2=
      caml_call1
       (caml_call1
         (Xml_print[8],
          [0,
           _d_,
           string_of_uri,
           uri_of_string,
           float_attrib,
           int_attrib,
           string_attrib,
           space_sep_attrib,
           comma_sep_attrib,
           event_handler_attrib,
           mouse_event_handler_attrib,
           keyboard_event_handler_attrib,
           touch_event_handler_attrib,
           uri_attrib,
           uris_attrib,
           empty,
           comment,
           pcdata,
           encodedpcdata,
           entity,
           leaf,
           node,
           cdata,
           cdata_script,
           cdata_style,
           aname,
           acontent,
           content]),
        _eC_),
     _eD_=[0,M$0[2],M$0[339],M$0[341]],
     Make_printer$0=
      caml_call1
       (caml_call1
         (Xml_print[11],
          [0,
           _d_,
           string_of_uri,
           uri_of_string,
           float_attrib,
           int_attrib,
           string_attrib,
           space_sep_attrib,
           comma_sep_attrib,
           event_handler_attrib,
           mouse_event_handler_attrib,
           keyboard_event_handler_attrib,
           touch_event_handler_attrib,
           uri_attrib,
           uris_attrib,
           empty,
           comment,
           pcdata,
           encodedpcdata,
           entity,
           leaf,
           node,
           cdata,
           cdata_script,
           cdata_style,
           aname,
           acontent,
           content]),
        _eD_),
     _j2_=include$2[1],
     _j3_=include$2[2],
     _eE_=M$0[1],
     _eF_=M$0[2],
     _eG_=M$0[3],
     _eH_=M$0[4],
     _eI_=M$0[5],
     _eJ_=M$0[6],
     _eK_=M$0[7],
     _eL_=M$0[8],
     _eM_=M$0[9],
     _eN_=M$0[10],
     _eO_=M$0[11],
     _eP_=M$0[12],
     _eQ_=M$0[13],
     _eR_=M$0[14],
     _eS_=M$0[15],
     _eT_=M$0[16],
     _eU_=M$0[17],
     _eV_=M$0[18],
     _eW_=M$0[19],
     _eX_=M$0[20],
     _eY_=M$0[21],
     _eZ_=M$0[22],
     _e0_=M$0[23],
     _e1_=M$0[24],
     _e2_=M$0[25],
     _e3_=M$0[26],
     _e4_=M$0[27],
     _e5_=M$0[28],
     _e6_=M$0[29],
     _e7_=M$0[30],
     _e8_=M$0[31],
     _e9_=M$0[32],
     _e__=M$0[33],
     _e$_=M$0[34],
     _fa_=M$0[35],
     _fb_=M$0[36],
     _fc_=M$0[37],
     _fd_=M$0[38],
     _fe_=M$0[39],
     _ff_=M$0[40],
     _fg_=M$0[41],
     _fh_=M$0[42],
     _fi_=M$0[43],
     _fj_=M$0[44],
     _fk_=M$0[45],
     _fl_=M$0[46],
     _fm_=M$0[47],
     _fn_=M$0[48],
     _fo_=M$0[49],
     _fp_=M$0[50],
     _fq_=M$0[51],
     _fr_=M$0[52],
     _fs_=M$0[53],
     _ft_=M$0[54],
     _fu_=M$0[55],
     _fv_=M$0[56],
     _fw_=M$0[57],
     _fx_=M$0[58],
     _fy_=M$0[59],
     _fz_=M$0[60],
     _fA_=M$0[61],
     _fB_=M$0[62],
     _fC_=M$0[63],
     _fD_=M$0[64],
     _fE_=M$0[65],
     _fF_=M$0[66],
     _fG_=M$0[67],
     _fH_=M$0[68],
     _fI_=M$0[69],
     _fJ_=M$0[70],
     _fK_=M$0[71],
     _fL_=M$0[72],
     _fM_=M$0[73],
     _fN_=M$0[74],
     _fO_=M$0[75],
     _fP_=M$0[76],
     _fQ_=M$0[77],
     _fR_=M$0[78],
     _fS_=M$0[79],
     _fT_=M$0[80],
     _fU_=M$0[81],
     _fV_=M$0[82],
     _fW_=M$0[83],
     _fX_=M$0[84],
     _fY_=M$0[85],
     _fZ_=M$0[86],
     _f0_=M$0[87],
     _f1_=M$0[88],
     _f2_=M$0[89],
     _f3_=M$0[90],
     _f4_=M$0[91],
     _f5_=M$0[92],
     _f6_=M$0[93],
     _f7_=M$0[94],
     _f8_=M$0[95],
     _f9_=M$0[96],
     _f__=M$0[97],
     _f$_=M$0[98],
     _ga_=M$0[99],
     _gb_=M$0[100],
     _gc_=M$0[101],
     _gd_=M$0[102],
     _ge_=M$0[103],
     _gf_=M$0[104],
     _gg_=M$0[105],
     _gh_=M$0[106],
     _gi_=M$0[107],
     _gj_=M$0[108],
     _gk_=M$0[109],
     _gl_=M$0[110],
     _gm_=M$0[111],
     _gn_=M$0[112],
     _go_=M$0[113],
     _gp_=M$0[114],
     _gq_=M$0[115],
     _gr_=M$0[116],
     _gs_=M$0[117],
     _gt_=M$0[118],
     _gu_=M$0[119],
     _gv_=M$0[120],
     _gw_=M$0[121],
     _gx_=M$0[122],
     _gy_=M$0[123],
     _gz_=M$0[124],
     _gA_=M$0[125],
     _gB_=M$0[126],
     _gC_=M$0[127],
     _gD_=M$0[128],
     _gE_=M$0[129],
     _gF_=M$0[130],
     _gG_=M$0[131],
     _gH_=M$0[132],
     _gI_=M$0[133],
     _gJ_=M$0[134],
     _gK_=M$0[135],
     _gL_=M$0[136],
     _gM_=M$0[137],
     _gN_=M$0[138],
     _gO_=M$0[139],
     _gP_=M$0[140],
     _gQ_=M$0[141],
     _gR_=M$0[142],
     _gS_=M$0[143],
     _gT_=M$0[144],
     _gU_=M$0[145],
     _gV_=M$0[146],
     _gW_=M$0[147],
     _gX_=M$0[148],
     _gY_=M$0[149],
     _gZ_=M$0[150],
     _g0_=M$0[151],
     _g1_=M$0[152],
     _g2_=M$0[153],
     _g3_=M$0[154],
     _g4_=M$0[155],
     _g5_=M$0[156],
     _g6_=M$0[157],
     _g7_=M$0[158],
     _g8_=M$0[159],
     _g9_=M$0[160],
     _g__=M$0[161],
     _g$_=M$0[162],
     _ha_=M$0[163],
     _hb_=M$0[164],
     _hc_=M$0[165],
     _hd_=M$0[166],
     _he_=M$0[167],
     _hf_=M$0[168],
     _hg_=M$0[169],
     _hh_=M$0[170],
     _hi_=M$0[171],
     _hj_=M$0[172],
     _hk_=M$0[173],
     _hl_=M$0[174],
     _hm_=M$0[175],
     _hn_=M$0[176],
     _ho_=M$0[177],
     _hp_=M$0[178],
     _hq_=M$0[179],
     _hr_=M$0[180],
     _hs_=M$0[181],
     _ht_=M$0[182],
     _hu_=M$0[183],
     _hv_=M$0[184],
     _hw_=M$0[185],
     _hx_=M$0[186],
     _hy_=M$0[187],
     _hz_=M$0[188],
     _hA_=M$0[189],
     _hB_=M$0[190],
     _hC_=M$0[191],
     _hD_=M$0[192],
     _hE_=M$0[193],
     _hF_=M$0[194],
     _hG_=M$0[195],
     _hH_=M$0[196],
     _hI_=M$0[197],
     _hJ_=M$0[198],
     _hK_=M$0[199],
     _hL_=M$0[200],
     _hM_=M$0[201],
     _hN_=M$0[202],
     _hO_=M$0[203],
     _hP_=M$0[204],
     _hQ_=M$0[205],
     _hR_=M$0[206],
     _hS_=M$0[207],
     _hT_=M$0[208],
     _hU_=M$0[209],
     _hV_=M$0[210],
     _hW_=M$0[211],
     _hX_=M$0[212],
     _hY_=M$0[213],
     _hZ_=M$0[214],
     _h0_=M$0[215],
     _h1_=M$0[216],
     _h2_=M$0[217],
     _h3_=M$0[218],
     _h4_=M$0[219],
     _h5_=M$0[220],
     _h6_=M$0[221],
     _h7_=M$0[222],
     _h8_=M$0[223],
     _h9_=M$0[224],
     _h__=M$0[225],
     _h$_=M$0[226],
     _ia_=M$0[227],
     _ib_=M$0[228],
     _ic_=M$0[229],
     _id_=M$0[230],
     _ie_=M$0[231],
     _if_=M$0[232],
     _ig_=M$0[233],
     _ih_=M$0[234],
     _ii_=M$0[235],
     _ij_=M$0[236],
     _ik_=M$0[237],
     _il_=M$0[238],
     _im_=M$0[239],
     _in_=M$0[240],
     _io_=M$0[241],
     _ip_=M$0[242],
     _iq_=M$0[243],
     _ir_=M$0[244],
     _is_=M$0[245],
     _it_=M$0[246],
     _iu_=M$0[247],
     _iv_=M$0[248],
     _iw_=M$0[249],
     _ix_=M$0[250],
     _iy_=M$0[251],
     _iz_=M$0[252],
     _iA_=M$0[253],
     _iB_=M$0[254],
     _iC_=M$0[255],
     _iD_=M$0[256],
     _iE_=M$0[257],
     _iF_=M$0[258],
     _iG_=M$0[259],
     _iH_=M$0[260],
     _iI_=M$0[261],
     _iJ_=M$0[262],
     _iK_=M$0[263],
     _iL_=M$0[264],
     _iM_=M$0[265],
     _iN_=M$0[266],
     _iO_=M$0[267],
     _iP_=M$0[268],
     _iQ_=M$0[269],
     _iR_=M$0[270],
     _iS_=M$0[271],
     _iT_=M$0[272],
     _iU_=M$0[273],
     _iV_=M$0[274],
     _iW_=M$0[275],
     _iX_=M$0[276],
     _iY_=M$0[277],
     _iZ_=M$0[278],
     _i0_=M$0[279],
     _i1_=M$0[280],
     _i2_=M$0[281],
     _i3_=M$0[282],
     _i4_=M$0[283],
     _i5_=M$0[284],
     _i6_=M$0[285],
     _i7_=M$0[286],
     _i8_=M$0[287],
     _i9_=M$0[288],
     _i__=M$0[289],
     _i$_=M$0[290],
     _ja_=M$0[291],
     _jb_=M$0[292],
     _jc_=M$0[293],
     _jd_=M$0[294],
     _je_=M$0[295],
     _jf_=M$0[296],
     _jg_=M$0[297],
     _jh_=M$0[298],
     _ji_=M$0[299],
     _jj_=M$0[300],
     _jk_=M$0[301],
     _jl_=M$0[302],
     _jm_=M$0[303],
     _jn_=M$0[304],
     _jo_=M$0[305],
     _jp_=M$0[306],
     _jq_=M$0[307],
     _jr_=M$0[308],
     _js_=M$0[309],
     _jt_=M$0[310],
     _ju_=M$0[311],
     _jv_=M$0[312],
     _jw_=M$0[313],
     _jx_=M$0[314],
     _jy_=M$0[315],
     _jz_=M$0[316],
     _jA_=M$0[317],
     _jB_=M$0[318],
     _jC_=M$0[319],
     _jD_=M$0[320],
     _jE_=M$0[321],
     _jF_=M$0[322],
     _jG_=M$0[323],
     _jH_=M$0[324],
     _jI_=M$0[325],
     _jJ_=M$0[326],
     _jK_=M$0[327],
     _jL_=M$0[328],
     _jM_=M$0[329],
     _jN_=M$0[330],
     _jO_=M$0[331],
     _jP_=M$0[332],
     _jQ_=M$0[333],
     _jR_=M$0[334],
     _jS_=M$0[335],
     _jT_=M$0[336],
     _jU_=M$0[337],
     _jV_=M$0[338],
     _jW_=M$0[339],
     _jX_=M$0[340],
     _jY_=M$0[341],
     _jZ_=M$0[342],
     _j0_=M$0[343],
     _j1_=M$0[344],
     pp$1=caml_call4(_j3_,0,0,0,0),
     pp_elt$0=caml_call3(_j2_,0,0,0),
     Tyxml_html=
      [0,
       _eE_,
       _eF_,
       _eG_,
       _eH_,
       _eI_,
       _eJ_,
       _eK_,
       _eL_,
       _eM_,
       _eN_,
       _eO_,
       _eP_,
       _eQ_,
       _eR_,
       _eS_,
       _eT_,
       _eU_,
       _eV_,
       _eW_,
       _eX_,
       _eY_,
       _eZ_,
       _e0_,
       _e1_,
       _e2_,
       _e3_,
       _e4_,
       _e5_,
       _e6_,
       _e7_,
       _e8_,
       _e9_,
       _e__,
       _e$_,
       _fa_,
       _fb_,
       _fc_,
       _fd_,
       _fe_,
       _ff_,
       _fg_,
       _fh_,
       _fi_,
       _fj_,
       _fk_,
       _fl_,
       _fm_,
       _fn_,
       _fo_,
       _fp_,
       _fq_,
       _fr_,
       _fs_,
       _ft_,
       _fu_,
       _fv_,
       _fw_,
       _fx_,
       _fy_,
       _fz_,
       _fA_,
       _fB_,
       _fC_,
       _fD_,
       _fE_,
       _fF_,
       _fG_,
       _fH_,
       _fI_,
       _fJ_,
       _fK_,
       _fL_,
       _fM_,
       _fN_,
       _fO_,
       _fP_,
       _fQ_,
       _fR_,
       _fS_,
       _fT_,
       _fU_,
       _fV_,
       _fW_,
       _fX_,
       _fY_,
       _fZ_,
       _f0_,
       _f1_,
       _f2_,
       _f3_,
       _f4_,
       _f5_,
       _f6_,
       _f7_,
       _f8_,
       _f9_,
       _f__,
       _f$_,
       _ga_,
       _gb_,
       _gc_,
       _gd_,
       _ge_,
       _gf_,
       _gg_,
       _gh_,
       _gi_,
       _gj_,
       _gk_,
       _gl_,
       _gm_,
       _gn_,
       _go_,
       _gp_,
       _gq_,
       _gr_,
       _gs_,
       _gt_,
       _gu_,
       _gv_,
       _gw_,
       _gx_,
       _gy_,
       _gz_,
       _gA_,
       _gB_,
       _gC_,
       _gD_,
       _gE_,
       _gF_,
       _gG_,
       _gH_,
       _gI_,
       _gJ_,
       _gK_,
       _gL_,
       _gM_,
       _gN_,
       _gO_,
       _gP_,
       _gQ_,
       _gR_,
       _gS_,
       _gT_,
       _gU_,
       _gV_,
       _gW_,
       _gX_,
       _gY_,
       _gZ_,
       _g0_,
       _g1_,
       _g2_,
       _g3_,
       _g4_,
       _g5_,
       _g6_,
       _g7_,
       _g8_,
       _g9_,
       _g__,
       _g$_,
       _ha_,
       _hb_,
       _hc_,
       _hd_,
       _he_,
       _hf_,
       _hg_,
       _hh_,
       _hi_,
       _hj_,
       _hk_,
       _hl_,
       _hm_,
       _hn_,
       _ho_,
       _hp_,
       _hq_,
       _hr_,
       _hs_,
       _ht_,
       _hu_,
       _hv_,
       _hw_,
       _hx_,
       _hy_,
       _hz_,
       _hA_,
       _hB_,
       _hC_,
       _hD_,
       _hE_,
       _hF_,
       _hG_,
       _hH_,
       _hI_,
       _hJ_,
       _hK_,
       _hL_,
       _hM_,
       _hN_,
       _hO_,
       _hP_,
       _hQ_,
       _hR_,
       _hS_,
       _hT_,
       _hU_,
       _hV_,
       _hW_,
       _hX_,
       _hY_,
       _hZ_,
       _h0_,
       _h1_,
       _h2_,
       _h3_,
       _h4_,
       _h5_,
       _h6_,
       _h7_,
       _h8_,
       _h9_,
       _h__,
       _h$_,
       _ia_,
       _ib_,
       _ic_,
       _id_,
       _ie_,
       _if_,
       _ig_,
       _ih_,
       _ii_,
       _ij_,
       _ik_,
       _il_,
       _im_,
       _in_,
       _io_,
       _ip_,
       _iq_,
       _ir_,
       _is_,
       _it_,
       _iu_,
       _iv_,
       _iw_,
       _ix_,
       _iy_,
       _iz_,
       _iA_,
       _iB_,
       _iC_,
       _iD_,
       _iE_,
       _iF_,
       _iG_,
       _iH_,
       _iI_,
       _iJ_,
       _iK_,
       _iL_,
       _iM_,
       _iN_,
       _iO_,
       _iP_,
       _iQ_,
       _iR_,
       _iS_,
       _iT_,
       _iU_,
       _iV_,
       _iW_,
       _iX_,
       _iY_,
       _iZ_,
       _i0_,
       _i1_,
       _i2_,
       _i3_,
       _i4_,
       _i5_,
       _i6_,
       _i7_,
       _i8_,
       _i9_,
       _i__,
       _i$_,
       _ja_,
       _jb_,
       _jc_,
       _jd_,
       _je_,
       _jf_,
       _jg_,
       _jh_,
       _ji_,
       _jj_,
       _jk_,
       _jl_,
       _jm_,
       _jn_,
       _jo_,
       _jp_,
       _jq_,
       _jr_,
       _js_,
       _jt_,
       _ju_,
       _jv_,
       _jw_,
       _jx_,
       _jy_,
       _jz_,
       _jA_,
       _jB_,
       _jC_,
       _jD_,
       _jE_,
       _jF_,
       _jG_,
       _jH_,
       _jI_,
       _jJ_,
       _jK_,
       _jL_,
       _jM_,
       _jN_,
       _jO_,
       _jP_,
       _jQ_,
       _jR_,
       _jS_,
       _jT_,
       _jU_,
       _jV_,
       _jW_,
       _jX_,
       _jY_,
       _jZ_,
       _j0_,
       _j1_,
       _j3_,
       _j2_,
       Make_printer$0,
       pp$1,
       pp_elt$0];
    caml_register_global(21,Tyxml_html,"Tyxml_html");
    var Tyxml=[0];
    caml_register_global(22,Tyxml,"Tyxml");
    return}
  (globalThis));


//# 1 ".mechanic.eobjs/byte/dune__exe__Mechanic.cmo.js"
(function(globalThis)
   {"use strict";
    var
     runtime=globalThis.jsoo_runtime,
     caml_jsstring_of_string=runtime.caml_jsstring_of_string,
     caml_mul=runtime.caml_mul,
     caml_string_of_jsbytes=runtime.caml_string_of_jsbytes,
     caml_string_of_jsstring=runtime.caml_string_of_jsstring;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    function caml_call2(f,a0,a1)
     {return f.length == 2?f(a0,a1):runtime.caml_call_gen(f,[a0,a1])}
    function caml_call3(f,a0,a1,a2)
     {return f.length == 3?f(a0,a1,a2):runtime.caml_call_gen(f,[a0,a1,a2])}
    function caml_call5(f,a0,a1,a2,a3,a4)
     {return f.length == 5
              ?f(a0,a1,a2,a3,a4)
              :runtime.caml_call_gen(f,[a0,a1,a2,a3,a4])}
    var
     global_data=runtime.caml_get_global_data(),
     cst_R_initialiser_compl_tement=
      caml_string_of_jsbytes
       ("R\xc3\xa9initialiser compl\xc3\xa8tement le formulaire ?"),
     cst$12=caml_string_of_jsbytes(""),
     cst_nom_prenom$1=caml_string_of_jsbytes("nom_prenom"),
     cst$13=caml_string_of_jsbytes(""),
     cst_arrivee$1=caml_string_of_jsbytes("arrivee"),
     cst$14=caml_string_of_jsbytes(""),
     cst_depart$1=caml_string_of_jsbytes("depart"),
     cst$10=caml_string_of_jsbytes("\xc2\xa0\xe2\x82\xac"),
     cst_qte=caml_string_of_jsbytes("_qte"),
     cst$11=caml_string_of_jsbytes("\xc2\xa0\xe2\x82\xac"),
     cst_total=caml_string_of_jsbytes("total"),
     cst_benvoi=caml_string_of_jsbytes("benvoi"),
     cst_subject_R_servation_linge_=
      caml_string_of_jsbytes
       ("?subject=R\xc3\xa9servation linge Dubuval&body="),
     cst_mailto=caml_string_of_jsbytes("mailto:"),
     cst_resume=caml_string_of_jsbytes("resume"),
     cst$7=caml_string_of_jsbytes(", "),
     cst$9=caml_string_of_jsbytes(""),
     cst$8=caml_string_of_jsbytes(" "),
     cst$6=caml_string_of_jsbytes(" : "),
     cst$5=caml_string_of_jsbytes("\xc2\xa0\xe2\x82\xac"),
     cst_Total=caml_string_of_jsbytes("Total : "),
     cst_depart$0=caml_string_of_jsbytes("depart"),
     cst_Date_de_d_part=caml_string_of_jsbytes("Date de d\xc3\xa9part : "),
     cst_arrivee$0=caml_string_of_jsbytes("arrivee"),
     cst_Date_d_arriv_e=
      caml_string_of_jsbytes("Date d\xe2\x80\x99arriv\xc3\xa9e : "),
     cst_nom_prenom$0=caml_string_of_jsbytes("nom_prenom"),
     cst_Locataire=caml_string_of_jsbytes("Locataire : "),
     cst$3=caml_string_of_jsbytes(", "),
     cst$4=caml_string_of_jsbytes(""),
     cst$2=caml_string_of_jsbytes(" : "),
     cst_nom_prenom=caml_string_of_jsbytes("nom_prenom"),
     cst_arrivee=caml_string_of_jsbytes("arrivee"),
     cst_depart=caml_string_of_jsbytes("depart"),
     cst$1=caml_string_of_jsbytes("_"),
     cst$0=caml_string_of_jsbytes("_"),
     cst=caml_string_of_jsbytes(""),
     cst_compute=caml_string_of_jsbytes("compute"),
     cst_reset_form=caml_string_of_jsbytes("reset_form"),
     Js_of_ocaml_Dom_html=global_data.Js_of_ocaml__Dom_html,
     Stdlib_List=global_data.Stdlib__List,
     Stdlib=global_data.Stdlib,
     Inventaire_linge=global_data.Inventaire_linge,
     Stdlib_Fun=global_data.Stdlib__Fun,
     Stdlib_String=global_data.Stdlib__String,
     Stdlib_Printf=global_data.Stdlib__Printf,
     Tyxml_html=global_data.Tyxml_html,
     Stdlib_Format=global_data.Stdlib__Format,
     Stdlib_Buffer=global_data.Stdlib__Buffer,
     Js_of_ocaml_Js=global_data.Js_of_ocaml__Js,
     _l_=
      [0,
       [11,caml_string_of_jsbytes(" ("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes(" (%s)")],
     _k_=[0,0,0],
     _m_=[0,[15,0],caml_string_of_jsbytes("%a")],
     _h_=
      [0,
       [11,caml_string_of_jsbytes(" ("),[2,0,[12,41,0]]],
       caml_string_of_jsbytes(" (%s)")],
     _i_=
      [0,
       [11,
        caml_string_of_jsbytes("\xe2\x80\x94 "),
        [4,
         0,
         0,
         0,
         [12,32,[2,0,[2,0,[12,37,[11,caml_string_of_jsbytes("0A"),0]]]]]]],
       caml_string_of_jsbytes("\xe2\x80\x94 %d %s%s%%0A")],
     _g_=[0,0,0],
     _c_=
      [0,
       [11,
        caml_string_of_jsbytes
         ("----- R\xc3\xa9servation linge Dubuval, Les terrasses des Choseaux, Appartement B6 -----"),
        [12,37,[11,caml_string_of_jsbytes("0A"),0]]],
       caml_string_of_jsbytes
        ("----- R\xc3\xa9servation linge Dubuval, Les terrasses des Choseaux, Appartement B6 -----%%0A")],
     _d_=
      [0,
       [11,
        caml_string_of_jsbytes("Locataire : "),
        [2,0,[12,37,[11,caml_string_of_jsbytes("0A"),0]]]],
       caml_string_of_jsbytes("Locataire : %s%%0A")],
     _e_=
      [0,
       [11,
        caml_string_of_jsbytes("Date d\xe2\x80\x99arriv\xc3\xa9e : "),
        [2,0,[12,37,[11,caml_string_of_jsbytes("0A"),0]]]],
       caml_string_of_jsbytes("Date d\xe2\x80\x99arriv\xc3\xa9e : %s%%0A")],
     _f_=
      [0,
       [11,
        caml_string_of_jsbytes("Date de d\xc3\xa9part : "),
        [2,0,[12,37,[11,caml_string_of_jsbytes("0A"),0]]]],
       caml_string_of_jsbytes("Date de d\xc3\xa9part : %s%%0A")],
     _j_=
      [0,
       [12,
        37,
        [11,
         caml_string_of_jsbytes("0ATotal : "),
         [4,
          0,
          0,
          0,
          [11,
           caml_string_of_jsbytes(" \xe2\x82\xac"),
           [12,37,[11,caml_string_of_jsbytes("0A"),0]]]]]],
       caml_string_of_jsbytes("%%0ATotal : %d \xe2\x82\xac%%0A")];
    function set_string_input_by_id(nm,v)
     {var
       match=
        caml_call2(Js_of_ocaml_Dom_html[5],nm,Js_of_ocaml_Dom_html[117][33]);
      if(match)
       {var inp=match[1],t0=caml_jsstring_of_string(v);return inp.value = t0}
      return 0}
    function read_string_input_by_id(nm)
     {var
       match=
        caml_call2(Js_of_ocaml_Dom_html[5],nm,Js_of_ocaml_Dom_html[117][33]);
      if(match){var inp=match[1];return caml_string_of_jsstring(inp.value)}
      return cst}
    function zero_int_input_by_id(nm)
     {var
       match=
        caml_call2(Js_of_ocaml_Dom_html[5],nm,Js_of_ocaml_Dom_html[117][50]);
      if(match)
       {var inp=match[1],t3=caml_jsstring_of_string(caml_call1(Stdlib[33],0));
        return inp.value = t3}
      return 0}
    function read_int_input_by_id(nm)
     {var
       match=
        caml_call2(Js_of_ocaml_Dom_html[5],nm,Js_of_ocaml_Dom_html[117][50]);
      if(match)
       {var inp=match[1];
        return runtime.caml_int_of_string(caml_string_of_jsstring(inp.value))}
      return 0}
    function set_td_by_id(nm,v)
     {var
       match=
        caml_call2(Js_of_ocaml_Dom_html[5],nm,Js_of_ocaml_Dom_html[117][54]);
      if(match)
       {var td=match[1],t6=caml_jsstring_of_string(v);
        return td.innerHTML = t6}
      return 0}
    function field_id_by_fourniture(f)
     {var _ba_=f[4];
      function _bb_(param)
       {var
         p=param[1],
         _bc_=caml_call1(Inventaire_linge[4],p),
         _bd_=caml_call2(Stdlib[28],cst$0,_bc_);
        return caml_call2(Stdlib[28],f[1],_bd_)}
      return caml_call1(caml_call1(Stdlib_List[19],_bb_),_ba_)}
    function field_id_and_piece_by_fournitu(f)
     {var _a7_=f[4];
      function _a8_(param)
       {var
         p=param[1],
         _a9_=caml_call1(Inventaire_linge[5],p),
         _a__=caml_call1(Inventaire_linge[4],p),
         _a$_=caml_call2(Stdlib[28],cst$1,_a__);
        return [0,caml_call2(Stdlib[28],f[1],_a$_),_a9_]}
      return caml_call1(caml_call1(Stdlib_List[19],_a8_),_a7_)}
    var
     _a_=Inventaire_linge[6],
     _b_=caml_call1(caml_call1(Stdlib_List[19],field_id_by_fourniture),_a_),
     all_names=caml_call1(Stdlib_List[13],_b_);
    function compute(param)
     {var _aj_=Inventaire_linge[6];
      function _ak_(f)
       {var _a1_=field_id_by_fourniture(f),_a2_=0;
        function _a3_(s,field_id)
         {return s + read_int_input_by_id(field_id) | 0}
        var
         qte=caml_call1(caml_call2(Stdlib_List[25],_a3_,_a2_),_a1_),
         _a4_=caml_call1(Stdlib[33],caml_mul(qte,f[3])),
         _a5_=caml_call2(Stdlib[28],_a4_,cst$10);
        set_td_by_id(f[1],_a5_);
        var _a6_=caml_call1(Stdlib[33],qte);
        return set_td_by_id(caml_call2(Stdlib[28],f[1],cst_qte),_a6_)}
      caml_call2(Stdlib_List[17],_ak_,_aj_);
      var _al_=Inventaire_linge[6],_am_=0;
      function _an_(total,f)
       {var _aX_=field_id_by_fourniture(f),_aY_=0;
        function _aZ_(s,field_id)
         {return s + read_int_input_by_id(field_id) | 0}
        var _a0_=caml_call1(caml_call2(Stdlib_List[25],_aZ_,_aY_),_aX_);
        return total + caml_mul(f[3],_a0_) | 0}
      var
       _ao_=caml_call3(Stdlib_List[25],_an_,_am_,_al_),
       _ap_=caml_call1(Stdlib[33],_ao_);
      set_td_by_id
       (cst_total,
        caml_call1(caml_call2(Stdlib_Fun[2],Stdlib[28],cst$11),_ap_));
      var
       match=
        caml_call2
         (Js_of_ocaml_Dom_html[5],cst_benvoi,Js_of_ocaml_Dom_html[117][2]);
      if(match)
       {var a=match[1],b=caml_call1(Stdlib_Buffer[1],500);
        caml_call2(Stdlib_Printf[5],b,_c_);
        var _n_=read_string_input_by_id(cst_nom_prenom);
        caml_call3(Stdlib_Printf[5],b,_d_,_n_);
        var _o_=read_string_input_by_id(cst_arrivee);
        caml_call3(Stdlib_Printf[5],b,_e_,_o_);
        var _p_=read_string_input_by_id(cst_depart);
        caml_call3(Stdlib_Printf[5],b,_f_,_p_);
        var
         _q_=Inventaire_linge[6],
         _r_=
          function(f)
           {var _aQ_=field_id_and_piece_by_fournitu(f);
            function _aR_(param,_aT_)
             {var
               short$0=_aT_[2],
               field_id=_aT_[1],
               detail=param[2],
               s=param[1],
               q=read_int_input_by_id(field_id);
              if(0 < q)
               var
                _aU_=caml_call1(Stdlib[33],q),
                _aV_=caml_call2(Stdlib[28],cst$2,_aU_),
                _aW_=[0,caml_call2(Stdlib[28],short$0,_aV_),detail];
              else
               var _aW_=detail;
              return [0,s + q | 0,_aW_]}
            var
             param=caml_call1(caml_call2(Stdlib_List[25],_aR_,_g_),_aQ_),
             _aS_=param[1];
            if(0 === _aS_)return 0;
            var detail=param[2];
            return [0,[0,f[2],_aS_,detail]]},
         _s_=caml_call2(Stdlib_List[22],_r_,_q_),
         _t_=
          function(param)
           {var detail=param[3],q=param[2],descr=param[1];
            if(detail)
             var
              _aO_=caml_call2(Stdlib_String[6],cst$3,detail),
              _aP_=caml_call2(Stdlib_Printf[4],_h_,_aO_);
            else
             var _aP_=cst$4;
            return caml_call5(Stdlib_Printf[5],b,_i_,q,descr,_aP_)};
        caml_call1(caml_call1(Stdlib_List[17],_t_),_s_);
        var
         _u_=Inventaire_linge[6],
         _v_=0,
         _w_=
          function(total,f)
           {var _aK_=field_id_by_fourniture(f),_aL_=0;
            function _aM_(s,field_id)
             {return s + read_int_input_by_id(field_id) | 0}
            var _aN_=caml_call1(caml_call2(Stdlib_List[25],_aM_,_aL_),_aK_);
            return total + caml_mul(f[3],_aN_) | 0},
         _x_=caml_call3(Stdlib_List[25],_w_,_v_,_u_);
        caml_call3(Stdlib_Printf[5],b,_j_,_x_);
        var
         _y_=caml_call1(Stdlib_Buffer[2],b),
         _ah_=caml_call2(Stdlib[28],cst_subject_R_servation_linge_,_y_),
         _ai_=caml_call2(Stdlib[28],Inventaire_linge[2],_ah_),
         t8=caml_jsstring_of_string(caml_call2(Stdlib[28],cst_mailto,_ai_));
        a.href = t8}
      var
       match$0=
        caml_call2
         (Js_of_ocaml_Dom_html[5],cst_resume,Js_of_ocaml_Dom_html[117][15]);
      if(match$0)
       {var
         resume=match$0[1],
         _A_=[0,caml_call1(Tyxml_html[219],cst$5),0],
         _z_=0,
         _B_=Inventaire_linge[6],
         _C_=0,
         _D_=
          function(total,f)
           {var _aG_=field_id_by_fourniture(f),_aH_=0;
            function _aI_(s,field_id)
             {return s + read_int_input_by_id(field_id) | 0}
            var _aJ_=caml_call1(caml_call2(Stdlib_List[25],_aI_,_aH_),_aG_);
            return total + caml_mul(f[3],_aJ_) | 0},
         _E_=caml_call3(Stdlib_List[25],_D_,_C_,_B_),
         _F_=caml_call1(Stdlib[33],_E_),
         _G_=[0,caml_call1(Tyxml_html[219],_F_),_A_],
         _H_=[0,caml_call1(Tyxml_html[219],cst_Total),0],
         _I_=[0,caml_call2(Tyxml_html[254],0,_H_),_G_],
         _J_=[0,caml_call2(Tyxml_html[241],0,_I_),_z_],
         _K_=[0,caml_call2(Tyxml_html[264],0,0),_J_],
         _L_=Inventaire_linge[6],
         _M_=
          function(f)
           {var _ay_=field_id_and_piece_by_fournitu(f);
            function _az_(param,_aC_)
             {var
               short$0=_aC_[2],
               field_id=_aC_[1],
               detail=param[2],
               s=param[1],
               q=read_int_input_by_id(field_id);
              if(0 < q)
               var
                _aD_=caml_call1(Stdlib[33],q),
                _aE_=caml_call2(Stdlib[28],cst$6,_aD_),
                _aF_=[0,caml_call2(Stdlib[28],short$0,_aE_),detail];
              else
               var _aF_=detail;
              return [0,s + q | 0,_aF_]}
            var
             param=caml_call1(caml_call2(Stdlib_List[25],_az_,_k_),_ay_),
             _aA_=param[1];
            if(0 === _aA_)return 0;
            var detail=param[2],_aB_=caml_call1(Stdlib_List[9],detail);
            return [0,[0,f[2],_aA_,_aB_]]},
         _N_=caml_call2(Stdlib_List[22],_M_,_L_),
         _O_=
          function(param)
           {var detail=param[3],q=param[2],descr=param[1],_aq_=0;
            if(detail)
             var
              _ar_=caml_call2(Stdlib_String[6],cst$7,detail),
              _as_=caml_call2(Stdlib_Printf[4],_l_,_ar_);
            else
             var _as_=cst$9;
            var
             _at_=[0,caml_call1(Tyxml_html[219],_as_),_aq_],
             _au_=[0,caml_call1(Tyxml_html[219],descr),_at_],
             _av_=[0,caml_call1(Tyxml_html[219],cst$8),_au_],
             _aw_=caml_call1(Stdlib[33],q),
             _ax_=[0,caml_call1(Tyxml_html[219],_aw_),_av_];
            return caml_call2(Tyxml_html[250],0,_ax_)},
         _P_=caml_call1(caml_call1(Stdlib_List[19],_O_),_N_),
         _Q_=[0,caml_call2(Tyxml_html[247],0,_P_),_K_],
         _R_=[0,caml_call2(Tyxml_html[264],0,0),_Q_],
         _S_=read_string_input_by_id(cst_depart$0),
         _T_=[0,caml_call1(Tyxml_html[219],_S_),0],
         _U_=[0,caml_call1(Tyxml_html[219],cst_Date_de_d_part),_T_],
         _V_=[0,caml_call2(Tyxml_html[254],0,_U_),0],
         _W_=[0,caml_call2(Tyxml_html[241],0,_V_),_R_],
         _X_=read_string_input_by_id(cst_arrivee$0),
         _Y_=[0,caml_call1(Tyxml_html[219],_X_),0],
         _Z_=[0,caml_call1(Tyxml_html[219],cst_Date_d_arriv_e),_Y_],
         ___=[0,caml_call2(Tyxml_html[254],0,_Z_),0],
         _$_=[0,caml_call2(Tyxml_html[241],0,___),_W_],
         _aa_=read_string_input_by_id(cst_nom_prenom$0),
         _ab_=[0,caml_call1(Tyxml_html[219],_aa_),0],
         _ac_=[0,caml_call1(Tyxml_html[219],cst_Locataire),_ab_],
         _ad_=[0,caml_call2(Tyxml_html[254],0,_ac_),0],
         _ae_=[0,caml_call2(Tyxml_html[241],0,_ad_),_$_],
         _af_=caml_call2(Tyxml_html[244],0,_ae_),
         _ag_=caml_call3(Tyxml_html[346],0,0,0),
         t10=
          caml_jsstring_of_string
           (caml_call1(caml_call2(Stdlib_Format[133],_m_,_ag_),_af_));
        return resume.innerHTML = t10}
      return 0}
    function reset_form(param)
     {var
       t12=caml_jsstring_of_string(cst_R_initialiser_compl_tement),
       doit=Js_of_ocaml_Dom_html[8].confirm(t12) | 0;
      return doit
              ?(set_string_input_by_id(cst_nom_prenom$1,cst$12),
                set_string_input_by_id(cst_arrivee$1,cst$13),
                set_string_input_by_id(cst_depart$1,cst$14),
                caml_call1
                 (caml_call1(Stdlib_List[17],zero_int_input_by_id),all_names),
                compute(0))
              :doit}
    caml_call2(Js_of_ocaml_Js[46],cst_compute,compute);
    caml_call2(Js_of_ocaml_Js[46],cst_reset_form,reset_form);
    var Dune_exe_Mechanic=[0];
    runtime.caml_register_global(68,Dune_exe_Mechanic,"Dune__exe__Mechanic");
    return}
  (globalThis));


//# 1 "../.js/stdlib/std_exit.cmo.js"
(function(globalThis)
   {"use strict";
    var runtime=globalThis.jsoo_runtime;
    function caml_call1(f,a0)
     {return f.length == 1?f(a0):runtime.caml_call_gen(f,[a0])}
    var global_data=runtime.caml_get_global_data(),Stdlib=global_data.Stdlib;
    caml_call1(Stdlib[103],0);
    var Std_exit=[0];
    runtime.caml_register_global(1,Std_exit,"Std_exit");
    return}
  (globalThis));


//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiJtZWNoYW5pYy5iYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJuYW1lcyI6WyJPYmplY3QiLCJnbG9iYWxUaGlzIiwidGhpcyIsImdldCIsIl9UXyIsImdsb2JhbCIsInNlbGYiLCJjYW1sX2ludDY0X2lzX3plcm8iLCJ4IiwiY2FtbF9zdHJfcmVwZWF0IiwibiIsInMiLCJyIiwibCIsImNhbWxfaW50NjRfb2Zmc2V0IiwiTWF0aCIsImNhbWxfcmFpc2VfY29uc3RhbnQiLCJ0YWciLCJjYW1sX2dsb2JhbF9kYXRhIiwiY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSIsIk1sSW50NjQiLCJsbyIsIm1pIiwiaGkiLCJ4aGkiLCJoIiwic2lnbiIsIm9mZnNldCIsIm1vZHVsdXMiLCJkaXZpc29yIiwicXVvdGllbnQiLCJ5IiwicSIsImNhbWxfaW50NjRfb2ZfaW50MzIiLCJjYW1sX2ludDY0X3RvX2ludDMyIiwiY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSIsImNhbWxfaW50NjRfbmVnIiwiY2FtbF9zdWJhcnJheV90b19qc2J5dGVzIiwiYSIsImkiLCJsZW4iLCJmIiwiU3RyaW5nIiwibnVsbCIsImNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMiLCJjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIiwiY2FtbF9yYWlzZV93aXRoX2FyZyIsImFyZyIsImpzb29faXNfYXNjaWkiLCJjYW1sX3V0ZjE2X29mX3V0ZjgiLCJiIiwidCIsImMiLCJjMSIsImMyIiwidiIsImoiLCJNbEJ5dGVzIiwiY29udGVudHMiLCJsZW5ndGgiLCJjb250ZW50IiwiY2FtbF9ieXRlc19vZl9qc2J5dGVzIiwiY2FtbF9zdHJpbmdfb2ZfanNieXRlcyIsImNhbWxfcmFpc2Vfd2l0aF9zdHJpbmciLCJtc2ciLCJjYW1sX2ludmFsaWRfYXJndW1lbnQiLCJjYW1sX3BhcnNlX2Zvcm1hdCIsImZtdCIsImNhbWxfZmluaXNoX2Zvcm1hdHRpbmciLCJyYXdidWZmZXIiLCJidWZmZXIiLCJjYW1sX2ludDY0X2Zvcm1hdCIsIndiYXNlIiwiY3Z0YmwiLCJwIiwiY2FtbF9leHBtMV9mbG9hdCIsImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nIiwiZnNfbm9kZV9zdXBwb3J0ZWQiLCJtYWtlX3BhdGhfaXNfYWJzb2x1dGUiLCJwb3NpeCIsInBhdGgiLCJ3aW4zMiIsInNwbGl0RGV2aWNlUmUiLCJyZXN1bHQiLCJkZXZpY2UiLCJpc1VuYyIsIkJvb2xlYW4iLCJyb290Iiwic2VwIiwicGF0aF9pc19hYnNvbHV0ZSIsImNhbWxfdHJhaWxpbmdfc2xhc2giLCJuYW1lIiwiY2FtbF9jdXJyZW50X2RpciIsImNhbWxfbWFrZV9wYXRoIiwiY29tcDAiLCJjb21wIiwibmNvbXAiLCJjYW1sX3V0Zjhfb2ZfdXRmMTYiLCJkIiwiY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyIsImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIiwidW5peF9lcnJvciIsIm1ha2VfdW5peF9lcnJfYXJncyIsImNvZGUiLCJzeXNjYWxsIiwiZXJybm8iLCJ2YXJpYW50IiwiYXJncyIsImNhbWxfbmFtZWRfdmFsdWVzIiwiY2FtbF9uYW1lZF92YWx1ZSIsIm5tIiwiY2FtbF9yYWlzZV93aXRoX2FyZ3MiLCJjYW1sX2lzX21sX2J5dGVzIiwiY2FtbF9pc19tbF9zdHJpbmciLCJjYW1sX2J5dGVzX29mX2FycmF5IiwiY2FtbF9ieXRlc19vZl9zdHJpbmciLCJjYW1sX3JhaXNlX3N5c19lcnJvciIsImNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlIiwiY2FtbF9ieXRlc19ib3VuZF9lcnJvciIsImNhbWxfYnl0ZXNfdW5zYWZlX2dldCIsImNhbWxfYnl0ZXNfZ2V0IiwiY2FtbF9jcmVhdGVfYnl0ZXMiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfY29udmVydF9ieXRlc190b19hcnJheSIsIkFycmF5IiwiY2FtbF9ibGl0X2J5dGVzIiwiczEiLCJpMSIsInMyIiwiaTIiLCJjYW1sX2JsaXRfc3RyaW5nIiwiZSIsIk1sRmlsZSIsIk1sRmFrZUZpbGUiLCJvbGQiLCJidWYiLCJwb3MiLCJjbGVuIiwibmV3X3N0ciIsIm9sZF9kYXRhIiwiTWxGYWtlRGV2aWNlIiwicmVzIiwiU3ltYm9sIiwibmFtZV9zbGFzaCIsIm1vZGUiLCJyYWlzZV91bml4IiwicGFyZW50IiwiUmVnRXhwIiwic2VlbiIsIm0iLCJvayIsImZpbGUiLCJieXRlcyIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQiLCJjYW1sX2FycmF5X29mX3N0cmluZyIsImNhbWxfYXJyYXlfb2ZfYnl0ZXMiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2J5dGVzX3NldCIsIk1sTm9kZUZpbGUiLCJmZCIsInJlcXVpcmUiLCJlcnIiLCJidWZfb2Zmc2V0IiwiTWxOb2RlRGV2aWNlIiwiY29uc3RzIiwia2V5IiwibyIsImpzX3N0YXRzIiwidG9fZGlyIiwidGFyZ2V0IiwibGluayIsImZpbGVfa2luZCIsImNhbWxfZ2V0X3Jvb3QiLCJjYW1sX2ZhaWx3aXRoIiwiY2FtbF9yb290IiwianNvb19tb3VudF9wb2ludCIsInJlc29sdmVfZnNfZGV2aWNlIiwiY2FtbF9zeXNfaXNfZGlyZWN0b3J5IiwiY2FtbF9yYWlzZV9ub3RfZm91bmQiLCJjYW1sX3N5c19nZXRlbnYiLCJnIiwidW5kZWZpbmVkIiwic2hpZnRfcmlnaHRfbmF0IiwibmF0MSIsIm9mczEiLCJsZW4xIiwibmF0MiIsIm9mczIiLCJuYml0cyIsIndyYXAiLCJjYW1sX2dyX3N0YXRlIiwiY2FtbF9ncl9zdGF0ZV9nZXQiLCJjYW1sX2dyX3BvaW50X2NvbG9yIiwiaW0iLCJNbE9iamVjdFRhYmxlIiwiTmFpdmVMb29rdXAiLCJvYmpzIiwiY2FtbF9zeXNfcmVuYW1lIiwib19yb290Iiwibl9yb290IiwiY2FtbF9sb2cxMF9mbG9hdCIsInVuaXhfdW5saW5rIiwiY2FtbF9ydW50aW1lX3dhcm5pbmdzIiwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5ncyIsImJvb2wiLCJjYW1sX2NsYXNzaWZ5X2Zsb2F0IiwiaXNGaW5pdGUiLCJpc05hTiIsInVuaXhfcm1kaXIiLCJjYW1sX21sX3JlZmlsbF9pbnB1dCIsImNoYW4iLCJzdHIiLCJzdHJfbGVuIiwiY2FtbF9tbF9jaGFubmVscyIsImNhbWxfbWxfbWF5X3JlZmlsbF9pbnB1dCIsImNoYW5pZCIsImNhbWxfYXJyYXlfYm91bmRfZXJyb3IiLCJjYW1sX21sX2lucHV0X3NjYW5fbGluZSIsImNhbWxfZ2NfbWlub3IiLCJjYW1sX2ludDY0X29mX2J5dGVzIiwiY2FtbF9iYV91aW50OF9nZXQ2NCIsImJhIiwiaTAiLCJvZnMiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiY2FtbF9pbnQ2NF90b19ieXRlcyIsImNhbWxfaW50NjRfbWFyc2hhbCIsIndyaXRlciIsInNpemVzIiwiY2FtbF9iYV9udW1fZGltcyIsImNhbWxfcmV0dXJuX2V4bl9jb25zdGFudCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NyZWF0ZV9maWxlIiwianNvb19jcmVhdGVfZmlsZSIsImNhbWxfZnNfaW5pdCIsInRtcCIsImNhbWxfc2V0X3BhcnNlcl90cmFjZSIsImNhbWxfbGlzdF9vZl9qc19hcnJheSIsInVuaXhfZ2V0dGltZW9mZGF5IiwiRGF0ZSIsImNhbWxfbXVsIiwiY2FtbF9oYXNoX21peF9pbnQiLCJudW1fZGlnaXRzX25hdCIsIm5hdCIsImNhbWxfaGFzaF9uYXQiLCJjYW1sX2NhbGxfZ2VuIiwiYXJnc0xlbiIsImV4dHJhX2FyZ3MiLCJhcmd1bWVudHMiLCJuYXJncyIsImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHMiLCJjYW1sX3N5c19jaGRpciIsImRpciIsImNhbWxfZ2NfY291bnRlcnMiLCJjYW1sX2dyX3N5bmNocm9uaXplIiwidW5peF9oYXNfc3ltbGluayIsInVuaXQiLCJsb2cyX29rIiwianNvb19mbG9vcl9sb2cyIiwiSW5maW5pdHkiLCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQiLCJmbG9hdDMyYSIsImludDMyYSIsImNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIiwiY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IiwiZXhwIiwiayIsInIzIiwicjIiLCJyMSIsImNhbWxfYmFfc2VyaWFsaXplIiwic3oiLCJjb21wbGV4IiwiY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudCIsImtpbmQiLCJjYW1sX2JhX2NyZWF0ZV9idWZmZXIiLCJzaXplIiwidmlldyIsImRhdGEiLCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMiLCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMiLCJOYU4iLCJjYW1sX2JhX2dldF9zaXplIiwiZGltcyIsIm5fZGltcyIsImNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIiwiY2FtbF9pbnQ2NF9oaTMyIiwiY2FtbF9pbnQ2NF9sbzMyIiwiY2FtbF9iYV9jdXN0b21fbmFtZSIsIk1sX0JpZ2FycmF5IiwibGF5b3V0IiwicmUiLCJ0b3RhbCIsImsxIiwiazIiLCJNbF9CaWdhcnJheV9jXzFfMSIsImNhbWxfYmFfY3JlYXRlX3Vuc2FmZSIsInNpemVfcGVyX2VsZW1lbnQiLCJjYW1sX2JhX2Rlc2VyaWFsaXplIiwicmVhZGVyIiwibnVtX2RpbXMiLCJzaXplX2RpbSIsInNpemVfZGltX2hpIiwic2l6ZV9kaW1fbG8iLCJzaXh0eSIsImludDY0IiwiY2FtbF9iYV9jb21wYXJlIiwiY2FtbF9oYXNoX21peF9pbnQ2NCIsImNhbWxfaGFzaF9taXhfZmxvYXQiLCJ2MCIsImNhbWxfYmFfaGFzaCIsIm51bV9lbHRzIiwidyIsImNhbWxfaW50MzJfdW5tYXJzaGFsIiwiY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsIiwiY2FtbF9pbnQ2NF91bm1hcnNoYWwiLCJjYW1sX2ludDY0X2NvbXBhcmUiLCJjYW1sX2ludDY0X2hhc2giLCJjYW1sX2N1c3RvbV9vcHMiLCJjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20iLCJjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20iLCJudW0iLCJjdXN0b20iLCJzd2FwIiwiY2FtbF9jb21wYXJlX3ZhbF90YWciLCJOdW1iZXIiLCJjYW1sX2ludF9jb21wYXJlIiwiY2FtbF9ieXRlc19jb21wYXJlIiwiY2FtbF9zdHJpbmdfY29tcGFyZSIsImNhbWxfY29tcGFyZV92YWwiLCJzdGFjayIsInRhZ19hIiwidGFnX2IiLCJjYW1sX2dyZWF0ZXJ0aGFuIiwiZGl2X2hlbHBlciIsInoiLCJkaXZfZGlnaXRfbmF0IiwibmF0cSIsIm9mc3EiLCJuYXRyIiwib2ZzciIsInJlbSIsIm51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdCIsInNoaWZ0X2xlZnRfbmF0IiwiTWxOYXQiLCJjcmVhdGVfbmF0IiwiYXJyIiwic2V0X3RvX3plcm9fbmF0IiwiaW5jcl9uYXQiLCJjYXJyeV9pbiIsImNhcnJ5IiwiYWRkX25hdCIsImxlbjIiLCJuYXRfb2ZfYXJyYXkiLCJtdWx0X2RpZ2l0X25hdCIsIm5hdDMiLCJvZnMzIiwieDEiLCJ4MiIsIngzIiwiZGVjcl9uYXQiLCJib3Jyb3ciLCJzdWJfbmF0IiwiY29tcGFyZV9uYXQiLCJkaXZfbmF0IiwicXVvIiwiY2FtbF9iYV9ibGl0Iiwic3JjIiwiZHN0IiwiaXNfZGlnaXRfaW50IiwiY2FtbF9pbnQ2NF9kaXYiLCJjYW1sX2pzX2h0bWxfZW50aXRpZXMiLCJlbnRpdHkiLCJ0ZW1wIiwiZG9jdW1lbnQiLCJjYW1sX3N0cmluZ191bnNhZmVfc2V0IiwiY2FtbF9pbnQ2NF9vZl9mbG9hdCIsImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0IiwiY2FtbF9iYV9zZXRfMiIsImNhbWxfYXJndiIsIm1haW4iLCJhcmd2IiwiYXJnczIiLCJjYW1sX2V4ZWN1dGFibGVfbmFtZSIsImNhbWxfanNfZXZhbF9zdHJpbmciLCJldmFsIiwic2VyaWFsaXplX25hdCIsImNhbWxfbWVtcHJvZl9zZXQiLCJfY29udHJvbCIsImNhbWxfc3lzX2V4aXQiLCJjYW1sX2NoYW5uZWxfZGVzY3JpcHRvciIsImNhbWxfanNfZnJvbV9hcnJheSIsImNhbWxfYmFfcmVzaGFwZSIsInZpbmQiLCJuZXdfZGltIiwiY2FtbF9vb19sYXN0X2lkIiwiY2FtbF9zZXRfb29faWQiLCJjYW1sX2dyX2ZpbGxfcmVjdCIsImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhIiwic3RyMSIsInBvczEiLCJiYTIiLCJwb3MyIiwic2xpY2UiLCJjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUiLCJqc25hbWUiLCJjYW1sX2dldF9nbG9iYWxfZGF0YSIsImNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQiLCJjYW1sX2JhX3VpbnQ4X2dldDE2IiwiY2FtbF9jb21wYXJlIiwiY2FtbF9mcmVzaF9vb19pZCIsImNhbWxfaW50NjRfdG9fZmxvYXQiLCJjYW1sX2JhX2dldF8xIiwiY2FtbF9iaWdzdHJpbmdfbWVtY21wIiwiY2FtbF9uZXdfc3RyaW5nIiwiY2FtbF9lcmZfZmxvYXQiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiY2FtbF9iYV91aW50OF9nZXQzMiIsImNhbWxfcmF3X2JhY2t0cmFjZV9sZW5ndGgiLCJjYW1sX29ial9ibG9jayIsImNhbWxfZ3JfY2xlYXJfZ3JhcGgiLCJiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIiwiYnMiLCJjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkIiwiX3VuaXQiLCJseG9yX2RpZ2l0X25hdCIsImNhbWxfb2JqX2FkZF9vZmZzZXQiLCJjYW1sX2ZpbmFsX3JlbGVhc2UiLCJjYW1sX2pzX3RvX2FycmF5IiwiY2FtbF9ncl9wbG90IiwiY29sb3IiLCJjYW1sX2J5dGVzX3NldDE2IiwiaTE2IiwiY2FtbF9zdHJpbmdfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDY0IiwiaTY0IiwiY2FtbF9pbnQ2NF9ic3dhcCIsImNhbWxfZmlsbF9ieXRlcyIsImNhbWxfZmlsbF9zdHJpbmciLCJjYW1sX2djX21ham9yIiwiY2FtbF9sZXhfYXJyYXkiLCJjYW1sX2xleF9lbmdpbmUiLCJ0YmwiLCJzdGFydF9zdGF0ZSIsImxleGJ1ZiIsImxleF9idWZmZXIiLCJsZXhfYnVmZmVyX2xlbiIsImxleF9zdGFydF9wb3MiLCJsZXhfY3Vycl9wb3MiLCJsZXhfbGFzdF9wb3MiLCJsZXhfbGFzdF9hY3Rpb24iLCJsZXhfZW9mX3JlYWNoZWQiLCJsZXhfYmFzZSIsImxleF9iYWNrdHJrIiwibGV4X2RlZmF1bHQiLCJsZXhfdHJhbnMiLCJsZXhfY2hlY2siLCJzdGF0ZSIsImJhc2UiLCJiYWNrdHJrIiwidW5peF9nZXR1aWQiLCJjYW1sX3N5c19maWxlX2V4aXN0cyIsImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3QiLCJjYW1sX2FycmF5X3N1YiIsImNhbWxfYnl0ZXNfZXF1YWwiLCJjYW1sX2dyX3NpemVfeCIsImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMiLCJvc190eXBlIiwiY2FtbF9zeXNfY29uc3Rfb3N0eXBlX2N5Z3dpbiIsImNhbWxfY29zaF9mbG9hdCIsImNhbWxfZXBoZV9rZXlfb2Zmc2V0IiwiY2FtbF93ZWFrX2NoZWNrIiwiY2FtbF9lcGhlX2NoZWNrX2tleSIsImNhbWxfaGFzaF9taXhfZmluYWwiLCJjYW1sX2dyX3RleHRfc2l6ZSIsInR4dCIsImNhbWxfbGV4X3J1bl9tZW0iLCJtZW0iLCJjdXJyX3BvcyIsImNhbWxfbGV4X3J1bl90YWciLCJjYW1sX25ld19sZXhfZW5naW5lIiwibGV4X21lbSIsImxleF9iYXNlX2NvZGUiLCJsZXhfYmFja3Rya19jb2RlIiwibGV4X2RlZmF1bHRfY29kZSIsImxleF90cmFuc19jb2RlIiwibGV4X2NoZWNrX2NvZGUiLCJsZXhfY29kZSIsInBjX29mZiIsInBzdGF0ZSIsImJhc2VfY29kZSIsImNhbWxfYmFfdWludDhfc2V0NjQiLCJjYW1sX3N5c19leGVjdXRhYmxlX25hbWUiLCJjYW1sX2xlc3NlcXVhbCIsImNhbWxfYWNvc2hfZmxvYXQiLCJjYW1sX21sX2ZsdXNoIiwib3V0cHV0IiwiY2FtbF9tbF9zZWVrX291dF82NCIsImNvbXBhcmVfbmF0X3JlYWwiLCJjYW1sX2djX3NldCIsImNhbWxfanNfZ2V0IiwiY2FtbF9tbF9zZXRfYnVmZmVyZWQiLCJjYW1sX2djX2NvbXBhY3Rpb24iLCJjYW1sX3dlYWtfZ2V0IiwiY2FtbF9lcGhlX2dldF9rZXkiLCJjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhIiwid2luX2NsZWFudXAiLCJjYW1sX3N5c19jbG9zZSIsImNhbWxfbWxfY2xvc2VfY2hhbm5lbCIsImNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlIiwiZXhuIiwiZm9yY2UiLCJjYW1sX3N5c19pc2F0dHkiLCJfY2hhbiIsImlzX2RpZ2l0X3plcm8iLCJ1bml4X2luZXRfYWRkcl9vZl9zdHJpbmciLCJjYW1sX2pzX3NldCIsImNhbWxfYXJyYXlfZ2V0IiwiYXJyYXkiLCJpbmRleCIsImNhbWxfbG9nMl9mbG9hdCIsImNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudCIsImNhbWxfc3BhY2V0aW1lX29ubHlfd29ya3NfZm9yX25hdGl2ZV9jb2RlIiwiY2FtbF9pbnQ2NF9zdWIiLCJjYW1sX21sX3NlZWtfaW5fNjQiLCJjYW1sX2ludDY0X3NoaWZ0X2xlZnQiLCJjYW1sX25vdGVxdWFsIiwiY2FtbF9zeXNfY29uc3RfaW50X3NpemUiLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayIsImNhbWxfaXNfanMiLCJjYW1sX2JhX2RpbSIsImNhbWxfYmFfZGltXzEiLCJ1bml4X2xvY2FsdGltZSIsImRfbnVtIiwiamFudWFyeWZpcnN0IiwiZG95IiwiamFuIiwianVsIiwic3RkVGltZXpvbmVPZmZzZXQiLCJjYW1sX2pzX21ldGhfY2FsbCIsImNhbWxfd2Vha19jcmVhdGUiLCJjYW1sX2VwaGVfY3JlYXRlIiwiY2FtbF9qc190b19ieXRlX3N0cmluZyIsInVuaXhfbWt0aW1lIiwidG0iLCJ0bTIiLCJjYW1sX3RyYW1wb2xpbmUiLCJjYW1sX2J5dGVzX2dldDY0IiwiY2FtbF93ZWFrX3NldCIsImNhbWxfc3lzX3JlbW92ZSIsImNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yIiwiY2FtbF9zdHJpbmdfZ2V0MzIiLCJjYW1sX2h5cG90X2Zsb2F0IiwiY2FtbF9qc19jYWxsIiwiY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSIsImNhbWxfZXBoZV91bnNldF9rZXkiLCJjYW1sX2hhc2hfbWl4X2J5dGVzX2FyciIsImNhbWxfaGFzaF9taXhfanNieXRlcyIsImNhbWxfbWxfYnl0ZXNfY29udGVudCIsImNhbWxfaGFzaF9taXhfYnl0ZXMiLCJjYW1sX2J5dGVzX2xlc3N0aGFuIiwiY2FtbF9lcmZjX2Zsb2F0IiwiY2FtbF9ncl9maWxsX3BvbHkiLCJhciIsImNhbWxfZ2NfcXVpY2tfc3RhdCIsImNhbWxfcmFpc2VfZW5kX29mX2ZpbGUiLCJjYW1sX21sX2lucHV0X2ludCIsImNhbWxfZ3JfZGlzcGxheV9tb2RlIiwiY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzIiwibnRoX2RpZ2l0X25hdCIsImNhbWxfYXJyYXlfYmxpdCIsImNhbWxfZmxvYXRfb2Zfc3RyaW5nIiwibTMiLCJtYW50aXNzYSIsInBhcnNlSW50IiwiZXhwb25lbnQiLCJjYW1sX3N5c19nZXRjd2QiLCJjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIiwiY2FtbF9saXN0X3RvX2pzX2FycmF5IiwiY2FtbF9sZWdhY3lfY3VzdG9tX2NvZGUiLCJjYW1sX291dHB1dF92YWwiLCJXcml0ZXIiLCJ2YWx1ZSIsImZsYWdzIiwibm9fc2hhcmluZyIsImNsb3N1cmVzIiwiaW50ZXJuX29ial90YWJsZSIsIm1lbW8iLCJleGlzdGluZ19vZmZzZXQiLCJleHRlcm5fcmVjIiwib3BzIiwic3pfMzJfNjQiLCJoZWFkZXJfcG9zIiwib2xkX3BvcyIsInR5cGVfb2ZfdiIsImNhbWxfc3RyaW5nX29mX2FycmF5IiwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIiwiY2FtbF9yYWlzZV9ub3RfYV9kaXIiLCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZCIsImNtZCIsInVuaXhfaXNhdHR5IiwiZmlsZURlc2NyaXB0b3IiLCJ0dHkiLCJjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvbiIsImRlc2VyaWFsaXplX25hdCIsImluaXRpYWxpemVfbmF0IiwiY2FtbF9ncl9vcGVuX3N1YndpbmRvdyIsInVuaXhfbHN0YXQiLCJ1bml4X2xzdGF0XzY0IiwianNfcHJpbnRfc3Rkb3V0IiwiY2FtbF9jb3B5c2lnbl9mbG9hdCIsImNhbWxfZ3Jfc2V0X3RleHRfc2l6ZSIsImNhbWxfbWQ1X2J5dGVzIiwiYWRkIiwieHgiLCJmZiIsImdnIiwiaGgiLCJpaSIsIm1kNSIsImNhbWxfYmFfc2V0X2dlbmVyaWMiLCJjYW1sX2VwaGVfc2V0X2tleSIsImNhbWxfYnl0ZXNfbGVzc2VxdWFsIiwiY2FtbF9zdHJpbmdfbGVzc2VxdWFsIiwiY2FtbF9zdHJpbmdfZ3JlYXRlcmVxdWFsIiwiY2FtbF9pbnQ2NF9hZGQiLCJjYW1sX25leHRhZnRlcl9mbG9hdCIsImJpdHMiLCJvbmUiLCJjYW1sX2dyX3NpemVfeSIsImNhbWxfbWxfcG9zX2luIiwiY2FtbF9pbnQ2NF9hbmQiLCJjYW1sX3N5c19jb25zdF93b3JkX3NpemUiLCJjYW1sX3N0ZF9vdXRwdXQiLCJzbGVuIiwianNfcHJpbnRfc3RkZXJyIiwiY2FtbF9zeXNfb3Blbl9pbnRlcm5hbCIsImlkeCIsImluZm8iLCJjYW1sX3N5c19vcGVuIiwiX3Blcm1zIiwiTWxTdHJpbmdSZWFkZXIiLCJjYW1sX2Zsb2F0X29mX2J5dGVzIiwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlciIsIl9tYWdpYyIsIl9ibG9ja19sZW4iLCJudW1fb2JqZWN0cyIsIl9zaXplXzMyIiwiX3NpemVfNjQiLCJvYmpfY291bnRlciIsImludGVybl9yZWMiLCJoZWFkZXIiLCJleHBlY3RlZF9zaXplIiwiY2FtbF9zdHJpbmdfb2ZfYnl0ZXMiLCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMiLCJjYW1sX3N0cmluZ19nZXQiLCJyZV9tYXRjaCIsInJlX3dvcmRfbGV0dGVycyIsIm9wY29kZXMiLCJpc193b3JkX2xldHRlciIsImluX2JpdHNldCIsInJlX21hdGNoX2ltcGwiLCJwYXJ0aWFsIiwicHJvZyIsImNwb29sIiwibm9ybXRhYmxlIiwibnVtZ3JvdXBzIiwibnVtcmVnaXN0ZXJzIiwic3RhcnRjaGFycyIsInBjIiwicXVpdCIsImdyb3VwcyIsInJlX3JlZ2lzdGVyIiwiYmFja3RyYWNrIiwiaXRlbSIsInB1c2giLCJhY2NlcHQiLCJwcmVmaXhfbWF0Y2giLCJvcCIsInNhcmciLCJ1YXJnIiwiZ3JvdXAiLCJFcnJvciIsInJlX3NlYXJjaF9iYWNrd2FyZCIsImNhbWxfanNfZnJvbV9zdHJpbmciLCJjYW1sX2JhX3N1YiIsImNoYW5nZWRfZGltIiwibXVsIiwibmV3X2RpbXMiLCJuZXdfZGF0YSIsImNhbWxfZ2NfZnVsbF9tYWpvciIsImNhbWxfYnl0ZXNfc2V0MzIiLCJpMzIiLCJjYW1sX2dyX3NpZ2lvX3NpZ25hbCIsImNhbWxfYmFfdWludDhfc2V0MzIiLCJjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCIsImNhbWxfc2lnbmJpdF9mbG9hdCIsImNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgiLCJjYW1sX2dyX3NldF9mb250IiwiY2FtbF9ncl9zZXRfY29sb3IiLCJjb252ZXJ0IiwibnVtYmVyIiwiY19zdHIiLCJjYW1sX2dyX21vdmV0byIsImNhbWxfZ3JfcmVzaXplX3dpbmRvdyIsImNhbWxfZ3Jfc3RhdGVfaW5pdCIsImNhbWxfZ3JfY3VycmVudF94IiwiY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5IiwidGEiLCJjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXkiLCJjYW1sX21sX3NlZWtfb3V0IiwiY2FtbF9qc190eXBlb2YiLCJjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZSIsImJ0IiwiY2FtbF9ncl9saW5ldG8iLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmUiLCJjYW1sX2JhX2RpbV8zIiwiY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvbiIsImNhbWxfZm9ybWF0X2V4Y2VwdGlvbiIsImJ1Y2tldCIsInN0YXJ0IiwiY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24iLCJoYW5kbGVyIiwiYXRfZXhpdCIsImNhbWxfZXBoZV9kYXRhX29mZnNldCIsImNhbWxfZXBoZV9jaGVja19kYXRhIiwiY2FtbF9ieXRlc19nZXQxNiIsImNhbWxfb2JqX21ha2VfZm9yd2FyZCIsImNhbWxfanNfZnJvbV9ib29sIiwiY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lIiwiY2FtbF9leHAyX2Zsb2F0IiwiY2FtbF9ncl9jbG9zZV9ncmFwaCIsImNhbWxfY3JlYXRlX3N0cmluZyIsImNhbWxfbWQ1X3N0cmluZyIsImNhbWxfbWQ1X2NoYW4iLCJjaGFuX2xlbiIsImNhbWxfb2JqX2R1cCIsImNhbWxfd2Vha19nZXRfY29weSIsImNhbWxfYXRhbmhfZmxvYXQiLCJjYW1sX21sX291dHB1dF9ieXRlcyIsInN0cmluZyIsImpzc3RyaW5nIiwiaWQiLCJjYW1sX21sX291dHB1dCIsImNhbWxfZXBoZV9nZXRfZGF0YSIsImNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlIiwiY2FtbF90cmFtcG9saW5lX3JldHVybiIsImNhbWxfbWxfaXNfYnVmZmVyZWQiLCJjYW1sX2FycmF5X2FwcGVuZCIsImwxIiwibDIiLCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbCIsImNhbWxfanNfZXhwciIsImNhbWxfaW50NjRfbXVsIiwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQiLCJjYW1sX291dHB1dF92YWx1ZV90b19ieXRlcyIsImNhbWxfZXZlbnRsb2dfcmVzdW1lIiwiY2FtbF9oYXNoX3VuaXZfcGFyYW0iLCJjb3VudCIsImxpbWl0Iiwib2JqIiwiaGFzaF9hY2N1IiwiaGFzaF9hdXgiLCJqc2J5dGVzIiwiY2FtbF9zdHJpbmdfZXF1YWwiLCJjYW1sX291dHB1dF92YWx1ZV90b19idWZmZXIiLCJyZV9yZXBsYWNlbWVudF90ZXh0IiwicmVwbCIsIm9yaWciLCJjdXIiLCJlbmQiLCJjYW1sX3B1cmVfanNfZXhwciIsImJsaXRfbmF0IiwiY2FtbF9pbnQ2NF91bHQiLCJjYW1sX2ludDY0X3hvciIsImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXMiLCJiYTEiLCJieXRlczIiLCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlIiwianNvb19jcmVhdGVfZmlsZV9leHRlcm4iLCJjYW1sX3RvX2pzX3N0cmluZyIsImNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSIsImNhbWxfcGFyc2VfZGlnaXQiLCJjYW1sX2ludDY0X29mX3N0cmluZyIsImJhc2U2NCIsInRocmVzaG9sZCIsInJlX3NlYXJjaF9mb3J3YXJkIiwiY2FtbF9ibGl0X3N0cmluZ190b19iaWdzdHJpbmciLCJjYW1sX21ha2VfdmVjdCIsImluaXQiLCJjYW1sX21sX3NlZWtfaW4iLCJjYW1sX3N5c19yZWFkX2RpcmVjdG9yeSIsImNhbWxfbWxfb3V0cHV0X2NoYXIiLCJjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIiLCJjYW1sX29ial9pc19ibG9jayIsImNhbWxfbWxfaW5wdXRfY2hhciIsImNhbWxfb2JqX3NldF9yYXdfZmllbGQiLCJjYW1sX2pzX3ZhciIsImNhbWxfdHJ1bmNfZmxvYXQiLCJjYW1sX2VwaGVfYmxpdF9kYXRhIiwiY2FtbF9pc19wcmludGFibGUiLCJjYW1sX2VxdWFsIiwicmVfcGFydGlhbF9tYXRjaCIsImNhbWxfc3lzX3JhbmRvbV9zZWVkIiwiYnVmZiIsIm5vdyIsImNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUiLCJjYW1sX2JhX2dldF8yIiwid2luX2hhbmRsZV9mZCIsImNhbWxfYmFfdWludDhfc2V0MTYiLCJ3aW5fZmlsZWRlc2NyX29mX2NoYW5uZWwiLCJjYW1sX2pzX2RlbGV0ZSIsImNhbWxfaW50X29mX3N0cmluZyIsImNhbWxfbGlzdF9tb3VudF9wb2ludCIsInByZXYiLCJjYW1sX21hcnNoYWxfY29uc3RhbnRzIiwiY2FtbF9vYmpfcmF3X2ZpZWxkIiwiY2FtbF9qc19lcXVhbHMiLCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkiLCJjYW1sX2dyX2FyY19hdXgiLCJjdHgiLCJjeCIsImN5IiwicnkiLCJyeCIsInJvdCIsInhQb3MiLCJ5UG9zIiwieFBvc19wcmV2IiwieVBvc19wcmV2Iiwic3BhY2UiLCJkZWx0YSIsImNhbWxfZ3JfZmlsbF9hcmMiLCJjYW1sX2JhX3NsaWNlIiwibnVtX2luZHMiLCJzdWJfZGltcyIsImNhbWxfbWFyc2hhbF9kYXRhX3NpemUiLCJnZXQzMiIsImNhbWxfaW5wdXRfdmFsdWUiLCJjYW1sX2JhX2tpbmQiLCJjYW1sX2pzX2Z1bl9jYWxsIiwiY2FtbF9nY19tYWpvcl9zbGljZSIsIndvcmsiLCJjYW1sX2pzX3B1cmVfZXhwciIsImNvbXBhcmVfZGlnaXRzX25hdCIsImNhbWxfbWxfaW5wdXQiLCJjYW1sX2dyX3dhaXRfZXZlbnQiLCJfZXZsIiwiY2FtbF9ncl9zaWdpb19oYW5kbGVyIiwiY2FtbF9oYXNoX21peF9iaWdzdHJpbmciLCJjYW1sX3JlY29yZF9iYWNrdHJhY2UiLCJ1bml4X2dtdGltZSIsImNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSIsImNhbWxfc3lzX2dldF9jb25maWciLCJ1bml4X3RpbWUiLCJjYW1sX21sX291dF9jaGFubmVsc19saXN0IiwiY2FtbF9hc2luaF9mbG9hdCIsImJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXIiLCJhYiIsImNhbWxfbW9kIiwiY2FtbF9iYV9pbml0IiwicmVfc3RyaW5nX21hdGNoIiwiQmlnU3RyaW5nUmVhZGVyIiwiY2FtbF9ncl9kdW1wX2ltYWdlIiwiY2FtbF9iYV9nZXRfZ2VuZXJpYyIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9iYWNrdHJhY2UiLCJjYW1sX2Zvcm1hdF9mbG9hdCIsInRvRml4ZWQiLCJkcCIsInByZWMiLCJjYW1sX21vdW50X2F1dG9sb2FkIiwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYSIsImNhbWxfYmxpdF9iaWdzdHJpbmdfdG9fYmlnc3RyaW5nIiwiY2FtbF9zdHJpbmdfbGVzc3RoYW4iLCJjYW1sX3N0cmluZ19ncmVhdGVydGhhbiIsImNhbWxfZGl2IiwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkiLCJjYW1sX21lbXByb2Zfc3RhcnQiLCJyYXRlIiwic3RhY2tfc2l6ZSIsInRyYWNrZXIiLCJjYW1sX3N5c19nZXRfYXJndiIsImNhbWxfanNfdG9fYm9vbCIsImNhbWxfZ3JfY3JlYXRlX2ltYWdlIiwiY2FtbF9lcGhlX2dldF9rZXlfY29weSIsImNhbWxfbGVzc3RoYW4iLCJjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90IiwiY2FtbF9yZWdpc3Rlcl9nbG9iYWwiLCJuYW1lX29wdCIsIm11bHRfbmF0IiwibGVuMyIsInNxdWFyZV9uYXQiLCJjYW1sX2pzX2Zyb21fZmxvYXQiLCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIiwiY2FtbF9nY19zdGF0IiwiY2FtbF9nZXRfbWFqb3JfY3JlZGl0IiwiY2FtbF9zeXNfbW9kaWZ5X2FyZ3YiLCJjYW1sX21ldGhvZF9jYWNoZSIsImNhbWxfZ2V0X3B1YmxpY19tZXRob2QiLCJjYWNoZWlkIiwibWV0aHMiLCJsaSIsImNhbWxfanNfZ2V0X2NvbnNvbGUiLCJjYW1sX3N5c191bnNhZmVfZ2V0ZW52IiwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW4iLCJyZWZpbGwiLCJmcyIsImNoYW5uZWwiLCJiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXkiLCJjYW1sX3JvdW5kX2Zsb2F0IiwidW5peF9zdGF0IiwidW5peF9zdGF0XzY0IiwiY2FtbF9vanNfbmV3X2FyciIsIkYiLCJjb21wbGVtZW50X25hdCIsImNhbWxfanNfcmVnZXhwcyIsImNhbWxfanNfaHRtbF9lc2NhcGUiLCJjYW1sX2JhX2RpbV8yIiwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzIiwiY2FtbF9zaW5oX2Zsb2F0IiwiY2FtbF9sZGV4cF9mbG9hdCIsImNhbWxfZ3Jfc3RhdGVfc2V0IiwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdCIsImFyaXR5IiwiY2FtbF9nY19taW5vcl93b3JkcyIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFjayIsImxhbmRfZGlnaXRfbmF0IiwiY2FtbF9pbnQ2NF9tb2QiLCJ1bml4X3JlYWRsaW5rIiwiY2FtbF9vYmpfc2V0X3RhZyIsImNhbWxfaW50MzJfYnN3YXAiLCJ3aW5fc3RhcnR1cCIsImNhbWxfYmFfc2V0XzMiLCJjYW1sX2pzX2luc3RhbmNlb2YiLCJjYW1sX2dldF9tYWpvcl9idWNrZXQiLCJjYW1sX2JsaXRfYmlnc3RyaW5nX3RvX3N0cmluZyIsInNldF9kaWdpdF9uYXRfbmF0aXZlIiwiZGlnaXQiLCJudGhfZGlnaXRfbmF0X25hdGl2ZSIsImNhbWxfc3RyaW5nX3NldDY0IiwiY2FtbF9ncl9zdGF0ZV9jcmVhdGUiLCJjYW52YXMiLCJjb250ZXh0IiwiY2FtbF9qc193cmFwX2NhbGxiYWNrIiwiY2FtbF9ncl9kcmF3X2FyYyIsImNhbWxfYmFfbWFwX2ZpbGUiLCJ2ZmQiLCJzaGFyZWQiLCJjYW1sX2JhX21hcF9maWxlX2J5dGVjb2RlIiwiYXJnbiIsInVuaXhfc3ltbGluayIsInNyY19yb290IiwiZHN0X3Jvb3QiLCJjYW1sX2JhX2NyZWF0ZV9mcm9tIiwiZGF0YTEiLCJkYXRhMiIsImpzdHlwIiwiY2FtbF90YW5oX2Zsb2F0IiwiY2FtbF9ncl9kcmF3X3N0ciIsImR4IiwiY2FtbF9ncl9kcmF3X3N0cmluZyIsImNhbWxfZ3JfZHJhd19jaGFyIiwiY2FtbF91bm1vdW50IiwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3N0cmluZyIsImNhbWxfbWxfcG9zX2luXzY0IiwiY2FtbF9ncl9kcmF3X2ltYWdlIiwiaW1hZ2UiLCJjYW1sX3JlZ2lzdGVyX2NoYW5uZWxfZm9yX3NwYWNldGltZSIsIl9jaGFubmVsIiwiY2FtbF9zdHJpbmdfc2V0IiwiY2FtbF9zeXNfcm1kaXIiLCJjYW1sX21sX3Bvc19vdXQiLCJjYW1sX3NwYWNldGltZV9lbmFibGVkIiwiY2FtbF9ieXRlc19ub3RlcXVhbCIsImNhbWxfcnVudGltZV9wYXJhbWV0ZXJzIiwiY2FtbF9qc19vYmplY3QiLCJjYW1sX2JhX2NyZWF0ZSIsImRpbXNfbWwiLCJjYW1sX3dlYWtfYmxpdCIsImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSIsImNhbWxfZm1hX2Zsb2F0IiwiU1BMSVQiLCJNSU5fVkFMVUUiLCJFUFNJTE9OIiwiQyIsIkEiLCJCIiwibXVsdGlwbHkiLCJhdCIsImFoaSIsImFsbyIsImJoaSIsImJsbyIsImFkanVzdCIsInNjYWxlIiwieHMiLCJ5cyIsInpzIiwieHkiLCJ1IiwiY2FtbF9ic3dhcDE2IiwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUiLCJjYW1sX2ZpbmFsX3JlZ2lzdGVyIiwiY2FtbF9ncl9kcmF3X3JlY3QiLCJjYW1sX3N0cmluZ19nZXQxNiIsImNhbWxfZXBoZV91bnNldF9kYXRhIiwiY2FtbF9vdXRwdXRfdmFsdWUiLCJjYW1sX2JhX2dldF8zIiwiY2FtbF9lcGhlX2JsaXRfa2V5IiwiY2FtbF9pbml0aWFsX3RpbWUiLCJjYW1sX3N5c190aW1lIiwiY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuIiwiY2FtbF9jaGVja19ib3VuZCIsInVuaXhfZ2V0cHd1aWQiLCJjYW1sX2hhc2hfbWl4X3N0cmluZyIsImNhbWxfaGFzaCIsInNlZWQiLCJxdWV1ZSIsInJkIiwid3IiLCJjYW1sX29ial90YWciLCJGdW5jdGlvbiIsImNhbWxfYmFfdG9fdHlwZWRfYXJyYXkiLCJjYW1sX2J5dGVzX2dldDMyIiwiY2FtbF9mcmV4cF9mbG9hdCIsIm5lZyIsImNhbWxfc3RyaW5nX2dldDY0IiwiY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uIiwiY2FtbF9tbF9wb3Nfb3V0XzY0IiwiY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3ciLCJjYW1sX2Zsb2F0YXJyYXlfYmxpdCIsImNhbWxfZ2V0X21pbm9yX2ZyZWUiLCJjYW1sX3NldF9zdGF0aWNfZW52IiwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0IiwiY2FtbF9qc19uZXciLCJ1bml4X21rZGlyIiwicGVybSIsImNhbWxfZ3JfY3VycmVudF95IiwiY2FtbF9mb3JtYXRfaW50IiwiY2FtbF9vYmpfdHJ1bmNhdGUiLCJjYW1sX2pzX3RvX3N0cmluZyIsImlzX2RpZ2l0X29kZCIsImNhbWxfcnVudGltZV92YXJpYW50IiwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0IiwiY2FtbF9hcnJheV9jb25jYXQiLCJjYW1sX2dyX29wZW5fZ3JhcGgiLCJzcGVjcyIsInN0YXR1cyIsIndpbiIsImRvYyIsInRpdGxlIiwiYm9keSIsImNhbWxfZXBoZV9zZXRfZGF0YSIsImNhbWxfbWFrZV9mbG9hdF92ZWN0IiwiY2FtbF9jYnJ0X2Zsb2F0IiwiY2FtbF9tZW1wcm9mX3N0b3AiLCJjYW1sX2V2ZW50bG9nX3BhdXNlIiwiY2FtbF9ncmVhdGVyZXF1YWwiLCJjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSIsImNhbWxfbG9nMXBfZmxvYXQiLCJjYW1sX2ludDY0X29yIiwiY2FtbF9sYXp5X21ha2VfZm9yd2FyZCIsImxvcl9kaWdpdF9uYXQiLCJjYW1sX2dyX2JsaXRfaW1hZ2UiLCJpbTIiLCJjYW1sX2dyX3dpbmRvd19pZCIsImNhbWxfanNfb25faWUiLCJ1YSIsImNhbWxfaW50NjRfc2hpZnRfcmlnaHQiLCJjYW1sX2JhX2xheW91dCIsImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlIiwiY2FtbF9hcnJheV9zZXQiLCJuZXd2YWwiLCJjYW1sX2J5dGVzX2dyZWF0ZXJlcXVhbCIsInNldF9kaWdpdF9uYXQiLCJjYW1sX2dyX2RvY19vZl9zdGF0ZSIsImNhbWxfbWxfb3V0cHV0X2ludCIsImNhbWxfb2JqX3dpdGhfdGFnIiwiY2FtbF9tbF9jaGFubmVsX3NpemUiLCJjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdCIsImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0Iiwic3R5bGUiLCJleHBfc2lnbiIsInNpZ25fc3RyIiwiY3N0IiwieF9zdHIiLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3QiLCJjYW1sX2JhY2t0cmFjZV9zdGF0dXMiLCJjYW1sX3N5c19hcmd2IiwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIiwiY2FtbF9iYV9maWxsIiwiY2FtbF9tb2RmX2Zsb2F0IiwiY2FtbF9nY19nZXQiLCJjYW1sX2Zsb2F0X2NvbXBhcmUiLCJjYW1sX3N0cmluZ19zZXQzMiIsImNhbWxfcGFyc2VfZW5naW5lIiwidGFibGVzIiwiZW52IiwiRVJSQ09ERSIsImxvb3AiLCJ0ZXN0c2hpZnQiLCJzaGlmdCIsInNoaWZ0X3JlY292ZXIiLCJyZWR1Y2UiLCJSRUFEX1RPS0VOIiwiUkFJU0VfUEFSU0VfRVJST1IiLCJHUk9XX1NUQUNLU18xIiwiR1JPV19TVEFDS1NfMiIsIkNPTVBVVEVfU0VNQU5USUNfQUNUSU9OIiwiQ0FMTF9FUlJPUl9GVU5DVElPTiIsImVudl9zX3N0YWNrIiwiZW52X3Zfc3RhY2siLCJlbnZfc3ltYl9zdGFydF9zdGFjayIsImVudl9zeW1iX2VuZF9zdGFjayIsImVudl9zdGFja3NpemUiLCJlbnZfc3RhY2tiYXNlIiwiZW52X2N1cnJfY2hhciIsImVudl9sdmFsIiwiZW52X3N5bWJfc3RhcnQiLCJlbnZfc3ltYl9lbmQiLCJlbnZfYXNwIiwiZW52X3J1bGVfbGVuIiwiZW52X3J1bGVfbnVtYmVyIiwiZW52X3NwIiwiZW52X3N0YXRlIiwiZW52X2VycmZsYWciLCJ0YmxfdHJhbnNsX2NvbnN0IiwidGJsX3RyYW5zbF9ibG9jayIsInRibF9saHMiLCJ0YmxfbGVuIiwidGJsX2RlZnJlZCIsInRibF9kZ290byIsInRibF9zaW5kZXgiLCJ0YmxfcmluZGV4IiwidGJsX2dpbmRleCIsInRibF90YWJsZXNpemUiLCJ0YmxfdGFibGUiLCJ0YmxfY2hlY2siLCJuMSIsIm4yIiwic3RhdGUxIiwic3AiLCJlcnJmbGFnIiwiYXNwIiwiY2FtbF91cGRhdGVfZHVtbXkiLCJjYW1sX2FycmF5X2ZpbGwiLCJjYW1sX3N5c19ta2RpciIsImNhbWxfc3RyaW5nX25vdGVxdWFsIiwiY2FtbF9ieXRlc19ncmVhdGVydGhhbiIsImNhbWxfZ3JfbWFrZV9pbWFnZSIsImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0IiwiY2FtbF9yZWFkX2ZpbGVfY29udGVudCIsImNhbWxfanNfdG9fZmxvYXQiLCJjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIiwib3JpZ2luIiwiZXZlbnQiLCJlcnJfbm9fcHJlZCIsImVycl9ub19zdWNjIiwiemVybyQyIiwib25lJDIiLCJtaW51c19vbmUkMiIsIm1pbl9pbnQkMiIsIm1heF9pbnQkMiIsImR1bW15X3BvcyIsInplcm9fcG9zIiwic3ViX2Zvcm1hdCIsImZvcm1hdHRpbmdfbGl0IiwibG9jZm10IiwibnVsbCQwIiwiY3VycmVudF9kaXJfbmFtZSIsInBhcmVudF9kaXJfbmFtZSIsImRpcl9zZXAiLCJxdW90ZXF1b3RlIiwibnVsbCQxIiwiY3VycmVudF9kaXJfbmFtZSQwIiwicGFyZW50X2Rpcl9uYW1lJDAiLCJkaXJfc2VwJDAiLCJudWxsJDIiLCJjdXJyZW50X2Rpcl9uYW1lJDEiLCJwYXJlbnRfZGlyX25hbWUkMSIsImRpcl9zZXAkMSIsInplcm8kNCIsIm9uZSQ0IiwiaSIsImVyYXNlX3JlbCIsInJlc3QiLCJyZXN0JDAiLCJyZXN0JDEiLCJyZXN0JDIiLCJyZXN0JDMiLCJyZXN0JDQiLCJyZXN0JDUiLCJyZXN0JDYiLCJyZXN0JDciLCJ0eSIsInJlc3QkOCIsInR5MSIsInJlc3QkOSIsInJlc3QkMTAiLCJyZXN0JDExIiwicmVzdCQxMiIsInJlc3QkMTMiLCJjb25jYXRfZm10dHkiLCJmbXR0eTEiLCJmbXR0eTIiLCJ0eTIiLCJjb25jYXRfZm10IiwiZm10MSIsImZtdDIiLCJwYWQiLCJwYWQkMCIsInByZWMiLCJwYWQkMSIsImljb252IiwicHJlYyQwIiwicGFkJDIiLCJpY29udiQwIiwicHJlYyQxIiwicGFkJDMiLCJpY29udiQxIiwicHJlYyQyIiwicGFkJDQiLCJpY29udiQyIiwicHJlYyQzIiwicGFkJDUiLCJmY29udiIsInBhZCQ2Iiwic3RyIiwiY2hyIiwiZm10dHkiLCJwYWQkNyIsImZtdHR5JDAiLCJwYWQkOCIsInJlc3QkMTQiLCJyZXN0JDE1IiwicmVzdCQxNiIsImZtdGluZ19saXQiLCJyZXN0JDE3IiwiZm10aW5nX2dlbiIsInJlc3QkMTgiLCJyZXN0JDE5IiwiY2hhcl9zZXQiLCJ3aWR0aF9vcHQiLCJyZXN0JDIwIiwiY291bnRlciIsInJlc3QkMjEiLCJyZXN0JDIyIiwiaWduIiwicmVzdCQyMyIsImYiLCJhcml0eSIsInYiLCJyIiwiY3VyIiwic2VlbiIsIm4iLCJmYWlsd2l0aCIsInMiLCJpbnZhbGlkX2FyZyIsIm1pbiIsIngiLCJ5IiwibWF4IiwiYWJzIiwibG5vdCIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbiIsIm1heF9pbnQiLCJtaW5faW50IiwiczEiLCJzMiIsImwxIiwibDIiLCJjaGFyX29mX2ludCIsInN0cmluZ19vZl9ib29sIiwiYiIsImJvb2xfb2Zfc3RyaW5nIiwiYm9vbF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0IiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJsIiwiaSQwIiwidG9fc3RyaW5nIiwib2Zfc3RyaW5nX29wdCIsImFwcGVuZCIsInRsIiwiaGQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsIm9wZW5fZ2VuIiwibW9kZSIsInBlcm0iLCJuYW1lIiwiYyIsIm9wZW5fdGV4dCIsIm9wZW5fYmluIiwiZmx1c2hfYWxsIiwiaXRlciIsImEiLCJvdXRwdXRfYnl0ZXMiLCJvYyIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXQiLCJvZnMiLCJsZW4iLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X3ZhbHVlIiwiY2hhbiIsImNsb3NlIiwiY2xvc2Vfbm9lcnIiLCJvcGVuX2dlbiQwIiwib3Blbl90ZXh0JDAiLCJvcGVuX2JpbiQwIiwiaW5wdXQiLCJpYyIsInVuc2FmZV9yZWFsbHlfaW5wdXQiLCJvZnMkMCIsImxlbiQwIiwibGVuJDEiLCJvZnMkMSIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9saW5lIiwiYnVpbGRfcmVzdWx0IiwiYnVmIiwiYWNjdSIsImJlZyIsImFjY3UkMCIsInJlcyIsImNsb3NlX25vZXJyJDAiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50IiwicmVhZF9pbnRfb3B0IiwicmVhZF9mbG9hdCIsInJlYWRfZmxvYXRfb3B0Iiwic3RyaW5nX29mX2Zvcm1hdCIsInN5bWJvbCIsInN0cjIiLCJzdHIxIiwiZXhpdF9mdW5jdGlvbiIsImF0X2V4aXQiLCJmX3lldF90b19ydW4iLCJvbGRfZXhpdCIsIm5ld19leGl0JDAiLCJuZXdfZXhpdCIsInN1Y2Nlc3MiLCJkb19hdF9leGl0IiwiZXhpdCIsInJldGNvZGUiLCJzZXRfYmluYXJ5X21vZGUiLCJjbG9zZSQwIiwiaW5fY2hhbm5lbF9sZW5ndGgiLCJwb3NfaW4iLCJzZWVrX2luIiwiaW5wdXRfdmFsdWUiLCJpbnB1dF9iaW5hcnlfaW50IiwiaW5wdXRfYnl0ZSIsImlucHV0X2NoYXIiLCJzZXRfYmluYXJ5X21vZGUkMCIsIm91dF9jaGFubmVsX2xlbmd0aCIsInBvc19vdXQiLCJzZWVrX291dCIsIm91dHB1dF9iaW5hcnlfaW50Iiwib3V0cHV0X2J5dGUiLCJvdXRwdXRfY2hhciIsImZsdXNoIiwibGVmdCIsInJpZ2h0IiwiaXNfbGVmdCIsImlzX3JpZ2h0IiwiZmluZF9sZWZ0IiwiZmluZF9yaWdodCIsIm1hcF9sZWZ0IiwiZSIsIm1hcF9yaWdodCIsIm1hcCIsInYkMCIsImZvbGQiLCJlcXVhbCIsImUxIiwiZTIiLCJ2MiIsInYyJDAiLCJjb21wYXJlIiwibWF0Y2gkMSIsImlzX2Jsb2NrIiwiZG91YmxlX2ZpZWxkIiwic2V0X2RvdWJsZV9maWVsZCIsImZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3RvciIsImxhc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yXyIsImxhenlfdGFnIiwiY2xvc3VyZV90YWciLCJvYmplY3RfdGFnIiwiaW5maXhfdGFnIiwiZm9yd2FyZF90YWciLCJub19zY2FuX3RhZyIsImFic3RyYWN0X3RhZyIsInN0cmluZ190YWciLCJkb3VibGVfdGFnIiwiZG91YmxlX2FycmF5X3RhZyIsImN1c3RvbV90YWciLCJpbnRfdGFnIiwib3V0X29mX2hlYXBfdGFnIiwidW5hbGlnbmVkX3RhZyIsImluZm8iLCJvYmoiLCJzdGFydF9lbnYiLCJvZl92YWwiLCJzbG90IiwiaWQiLCJleHRlbnNpb25fY29uc3RydWN0b3IiLCJleHRlbnNpb25fbmFtZSIsImV4dGVuc2lvbl9pZCIsIm1heF9lcGhlX2xlbmd0aCIsImNyZWF0ZSIsImxlbmd0aCIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IiwibyIsIm1zZyIsImdldF9rZXkiLCJnZXRfa2V5X2NvcHkiLCJzZXRfa2V5IiwidW5zZXRfa2V5IiwiY2hlY2tfa2V5IiwiYmxpdF9rZXkiLCJvMSIsIm8yIiwicmFpc2VfdW5kZWZpbmVkIiwiZm9yY2VfbGF6eV9ibG9jayIsImJsayIsImNsb3N1cmUiLCJyZXN1bHQiLCJmb3JjZV92YWxfbGF6eV9ibG9jayIsImZvcmNlIiwibHp2IiwidCIsImZvcmNlX3ZhbCIsInRvX2xhenkiLCJmcm9tX3ZhbCIsImlzX3ZhbCIsIm1hcCQwIiwibWFwX3ZhbCIsImVtcHR5IiwicmV0dXJuJDAiLCJjb25zIiwibmV4dCIsImFwcGVuZCQwIiwic2VxMSIsInNlcTIiLCJtYXAkMSIsInNlcSIsImZpbHRlcl9tYXAiLCJzZXEkMCIsImZpbHRlciIsImNvbmNhdCIsImZsYXRfbWFwIiwiZm9sZF9sZWZ0IiwiYWNjIiwiYWNjJDAiLCJhY2MkMSIsInVuZm9sZCIsInUiLCJ1JDAiLCJpc19lbXB0eSIsInhzIiwidW5jb25zIiwieHMkMCIsImxlbmd0aCQwIiwieHMkMSIsIml0ZXJpIiwiZm9sZF9sZWZ0aSIsImFjY3UkMSIsImZvcl9hbGwiLCJwIiwiZXhpc3RzIiwiZmluZCIsImZpbmRfbWFwIiwiaXRlcjIiLCJ5cyIsInlzJDAiLCJ5cyQxIiwiZm9sZF9sZWZ0MiIsImZvcl9hbGwyIiwiZXhpc3RzMiIsImVxdWFsJDAiLCJlcSIsImNvbXBhcmUkMCIsImNtcCIsImluaXRfYXV4IiwiaiIsImluaXQiLCJyZXBlYXQiLCJmb3JldmVyIiwiY3ljbGVfbm9uZW1wdHkiLCJjeWNsZSIsIml0ZXJhdGUxIiwiaXRlcmF0ZSIsIm1hcGlfYXV4IiwibWFwaSIsInRhaWxfc2NhbiIsInMkMCIsInNjYW4iLCJ0YWtlX2F1eCIsInRha2UiLCJkcm9wIiwibiQwIiwibiQxIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJub2RlIiwiZ3JvdXAiLCJmYWlsdXJlIiwibWVtb2l6ZSIsIm9uY2UiLCJhY3Rpb24iLCJ6aXAiLCJtYXAyIiwiaW50ZXJsZWF2ZSIsInNvcnRlZF9tZXJnZTEiLCJzb3J0ZWRfbWVyZ2UiLCJtYXBfZnN0IiwieHlzIiwieHlzJDAiLCJtYXBfc25kIiwidW56aXAiLCJmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAiLCJmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIiwieiIsInBhcnRpdGlvbl9tYXAiLCJwYXJ0aXRpb24iLCJwZWVsIiwieHNzIiwidHJhbnNwb3NlIiwidGFpbHMiLCJoZWFkcyIsInJlbWFpbmRlcnMiLCJ4c3MkMCIsInRhaWxzJDAiLCJoZWFkcyQwIiwibWFwX3Byb2R1Y3QiLCJwcm9kdWN0Iiwib2ZfZGlzcGVuc2VyIiwiaXQiLCJ0b19kaXNwZW5zZXIiLCJpbnRzIiwibm9uZSIsInNvbWUiLCJ2YWx1ZSIsImRlZmF1bHQkMCIsImdldCQwIiwiYmluZCIsImpvaW4iLCJtYXAkMiIsImZvbGQkMCIsIml0ZXIkMCIsImlzX25vbmUiLCJpc19zb21lIiwiZXF1YWwkMSIsIm8wIiwidjEiLCJ2MCIsImNvbXBhcmUkMSIsInRvX3Jlc3VsdCIsInRvX2xpc3QiLCJ0b19zZXEiLCJvayIsImVycm9yIiwidmFsdWUkMCIsImdldF9vayIsImdldF9lcnJvciIsImJpbmQkMCIsImpvaW4kMCIsIm1hcCQzIiwibWFwX2Vycm9yIiwiZm9sZCQxIiwiaXRlciQxIiwiaXRlcl9lcnJvciIsImlzX29rIiwiaXNfZXJyb3IiLCJlcXVhbCQyIiwicjAiLCJyMSIsImNvbXBhcmUkMiIsInRvX29wdGlvbiIsInRvX2xpc3QkMCIsInRvX3NlcSQwIiwiZXF1YWwkMyIsImNvbXBhcmUkMyIsInRvX2Zsb2F0IiwidG9fc3RyaW5nJDAiLCJlc2NhcGVkIiwibG93ZXJjYXNlIiwidXBwZXJjYXNlIiwibG93ZXJjYXNlX2FzY2lpIiwidXBwZXJjYXNlX2FzY2lpIiwiY29tcGFyZSQ0IiwiYzEiLCJjMiIsImVxdWFsJDQiLCJtaW4kMCIsIm1heCQwIiwibG9fYm91bmQiLCJoaV9ib3VuZCIsImJvbSIsInJlcCIsInN1Y2MiLCJwcmVkIiwiaXNfdmFsaWQiLCJvZl9pbnQiLCJpc19jaGFyIiwib2ZfY2hhciIsInRvX2NoYXIiLCJ1bnNhZmVfdG9fY2hhciIsImVxdWFsJDUiLCJjb21wYXJlJDUiLCJoYXNoIiwidXRmX2RlY29kZV9pc192YWxpZCIsImQiLCJ1dGZfZGVjb2RlX2xlbmd0aCIsInV0Zl9kZWNvZGVfdWNoYXIiLCJ1dGZfZGVjb2RlIiwiZGVjX2ludmFsaWQiLCJ1dGZfOF9ieXRlX2xlbmd0aCIsInV0Zl8xNl9ieXRlX2xlbmd0aCIsImxlbmd0aCQxIiwicGFyYW0kMCIsImNvbnMkMCIsIm50aCIsImwkMCIsImwkMSIsIm50aF9vcHQiLCJyZXZfYXBwZW5kIiwibDEkMCIsImwyJDAiLCJsMSQxIiwibDIkMSIsInJldiIsImluaXRfYXV4JDAiLCJwYXJhbSIsImEyIiwiYTEiLCJwYWlyIiwieCQwIiwicnkiLCJyeCIsInQyIiwiaDIiLCJ0MSIsImgxIiwicmV2X3NvcnQiLCJ4MiIsIngxIiwidGwkMSIsIngzIiwieDIkMCIsIngxJDAiLCJuMSIsIm4yIiwic29ydCIsInRsJDAiLCJjJDAiLCJjJDEiLCJjJDIiLCJjJDMiLCJjJDQiLCJjJDUiLCJjJDYiLCJhY2N1JDIiLCJhdXgiLCJ0YWlsIiwiZGlyZWN0IiwiZGVwdGgiLCJ6ZXJvIiwib25lIiwibWludXNfb25lIiwiYWJzJDAiLCJtYXhfaW50JDAiLCJtaW5faW50JDAiLCJsb2dub3QiLCJlcXVhbCQ3IiwiY29tcGFyZSQ3IiwibWluJDEiLCJtYXgkMSIsInRvX3N0cmluZyQxIiwic3ltYm9sJDAiLCJkc3RvZmYiLCJzcmNvZmYiLCJjcHlsZW4iLCJvZnMxIiwib2ZzMiIsInNlcCIsInNlcGxlbiIsImRzdCIsImlzX3NwYWNlIiwiYXBwbHkxIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJpbmRleF9yZWMiLCJsaW0iLCJpJDEiLCJpbmRleF9yZWNfb3B0IiwicmluZGV4X3JlYyIsInJpbmRleF9yZWNfb3B0IiwibmV3X2xlbiIsIm5ld19idWYiLCJnZXQkMSIsInNldCQwIiwiZGVjX3JldCIsIm5vdF9pbl94ODBfdG9feEJGIiwibm90X2luX3hBMF90b194QkYiLCJub3RfaW5feDgwX3RvX3g5RiIsIm5vdF9pbl94OTBfdG9feEJGIiwibm90X2luX3g4MF90b194OEYiLCJ1dGZfOF91Y2hhcl8zIiwiYjAiLCJiMSIsImIyIiwidXRmXzhfdWNoYXJfNCIsImIzIiwiaSQ0IiwiYjEkMSIsImkkNSIsImIyJDEiLCJpJDYiLCJpJDEwIiwiYjEkMyIsImkkMTEiLCJiMiQzIiwiaSQxMiIsImIzJDEiLCJpJDciLCJiMSQyIiwiaSQ4IiwiYjIkMiIsImkkOSIsImIzJDAiLCJpJDEzIiwiYjEkNCIsImkkMTQiLCJiMiQ0IiwiaSQyIiwiYjEkMCIsImkkMyIsImIyJDAiLCJpJDE1IiwiYjEkNSIsInNldCIsImxhc3QiLCJsYXN0JDAiLCJsYXN0JDEiLCJsYXN0JDMiLCJsYXN0JDIiLCJsYXN0JDQiLCJsYXN0JDUiLCJoaSIsImxvIiwiaXNfc3BhY2UkMCIsImluZGV4X3JlYyQwIiwiaW5kZXhfcmVjX29wdCQwIiwicmluZGV4X3JlYyQwIiwicmluZGV4X3JlY19vcHQkMCIsImciLCJlcXVhbCQxMCIsImNvbXBhcmUkMTAiLCJ0b19zdHJpbmckMiIsInRvX2J1ZmZlciIsImJ1ZmYiLCJmbGFncyIsImhlYWRlcl9zaXplIiwiZGF0YV9zaXplIiwidG90YWxfc2l6ZSIsImZyb21fYnl0ZXMiLCJmcm9tX3N0cmluZyIsInN4Iiwic3kiLCJsYSIsImxiIiwicmVzJDAiLCJsaXN0X2xlbmd0aCIsInBhcmFtJDEiLCJoZCQwIiwiaW5wdXRfYXJyYXkiLCJlbHQiLCJvdXRwdXRfYXJyYXkiLCJlbHQkMCIsImFjYyQyIiwiYTAiLCJiaSIsImFpIiwibmEiLCJuYiIsIm1heHNvbiIsImkzMSIsInRyaWNrbGVkb3duIiwidHJpY2tsZSIsImJ1YmJsZWRvd24iLCJidWJibGUiLCJlJDAiLCJmYXRoZXIiLCJtZXJnZSIsInNyYzFvZnMiLCJzcmMxbGVuIiwic3JjMiIsInNyYzJvZnMiLCJzcmMybGVuIiwiZHN0b2ZzIiwic3JjMXIiLCJzcmMyciIsInMyJDEiLCJzMSQxIiwiaTEiLCJpMiIsImkyJDAiLCJkJDAiLCJzMiQwIiwiaTEkMCIsImQkMSIsInMxJDAiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwiemVybyQwIiwib25lJDAiLCJtaW51c19vbmUkMCIsImlzX2Zpbml0ZSIsImlzX2luZmluaXRlIiwiaXNfbmFuIiwicGkiLCJpc19pbnRlZ2VyIiwic3VjYyQwIiwicHJlZCQwIiwiZXF1YWwkMTEiLCJtaW4kMiIsIm1heCQyIiwibWluX21heCIsIm1pbl9udW0iLCJtYXhfbnVtIiwibWluX21heF9udW0iLCJoYXNoJDAiLCJ1bnNhZmVfZmlsbCIsImNoZWNrIiwibWFrZSQyIiwiaW5pdCQ0IiwiYXBwZW5kJDIiLCJjb25jYXQkMyIsImhsZW4iLCJzdWIkMiIsImNvcHkkMiIsImZpbGwkMSIsImJsaXQkMiIsInNyYyIsInNvZnMiLCJkb2ZzIiwidG9fbGlzdCQyIiwib2ZfbGlzdCQwIiwiaCIsIml0ZXIkNiIsIml0ZXIyJDIiLCJtYXAkOCIsIm1hcDIkMiIsIml0ZXJpJDQiLCJtYXBpJDQiLCJmb2xkX2xlZnQkNCIsImZvbGRfcmlnaHQkMyIsImV4aXN0cyQ0IiwiZm9yX2FsbCQ0IiwibWVtJDEiLCJtZW1faWVlZSIsInNvcnQkMCIsInN0YWJsZV9zb3J0IiwidG9fc2VxJDUiLCJ0b19zZXFpJDIiLCJvZl9zZXEkMyIsIm1hcF90b19hcnJheSIsIm1hcF9mcm9tX2FycmF5IiwiemVybyQxIiwib25lJDEiLCJtaW51c19vbmUkMSIsInN1Y2MkMSIsInByZWQkMSIsImFicyQxIiwibWluX2ludCQxIiwibWF4X2ludCQxIiwibG9nbm90JDAiLCJ1bnNpZ25lZF90b19pbnQiLCJ0b19zdHJpbmckMyIsIm9mX3N0cmluZ19vcHQkMCIsImNvbXBhcmUkMTEiLCJlcXVhbCQxMiIsInVuc2lnbmVkX2NvbXBhcmUiLCJtIiwibWluJDMiLCJtYXgkMyIsInVuc2lnbmVkX2RpdiIsInEiLCJ1bnNpZ25lZF9yZW0iLCJzdWNjJDIiLCJwcmVkJDIiLCJhYnMkMiIsImxvZ25vdCQxIiwibWF4X2ludCQzIiwidW5zaWduZWRfdG9faW50JDAiLCJ0b19zdHJpbmckNCIsIm9mX3N0cmluZ19vcHQkMSIsImNvbXBhcmUkMTIiLCJlcXVhbCQxMyIsInVuc2lnbmVkX2NvbXBhcmUkMCIsIm1pbiQ0IiwibWF4JDQiLCJ1bnNpZ25lZF9kaXYkMCIsInVuc2lnbmVkX3JlbSQwIiwiemVybyQzIiwib25lJDMiLCJtaW51c19vbmUkMyIsInN1Y2MkMyIsInByZWQkMyIsImFicyQzIiwibWluX2ludCQzIiwibWF4X2ludCQ0IiwibG9nbm90JDIiLCJ1bnNpZ25lZF90b19pbnQkMSIsInRvX3N0cmluZyQ1Iiwib2Zfc3RyaW5nX29wdCQyIiwiY29tcGFyZSQxMyIsImVxdWFsJDE0IiwidW5zaWduZWRfY29tcGFyZSQxIiwibWluJDUiLCJtYXgkNSIsInVuc2lnbmVkX2RpdiQxIiwidW5zaWduZWRfcmVtJDEiLCJlbmdpbmUiLCJ0YmwiLCJzdGF0ZSIsIm5ld19lbmdpbmUiLCJmcm9tX2Z1bmN0aW9uIiwib3B0Iiwic3RoIiwid2l0aF9wb3NpdGlvbnMiLCJhdXhfYnVmZmVyIiwibGV4YnVmIiwicmVhZCIsIm5ld2xlbiIsIm5ld2J1ZiIsImZyb21fY2hhbm5lbCIsImZyb21fc3RyaW5nJDAiLCJzZXRfcG9zaXRpb24iLCJwb3NpdGlvbiIsInNldF9maWxlbmFtZSIsImZuYW1lIiwibGV4ZW1lIiwic3ViX2xleGVtZSIsInN1Yl9sZXhlbWVfb3B0Iiwic3ViX2xleGVtZV9jaGFyIiwic3ViX2xleGVtZV9jaGFyX29wdCIsImxleGVtZV9jaGFyIiwibGV4ZW1lX3N0YXJ0IiwibGV4ZW1lX2VuZCIsImxleGVtZV9zdGFydF9wIiwibGV4ZW1lX2VuZF9wIiwibmV3X2xpbmUiLCJsY3AiLCJmbHVzaF9pbnB1dCIsImVudiIsImdyb3dfc3RhY2tzIiwib2xkc2l6ZSIsIm5ld3NpemUiLCJuZXdfcyIsIm5ld192IiwibmV3X3N0YXJ0IiwibmV3X2VuZCIsImNsZWFyX3BhcnNlciIsImN1cnJlbnRfbG9va2FoZWFkX2Z1biIsInl5cGFyc2UiLCJ0YWJsZXMiLCJzdGFydCIsImxleGVyIiwiaW5pdF9hc3AiLCJpbml0X3NwIiwiaW5pdF9zdGFja2Jhc2UiLCJpbml0X3N0YXRlIiwiaW5pdF9jdXJyX2NoYXIiLCJpbml0X2x2YWwiLCJpbml0X2VycmZsYWciLCJjbWQiLCJhcmciLCJhcmckMCIsImFyZyQxIiwiY21kJDAiLCJleG4iLCJjdXJyX2NoYXIiLCJ0b2siLCJwZWVrX3ZhbCIsInN5bWJvbF9zdGFydF9wb3MiLCJzdCIsImVuIiwic3ltYm9sX2VuZF9wb3MiLCJyaHNfc3RhcnRfcG9zIiwicmhzX2VuZF9wb3MiLCJzeW1ib2xfc3RhcnQiLCJzeW1ib2xfZW5kIiwicmhzX3N0YXJ0IiwicmhzX2VuZCIsImlzX2N1cnJlbnRfbG9va2FoZWFkIiwicGFyc2VfZXJyb3IiLCJoZWlnaHQiLCJobCIsImgkMCIsImhyIiwiYmFsIiwibHIiLCJsdiIsImxsIiwibHJyIiwibHJ2IiwibHJsIiwicnIiLCJydiIsInJsIiwicmxyIiwicmx2IiwicmxsIiwiYWRkIiwic2luZ2xldG9uIiwiYWRkX21pbl9lbGVtZW50IiwiYWRkX21heF9lbGVtZW50IiwicmgiLCJsaCIsIm1pbl9lbHQiLCJtaW5fZWx0X29wdCIsIm1heF9lbHQiLCJtYXhfZWx0X29wdCIsInJlbW92ZV9taW5fZWx0IiwiciQwIiwic3BsaXQiLCJwcmVzIiwicHJlcyQwIiwibWVtIiwicmVtb3ZlIiwidW5pb24iLCJyMiIsInIyJDAiLCJyMSQwIiwiaW50ZXIiLCJzcGxpdF9iaXMiLCJkaXNqb2ludCIsImNvbnNfZW51bSIsInMkMSIsImUkMSIsImUyJDIiLCJlMSQyIiwiZTIkMCIsImUxJDAiLCJlMiQxIiwiZTEkMSIsInN1YnNldCIsInB2IiwibGYiLCJsdCIsInJmIiwicnQiLCJjYXJkaW5hbCIsImVsZW1lbnRzX2F1eCIsImVsZW1lbnRzIiwiZmluZF9maXJzdCIsImZpbmRfZmlyc3Rfb3B0IiwiZmluZF9sYXN0IiwiZmluZF9sYXN0X29wdCIsImZpbmRfb3B0IiwidHJ5X2pvaW4iLCJ2JDEiLCJvZl9saXN0Iiwic3ViIiwibCQzIiwieDAiLCJsJDQiLCJ4MCQwIiwibCQ1IiwieDAkMSIsIm5sIiwibWlkIiwibCQyIiwieDQiLCJhZGRfc2VxIiwib2Zfc2VxIiwic2VxX29mX2VudW0iLCJzbm9jX2VudW0iLCJyZXZfc2VxX29mX2VudW0iLCJ0b19yZXZfc2VxIiwidG9fc2VxX2Zyb20iLCJsb3ciLCJsZCIsImxyZCIsInJkIiwicmxkIiwiZGF0YSIsIm1pbl9iaW5kaW5nIiwibWluX2JpbmRpbmdfb3B0IiwibWF4X2JpbmRpbmciLCJtYXhfYmluZGluZ19vcHQiLCJyZW1vdmVfbWluX2JpbmRpbmciLCJ1cGRhdGUiLCJkYXRhJDAiLCJtJDAiLCJhZGRfbWluX2JpbmRpbmciLCJrIiwiYWRkX21heF9iaW5kaW5nIiwiY29uY2F0X29yX2pvaW4iLCJkMSIsImQyIiwiZDIkMCIsImQxJDAiLCJkMiQxIiwiZDEkMSIsInB2ZCIsImZ2ZCIsIm0kMSIsIm0xIiwibTIiLCJiaW5kaW5nc19hdXgiLCJiaW5kaW5ncyIsImNyZWF0ZSQwIiwiY2xlYXIiLCJjb3B5JDMiLCJwdXNoIiwicG9wIiwicG9wX29wdCIsInRvcCIsInRvcF9vcHQiLCJpc19lbXB0eSQwIiwibGVuZ3RoJDIiLCJpdGVyJDciLCJmb2xkJDIiLCJ0b19zZXEkNiIsIm9mX3NlcSQ0IiwiY3JlYXRlJDEiLCJjbGVhciQwIiwiY2VsbCIsInBlZWsiLCJjb250ZW50IiwicGVla19vcHQiLCJ0YWtlJDAiLCJ0YWtlX29wdCIsImNvcHkkNCIsInFfcmVzIiwicHJldiIsImlzX2VtcHR5JDEiLCJsZW5ndGgkMyIsIml0ZXIkOCIsImZvbGQkMyIsInRyYW5zZmVyIiwicTEiLCJxMiIsInRvX3NlcSQ3IiwiYWRkX3NlcSQwIiwib2Zfc2VxJDUiLCJjb3VudCIsImZpbGxfYnVmZiIsImdldF9kYXRhIiwiZDExIiwiYSQwIiwiYSQxIiwicGVla19kYXRhIiwicGVlayQwIiwianVua19kYXRhIiwianVuayIsIm5nZXRfZGF0YSIsImFsIiwibnBlZWsiLCJlbXB0eSQyIiwiaXRlciQ5Iiwic3RybSIsImZyb20iLCJvZl9saXN0JDEiLCJvZl9zdHJpbmciLCJvZl9ieXRlcyQwIiwib2ZfY2hhbm5lbCIsImlhcHAiLCJpY29ucyIsImlzaW5nIiwibGFwcCIsImxjb25zIiwibHNpbmciLCJzZW1wdHkiLCJzbGF6eSIsImR1bXBfZGF0YSIsImR1bXAiLCJjcmVhdGUkMiIsImNvbnRlbnRzIiwidG9fYnl0ZXMkMCIsInN1YiQzIiwiYmxpdCQzIiwibnRoJDAiLCJsZW5ndGgkNCIsImNsZWFyJDEiLCJyZXNldCIsInJlc2l6ZSIsIm1vcmUiLCJvbGRfcG9zIiwib2xkX2xlbiIsIm5ld19idWZmZXIiLCJhZGRfY2hhciIsInBvcyIsInVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCIsInVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXgiLCJhZGRfdXRmXzhfdWNoYXIiLCJhZGRfdXRmXzE2YmVfdWNoYXIiLCJhZGRfdXRmXzE2bGVfdWNoYXIiLCJhZGRfc3Vic3RyaW5nIiwib2Zmc2V0IiwibmV3X3Bvc2l0aW9uIiwiYWRkX3N1YmJ5dGVzIiwiYWRkX3N0cmluZyIsImFkZF9ieXRlcyIsImFkZF9idWZmZXIiLCJicyIsImFkZF9jaGFubmVsIiwiYWxyZWFkeV9yZWFkIiwidG9fcmVhZCIsImFscmVhZHlfcmVhZCQwIiwidG9fcmVhZCQwIiwib3V0cHV0X2J1ZmZlciIsImFkZF9zdWJzdGl0dXRlIiwibGltJDEiLCJwcmV2aW91cyIsImN1cnJlbnQiLCJvcGVuaW5nIiwibGltJDAiLCJzdG9wIiwiayQyIiwiayQwIiwiayQxIiwibmV4dF9pIiwiaWRlbnQiLCJ0cnVuY2F0ZSIsInRvX3NlcSQ4IiwidG9fc2VxaSQzIiwiYWRkX3NlcSQxIiwib2Zfc2VxJDYiLCJhZGRfaW50OCIsImFkZF9pbnQxNl9uZSIsImFkZF9pbnQzMl9uZSIsImFkZF9pbnQ2NF9uZSIsImFkZF9pbnQxNl9sZSIsImFkZF9pbnQxNl9iZSIsImFkZF9pbnQzMl9sZSIsImFkZF9pbnQzMl9iZSIsImFkZF9pbnQ2NF9sZSIsImFkZF9pbnQ2NF9iZSIsImNyZWF0ZV9jaGFyX3NldCIsImFkZF9pbl9jaGFyX3NldCIsInN0cl9pbmQiLCJtYXNrIiwiZnJlZXplX2NoYXJfc2V0IiwicmV2X2NoYXJfc2V0IiwiY2hhcl9zZXQkMCIsImlzX2luX2NoYXJfc2V0IiwicGFkX29mX3BhZF9vcHQiLCJwYWRfb3B0Iiwid2lkdGgiLCJwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQiLCJmbXQiLCJwYWRfb3B0JDAiLCJwYWRfb3B0JDEiLCJwYWRfb3B0JDIiLCJwYWRfb3B0JDMiLCJwYWRfb3B0JDQiLCJwcmVjX29wdCIsInBhZF9vcHQkNSIsIm5kZWMiLCJwYWRfb3B0JDYiLCJwYWRfb3B0JDciLCJwYWRfb3B0JDgiLCJkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiIsImJ1ZmZlcl9jcmVhdGUiLCJpbml0X3NpemUiLCJidWZmZXJfY2hlY2tfc2l6ZSIsIm92ZXJoZWFkIiwibWluX2xlbiIsIm5ld19zdHIiLCJidWZmZXJfYWRkX2NoYXIiLCJidWZmZXJfYWRkX3N0cmluZyIsInN0cl9sZW4iLCJidWZmZXJfY29udGVudHMiLCJjaGFyX29mX2ljb252IiwiY2hhcl9vZl9mY29udiIsImNGIiwiYnByaW50X3BhZHR5IiwicGFkdHkiLCJicHJpbnRfaWdub3JlZF9mbGFnIiwiaWduX2ZsYWciLCJicHJpbnRfcGFkX29wdCIsImJwcmludF9wYWRkaW5nIiwicGFkdHkkMCIsImJwcmludF9wcmVjaXNpb24iLCJicHJpbnRfaWNvbnZfZmxhZyIsImJwcmludF9hbHRpbnRfZm10IiwiYnByaW50X2Zjb252X2ZsYWciLCJzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQiLCJzdHIkMCIsImJwcmludF9jaGFyX2xpdGVyYWwiLCJicHJpbnRfc3RyaW5nX2xpdGVyYWwiLCJicHJpbnRfZm10dHkiLCJzdWJfZm10dHkiLCJzdWJfZm10dHkkMCIsImludF9vZl9jdXN0b21fYXJpdHkiLCJzdHJpbmdfb2ZfZm10IiwiZm10aXRlciIsImZtdCQwIiwiaWduX2ZsYWckMCIsImNociQwIiwic3RyJDEiLCJpc19hbG9uZSQwIiwiaXNfYWxvbmUiLCJhZnRlciIsImJlZm9yZSIsImokMCIsImokMSIsImZtdCQxIiwic3ltbSIsInRyYW5zIiwicmVzdDIiLCJyZXN0MiQwIiwicmVzdDIkMSIsInJlc3QyJDIiLCJyZXN0MiQzIiwicmVzdDIkNCIsInJlc3QyJDUiLCJyZXN0MiQ2IiwicmVzdDIkNyIsInR5MiQwIiwicmVzdDIkOCIsInR5MjIiLCJ0eTIxIiwiZm10dHlfcmVsX2RldCIsImY0IiwiZjIiLCJyZXN0MiQ5IiwicmVzdDIkMTAiLCJyZXN0MiQxMSIsInJlc3QyJDEyIiwicmVzdDIkMTMiLCJkZSIsImVkIiwiYWYiLCJmYSIsImRlJDAiLCJlZCQwIiwiYWYkMCIsImZhJDAiLCJkZSQxIiwiZWQkMSIsImFmJDEiLCJmYSQxIiwiZGUkMiIsImVkJDIiLCJhZiQyIiwiZmEkMiIsImRlJDMiLCJlZCQzIiwiYWYkMyIsImZhJDMiLCJkZSQ0IiwiZWQkNCIsImFmJDQiLCJmYSQ0IiwiZGUkNSIsImVkJDUiLCJhZiQ1IiwiZmEkNSIsImRlJDYiLCJlZCQ2IiwiYWYkNiIsImZhJDYiLCJkZSQ3IiwiZWQkNyIsImFmJDciLCJmYSQ3IiwiZGUkOCIsImVkJDgiLCJhZiQ4IiwiZmEkOCIsImpkIiwiZGoiLCJnYSIsImFnIiwiZGUkOSIsImVkJDkiLCJhZiQ5IiwiZmEkOSIsImRlJDEwIiwiZWQkMTAiLCJhZiQxMCIsImZhJDEwIiwiZGUkMTEiLCJlZCQxMSIsImFmJDExIiwiZmEkMTEiLCJkZSQxMiIsImVkJDEyIiwiYWYkMTIiLCJmYSQxMiIsImRlJDEzIiwiZWQkMTMiLCJhZiQxMyIsImZhJDEzIiwiZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IiwiZm10dHlfb2ZfcGFkZGluZ19mbXR0eSIsImZtdHR5X29mX2N1c3RvbSIsImFyaXR5JDAiLCJmbXR0eV9vZl9mbXQiLCJ0eV9yZXN0IiwicHJlY190eSIsInR5X3Jlc3QkMCIsInByZWNfdHkkMCIsInR5X3Jlc3QkMSIsInByZWNfdHkkMSIsInR5X3Jlc3QkMiIsInByZWNfdHkkMiIsInR5X3Jlc3QkMyIsInByZWNfdHkkMyIsImZtdHR5JDEiLCJmbXR0eSQyIiwiZm10dHkkMyIsInR5JDAiLCJmbXR0eSQ0IiwiZm10dHkkNSIsInR5cGVfcGFkZGluZyIsInciLCJ0eXBlX3BhZHByZWMiLCJ0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGkiLCJ0eXBlX2Zvcm1hdF9nZW4iLCJmbXR0eV9yZXN0Iiwic3ViX2ZtdHR5X3Jlc3QiLCJzdWJfZm10dHlfcmVzdCQwIiwiZm10dHlfcmVzdCQwIiwic3ViX2ZtdHR5X3Jlc3QkMSIsInN1Yl9mbXR0eV9yZXN0JDIiLCJmbXR0eV9yZXN0JDEiLCJzdWJfZm10dHlfcmVzdCQzIiwiZm10JDIiLCJzdWJfZm10dHlfcmVzdCQ0IiwiZm10dHlfcmVzdCQyIiwic3ViX2ZtdHR5X3Jlc3QkNSIsImZtdCQzIiwic3ViX2ZtdHR5X3Jlc3QkNiIsImZtdHR5X3Jlc3QkMyIsInN1Yl9mbXR0eV9yZXN0JDciLCJmbXQkNCIsInN1Yl9mbXR0eV9yZXN0JDgiLCJmbXR0eV9yZXN0JDQiLCJzdWJfZm10dHlfcmVzdCQ5IiwiZm10JDUiLCJzdWJfZm10dHlfcmVzdCQxMCIsImZtdHR5X3Jlc3QkNSIsInN1Yl9mbXR0eV9yZXN0JDExIiwiZm10JDYiLCJzdWJfZm10dHlfcmVzdCQxMiIsImZtdHR5X3Jlc3QkNiIsInN1Yl9mbXR0eV9yZXN0JDEzIiwiZm10JDciLCJzdWJfZm10dHlfcmVzdCQxNCIsImZtdHR5X3Jlc3QkNyIsInN1YjJfZm10dHkiLCJzdWJfZm10dHlfcmVzdCQxNSIsInN1YjJfZm10dHkkMCIsImZtdCQ4Iiwic3ViX2ZtdHR5X3Jlc3QkMTYiLCJmbXR0eV9yZXN0JDgiLCJzdWIyX2ZtdHR5JDEiLCJzdWIxX2ZtdHR5Iiwic3ViX2ZtdHR5X3Jlc3QkMTciLCJzdWIyX2ZtdHR5JDIiLCJzdWIxX2ZtdHR5JDAiLCJmbXQkOSIsInN1Yl9mbXR0eV9yZXN0JDE4IiwiZm10dHlfcmVzdCQ5Iiwic3ViX2ZtdHR5X3Jlc3QkMTkiLCJmbXQkMTAiLCJzdWJfZm10dHlfcmVzdCQyMCIsImZtdHR5X3Jlc3QkMTAiLCJzdWJfZm10dHlfcmVzdCQyMSIsImZtdCQxMSIsInN1Yl9mbXR0eV9yZXN0JDIyIiwiZm10dHlfcmVzdCQxMSIsInN1Yl9mbXR0eV9yZXN0JDIzIiwiZm10JDEyIiwic3ViX2ZtdHR5X3Jlc3QkMjQiLCJmbXR0eV9yZXN0JDEyIiwic3ViX2ZtdHR5X3Jlc3QkMjUiLCJmbXQkMTMiLCJzdWJfZm10dHlfcmVzdCQyNiIsImZtdF9yZXN0IiwiZm10X3Jlc3QkMCIsImZtdF9yZXN0JDEiLCJmbXRfcmVzdCQyIiwiZm10X3Jlc3QkMyIsImZtdF9yZXN0JDQiLCJmbXRfcmVzdCQ1IiwicHJlYyQ0IiwiZm10dHkkNiIsImZtdF9yZXN0JDYiLCJwcmVjJDUiLCJwcmVjJDYiLCJmbXR0eSQ3IiwiZm10X3Jlc3QkNyIsInByZWMkNyIsInByZWMkOCIsImZtdHR5JDgiLCJmbXRfcmVzdCQ4IiwiZm10dHkkOSIsImZtdF9yZXN0JDkiLCJmbXR0eSQxMCIsImZtdF9yZXN0JDEwIiwiZm10dHkkMTEiLCJmbXRfcmVzdCQxMSIsImZtdHR5JDEyIiwiZm10X3Jlc3QkMTIiLCJmbXR0eSQxMyIsInN1Yl9mbXR0eTEiLCJmbXRfcmVzdCQxMyIsInN1Yl9mbXR0eSQxIiwiZm10dHkkMTQiLCJmbXQkMTQiLCJmbXRfcmVzdCQxNCIsImZtdHR5JDE1IiwiZm10JDE1IiwiZm10X3Jlc3QkMTUiLCJmbXR0eSQxNiIsImZtdCQxNiIsImZtdF9yZXN0JDE2IiwiZm10dHkkMTciLCJmbXQkMTciLCJmbXRfcmVzdCQxNyIsImZvcm1hdHRpbmdfZ2VuIiwiZm10dHkzIiwiZm10MyIsImZtdDEkMCIsImZtdHR5MiQwIiwiZm10MiQwIiwiZm10dHkzJDAiLCJmbXQzJDAiLCJmbXR0eV9yZXN0JDEzIiwiZm10X3Jlc3QkMTgiLCJmbXR0eSQxOCIsImZtdCQxOCIsImZtdHR5X3Jlc3QkMTQiLCJmbXRfcmVzdCQxOSIsImZtdHR5JDE5IiwiZm10JDE5IiwiZm10dHlfcmVzdCQxNSIsImZtdF9yZXN0JDIwIiwiZm10dHkkMjAiLCJmbXQkMjAiLCJ0eXBlX2lnbm9yZWRfcGFyYW1fb25lIiwiZm10dHlfcmVzdCQxNiIsImZtdHR5JDIxIiwiZm10JDIxIiwic3ViX2ZtdHR5JDIiLCJzdWJfZm10dHkkMyIsImZtdHR5JDIyIiwiZm10JDIyIiwic3ViX2ZtdHR5JDQiLCJ0eXBlX2Zvcm1hdCIsInJlY2FzdCIsImZpeF9wYWRkaW5nIiwid2lkdGgkMCIsImZpeF9pbnRfcHJlY2lzaW9uIiwicmVzJDEiLCJzdHJpbmdfdG9fY2FtbF9zdHJpbmciLCJmb3JtYXRfb2ZfZmNvbnYiLCJzeW1iIiwidHJhbnNmb3JtX2ludF9hbHQiLCJkaWdpdHMiLCJwdXQiLCJjb252ZXJ0X2ludCIsImNvbnZlcnRfaW50MzIiLCJjb252ZXJ0X25hdGl2ZWludCIsImNvbnZlcnRfaW50NjQiLCJjb252ZXJ0X2Zsb2F0IiwiaGV4Iiwic2lnbiIsImNhbWxfc3BlY2lhbF92YWwiLCJzdHJpbmdfb2ZfZm10dHkiLCJtYWtlX3ByaW50ZiQwIiwibmV3X2FjYyIsIm1ha2VfcHJpbnRmIiwibWFrZV9wYWRkaW5nIiwibWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24iLCJwJDAiLCJwJDEiLCJhY2MkMyIsImFjYyQ0IiwiayQzIiwia2FjYyIsImskNCIsIm1ha2VfaWdub3JlZF9wYXJhbSQwIiwibWFrZV9jdXN0b20kMCIsIm1ha2VfaW52YWxpZF9hcmciLCJtYWtlX2Zyb21fZm10dHkkMCIsIm1ha2VfZnJvbV9mbXR0eSIsIm1ha2VfY3VzdG9tIiwibWFrZV9pZ25vcmVkX3BhcmFtIiwibWFrZV9pcHJpbnRmJDAiLCJtYWtlX2lwcmludGYiLCJmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiIsImtvYyIsInJlc3QkMjQiLCJyZXN0JDI1IiwiZm5fb2ZfY3VzdG9tX2FyaXR5JDAiLCJmbl9vZl9jdXN0b21fYXJpdHkiLCJvdXRwdXRfYWNjIiwicCQyIiwicCQzIiwicCQ0IiwiYnVmcHV0X2FjYyIsInN0cnB1dF9hY2MiLCJmYWlsd2l0aF9tZXNzYWdlIiwib3Blbl9ib3hfb2Zfc3RyaW5nIiwiaW52YWxpZF9ib3giLCJwYXJzZV9zcGFjZXMiLCJwYXJzZV9sd29yZCIsInBhcnNlX2ludCIsIndzdGFydCIsIndlbmQiLCJib3hfbmFtZSIsIm5zdGFydCIsIm5lbmQiLCJpbmRlbnQiLCJleHBfZW5kIiwiYm94X3R5cGUiLCJtYWtlX3BhZGRpbmdfZm10X2ViYiIsIm1ha2VfcGFkcHJlY19mbXRfZWJiIiwiZm10X2ViYl9vZl9zdHJpbmciLCJsZWdhY3lfYmVoYXZpb3IiLCJmbGFnIiwibGVnYWN5X2JlaGF2aW9yJDAiLCJpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIiwidW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IiwiZW5kX2luZCIsImludmFsaWRfZm9ybWF0X3dpdGhvdXQiLCJleHBlY3RlZF9jaGFyYWN0ZXIiLCJleHBlY3RlZCIsImFkZF9saXRlcmFsIiwibGl0X3N0YXJ0Iiwic2l6ZSIsInBhcnNlX3Bvc2l0aXZlIiwic3RyX2luZCQwIiwic3RyX2luZCQxIiwicGFyc2VfaW50ZWdlciIsIm5leHRfaW5kIiwiaW5jb21wYXRpYmxlX2ZsYWciLCJwY3RfaW5kIiwib3B0aW9uIiwic3ViZm10IiwiY29tcHV0ZV9pbnRfY29udiIsInBsdXMiLCJzcGFjZSIsInBsdXMkMCIsInNwYWNlJDAiLCJzZWFyY2hfc3ViZm9ybWF0X2VuZCIsInN1Yl9lbmQiLCJzdHJfaW5kJDIiLCJzdWJfZW5kJDAiLCJzdHJfaW5kJDMiLCJzdWJfZW5kJDEiLCJzdHJfaW5kJDQiLCJzdHJfaW5kJDUiLCJzdWJfZW5kJDIiLCJzdHJfaW5kJDYiLCJzdHJfaW5kJDciLCJwYXJzZV9tYWdpY19zaXplIiwic3RyX2luZF8xIiwic3RyX2luZF8yIiwic3RyX2luZF8zIiwicGFyc2UiLCJwYXJzZV9nb29kX2JyZWFrIiwiZm9ybWF0dGluZ19saXQkMCIsInN0cl9pbmRfNCIsInN0cl9pbmRfNSIsInBhcnNlX3RhZyIsImlzX29wZW5fdGFnIiwiaW5kIiwic3ViX3N0ciIsInN1Yl9mbXQiLCJzdWJfZm9ybWF0JDAiLCJmb3JtYXR0aW5nJDAiLCJmb3JtYXR0aW5nIiwicGFyc2VfZmxhZ3MiLCJtaW51cyIsInNldF9mbGFnIiwibmV3X2luZCIsInBhcnNlX2FmdGVyX3BhZGRpbmciLCJwYXJzZV9saXRlcmFsIiwicGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIiwic3ltYiQwIiwibWludXMkMCIsInBhcnNlX2NvbnZlcnNpb24iLCJwYXJzZV9jb252IiwicGFkcHJlYyIsInBsdXNfdXNlZCIsImhhc2hfdXNlZCIsInNwYWNlX3VzZWQiLCJpZ25fdXNlZCIsInBhZF91c2VkIiwicHJlY191c2VkIiwiZ2V0X3BsdXMiLCJnZXRfaGFzaCIsImdldF9zcGFjZSIsImdldF9pZ24iLCJnZXRfcGFkIiwiZ2V0X3ByZWMiLCJnZXRfcGFkcHJlYyIsImdldF9pbnRfcGFkIiwiY2hlY2tfbm9fMCIsIm9wdF9vZl9wYWQiLCJ3aWR0aCQxIiwiZ2V0X3BhZF9vcHQiLCJnZXRfcGFkcHJlY19vcHQiLCJmbXRfcmVzdWx0IiwiaWdub3JlZCQyIiwiY291bnRlciQwIiwiaWdub3JlZCQ2IiwiaWdub3JlZCQ3IiwiYWRkX3JhbmdlIiwiZmFpbF9zaW5nbGVfcGVyY2VudCIsInBhcnNlX2NoYXJfc2V0X2NvbnRlbnQiLCJwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyJDAiLCJwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIiwicmV2ZXJzZSIsImNoYXJfc2V0JDEiLCJpZ25vcmVkJDkiLCJjaGFyX2Zvcm1hdCIsImZtdF9yZXN0JDIxIiwiZm10X3Jlc3QkMjIiLCJwYWQkOSIsImZtdF9yZXN0JDIzIiwiaWdub3JlZCQxMCIsImZtdF9yZXN0JDI0IiwicGFkJDEwIiwiZm10X3Jlc3QkMjUiLCJzdWJfZm10JDAiLCJmbXRfcmVzdCQyNiIsImlnbm9yZWQkMTEiLCJpZ25vcmVkJDMiLCJpZ25vcmVkJDUiLCJpZ25vcmVkJDgiLCJzcGFjZSQxIiwiaGFzaCQxIiwicGx1cyQyIiwia2luZCIsImlnbm9yZWQkNCIsImlnbm9yZWQiLCJpZ25vcmVkJDAiLCJpZ25vcmVkJDEiLCJwbHVzJDEiLCJpZ24kMCIsImZvcm1hdF9vZl9zdHJpbmdfZm10dHkiLCJmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCIsImtmcHJpbnRmIiwia2JwcmludGYiLCJpa2ZwcmludGYiLCJmcHJpbnRmIiwiYnByaW50ZiIsImlmcHJpbnRmIiwiaWJwcmludGYiLCJwcmludGYiLCJlcHJpbnRmIiwia3NwcmludGYiLCJzcHJpbnRmIiwiYXNzb2MzIiwieTIiLCJ5MSIsInNwbGl0JDEiLCJtYWtlX3N5bWxpc3QiLCJoZWxwX2FjdGlvbiIsImFkZF9oZWxwIiwic3BlY2xpc3QiLCJhZGQyIiwidXNhZ2VfYiIsImVycm1zZyIsImRvYyIsInNwZWMiLCJrZXkiLCJ1c2FnZV9zdHJpbmciLCJ1c2FnZSIsImJvb2xfb2Zfc3RyaW5nX29wdCQwIiwiaW50X29mX3N0cmluZ19vcHQkMCIsImZsb2F0X29mX3N0cmluZ19vcHQiLCJwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY18iLCJhbGxvd19leHBhbmQiLCJhcmd2IiwiYW5vbmZ1biIsImluaXRwb3MiLCJjb252ZXJ0X2Vycm9yIiwicHJvZ25hbWUiLCJmb2xsb3ckMCIsImtleXdvcmQiLCJub19hcmckMCIsImZvbGxvdyIsIm5vX2FyZyIsImdldF9hcmckMCIsImdldF9hcmciLCJjb25zdW1lX2FyZyQwIiwiY29uc3VtZV9hcmciLCJ0cmVhdF9hY3Rpb24kMCIsInRyZWF0X2FjdGlvbiIsImYkMCIsImYkMSIsInIkMSIsImYkMiIsInIkMiIsImFyZyQyIiwiZiQzIiwiYXJnJDMiLCJ4JDEiLCJyJDMiLCJhcmckNCIsIngkMiIsInNwZWNzIiwiZiQ0IiwiYXJnJDUiLCJmJDUiLCJmJDYiLCJmJDciLCJhcmckNiIsIm5ld2FyZyIsInBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljIiwicGFyc2VfYXJndl9keW5hbWljIiwiY3VycmVudCQwIiwicGFyc2VfYXJndiIsIm1zZyQwIiwibXNnJDEiLCJwYXJzZV9keW5hbWljIiwicGFyc2VfZXhwYW5kIiwic2Vjb25kX3dvcmQiLCJsb29wIiwibWF4X2FyZ19sZW4iLCJrd2QiLCJyZXBsYWNlX2xlYWRpbmdfdGFiIiwiYWxpZ24iLCJsaW1pdCIsImNvbXBsZXRlZCIsImtzZCIsImN1dGNvbCQwIiwic3BhY2VzJDAiLCJjdXRjb2wiLCJrd2RfbGVuIiwic3BhY2VzIiwicmVhZF9hdXgiLCJ0cmltIiwiZmlsZSIsIndvcmRzIiwic3Rhc2giLCJ3b3JkIiwicmVhZF9hcmciLCJyZWFkX2FyZzAiLCJ3cml0ZV9hdXgiLCJhcmdzIiwid3JpdGVfYXJnIiwid3JpdGVfYXJnMCIsInByaW50ZXJzIiwiZmllbGQiLCJvdGhlcl9maWVsZHMiLCJ1c2VfcHJpbnRlcnMiLCJjb252IiwidG9fc3RyaW5nX2RlZmF1bHQiLCJjaGFyJDAiLCJsaW5lIiwiY2hhciQxIiwibGluZSQwIiwiZmlsZSQwIiwiY2hhciQyIiwibGluZSQxIiwiZmlsZSQxIiwiY29uc3RydWN0b3IiLCJ0b19zdHJpbmckNiIsInByaW50IiwiZmN0IiwiY2F0Y2gkMCIsInJhd19iYWNrdHJhY2VfZW50cmllcyIsImJ0IiwiY29udmVydF9yYXdfYmFja3RyYWNlIiwiZm9ybWF0X2JhY2t0cmFjZV9zbG90IiwiaXNfcmFpc2UiLCJwcmludF9yYXdfYmFja3RyYWNlIiwib3V0Y2hhbiIsInJhd19iYWNrdHJhY2UiLCJiYWNrdHJhY2UiLCJwcmludF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlX3RvX3N0cmluZyIsImJhY2t0cmFjZV9zbG90X2lzX3JhaXNlIiwiYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lIiwiYmFja3RyYWNlX3Nsb3RfbG9jYXRpb24iLCJiYWNrdHJhY2Vfc2xvdF9kZWZuYW1lIiwiYmFja3RyYWNlX3Nsb3RzIiwiYmFja3RyYWNlX3Nsb3RzX29mX3Jhd19lbnRyeSIsImVudHJ5IiwicmF3X2JhY2t0cmFjZV9sZW5ndGgiLCJnZXRfYmFja3RyYWNlIiwicmVnaXN0ZXJfcHJpbnRlciIsImZuIiwib2xkX3ByaW50ZXJzIiwibmV3X3ByaW50ZXJzIiwiZXhuX3Nsb3QiLCJleG5fc2xvdF9pZCIsImV4bl9zbG90X25hbWUiLCJlcnJvcnMiLCJkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW4iLCJzdGF0dXMiLCJ1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsInNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsImVtcHR5X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9leGNlcHRpb24iLCJkZWJ1Z2dlcl9pbl91c2UiLCJleG4kMCIsInJhd19iYWNrdHJhY2UkMCIsImNvbnN0JDAiLCJmbGlwIiwibmVnYXRlIiwicHJvdGVjdCIsImZpbmFsbHkkMCIsIndvcmsiLCJmaW5hbGx5X25vX2V4biIsIndvcmtfZXhuIiwid29ya19idCIsInByaW50X3N0YXQiLCJhbGxvY2F0ZWRfYnl0ZXMiLCJtYSIsInBybyIsIm1pIiwiY3JlYXRlX2FsYXJtIiwiZGVsZXRlX2FsYXJtIiwibnVsbF90cmFja2VyIiwic2FtcGxpbmdfcmF0ZSIsInRyYWNrZXIiLCJjYWxsc3RhY2tfc2l6ZSIsInN0cmluZyIsImJ5dGVzIiwic3Vic3RyaW5nIiwic3ViYnl0ZXMiLCJmaWxlbmFtZSIsIm91dHB1dCQwIiwiZGlnZXN0IiwiaW5wdXQkMCIsImNoYXJfaGV4IiwidG9faGV4IiwiZnJvbV9oZXgiLCJkaWdpdCIsIm5ld19zdGF0ZSIsImFzc2lnbiIsInN0MSIsInN0MiIsImZ1bGxfaW5pdCIsInNlZWQiLCJzZWVkJDAiLCJtYWtlJDMiLCJtYWtlX3NlbGZfaW5pdCIsImNvcHkkNSIsImJpdHMiLCJjdXJ2YWwiLCJuZXd2YWwiLCJuZXd2YWwzMCIsImludGF1eCIsImludCQwIiwiYm91bmQiLCJmdWxsX2ludCIsImJwb3MiLCJicG9zJDAiLCJpbnQzMiIsImludDY0IiwibmF0aXZlaW50IiwiZmxvYXQkMCIsImJvb2wiLCJiaXRzMzIiLCJiaXRzNjQiLCJuYXRpdmViaXRzIiwiYml0cyQwIiwiaW50JDEiLCJmdWxsX2ludCQwIiwiaW50MzIkMCIsIm5hdGl2ZWludCQwIiwiaW50NjQkMCIsImZsb2F0JDEiLCJzY2FsZSIsImJvb2wkMCIsImJpdHMzMiQwIiwiYml0czY0JDAiLCJuYXRpdmViaXRzJDAiLCJmdWxsX2luaXQkMCIsImluaXQkNSIsInNlbGZfaW5pdCIsImdldF9zdGF0ZSIsInNldF9zdGF0ZSIsIm9uZ29pbmdfdHJhdmVyc2FsIiwiZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCIsInBhcmFtcyIsInJhbmRvbWl6ZWRfZGVmYXVsdCIsInJhbmRvbWl6ZWQiLCJyYW5kb21pemUiLCJpc19yYW5kb21pemVkIiwicHJuZyIsInBvd2VyXzJfYWJvdmUiLCJjcmVhdGUkMyIsImluaXRpYWxfc2l6ZSIsInJhbmRvbSIsImNsZWFyJDIiLCJyZXNldCQwIiwiY29weV9idWNrZXRsaXN0Iiwia2V5JDAiLCJuZXh0JDAiLCJjb3B5JDYiLCJsZW5ndGgkNSIsImluc2VydF9hbGxfYnVja2V0cyIsImluZGV4ZnVuIiwiaW5wbGFjZSIsIm9kYXRhIiwibmRhdGEiLCJuc2l6ZSIsIm5kYXRhX3RhaWwiLCJjZWxsJDAiLCJuaWR4IiwibWF0Y2giLCJtYXRjaCQwIiwicmVzaXplJDAiLCJvc2l6ZSIsIml0ZXIkMTAiLCJkb19idWNrZXQiLCJvbGRfdHJhdiIsImZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQiLCJmaWx0ZXJfbWFwX2lucGxhY2UiLCJmb2xkJDQiLCJiJDAiLCJidWNrZXRfbGVuZ3RoIiwic3RhdHMiLCJtYmwiLCJoaXN0byIsInRvX3NlcSQ5IiwidGJsX2RhdGEiLCJidWNrIiwiYnVjayQwIiwiYnVjayQxIiwidG9fc2VxX2tleXMiLCJ0b19zZXFfdmFsdWVzIiwia2V5X2luZGV4IiwiYnVja2V0IiwiazEiLCJuZXh0MSIsImsyIiwibmV4dDIiLCJrMyIsImQzIiwibmV4dDMiLCJmaW5kX2FsbCIsImZpbmRfaW5fYnVja2V0IiwicmVwbGFjZSIsInJlcGxhY2Vfc2VxIiwiY29weSIsInN6IiwiaGFzaF9wYXJhbSIsInNlZWRlZF9oYXNoIiwiYWRkJDAiLCJmaW5kJDEiLCJmaW5kX29wdCQxIiwiZmluZF9hbGwkMCIsIm1lbSQyIiwiYWRkX3NlcSQyIiwib2Zfc2VxJDciLCJyZWJ1aWxkIiwid2Vha19jcmVhdGUiLCJsZW5ndGgkNiIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0JDAiLCJzZXQkMSIsImdldCQyIiwiZ2V0X2NvcHkiLCJjaGVjayQwIiwiYmxpdCQ0IiwiZmlsbCQyIiwiYXIiLCJlbXB0eWJ1Y2tldCIsImdldF9pbmRleCIsInN6JDAiLCJzeiQxIiwiY291bnRfYnVja2V0IiwiYWRkX2F1eCIsInNldHRlciIsImluZGV4IiwiYnVja2V0JDAiLCJoYXNoZXMiLCJuZXdzeiIsIm5ld2J1Y2tldCQwIiwibmV3aGFzaGVzIiwiaGJ1Y2tldCIsInByZXZfbGVuIiwibGl2ZSIsImokMiIsIm5ld2J1Y2tldCIsIm5ld3QiLCJvYiIsIm9oIiwic2V0dGVyJDAiLCJuaSIsImZpbmRfb3IiLCJpZm5vdGZvdW5kIiwiZmluZF9zaGFkb3ciLCJpZmZvdW5kIiwibGVucyIsInRvdGxlbiIsImlkJDAiLCJ1bmtub3duIiwicHBfZW5xdWV1ZSIsInRva2VuIiwicHBfaW5maW5pdHkiLCJwcF9vdXRwdXRfc3RyaW5nIiwicHBfb3V0cHV0X25ld2xpbmUiLCJmb3JtYXRfcHBfdGV4dCIsInRleHQiLCJmb3JtYXRfc3RyaW5nIiwiYnJlYWtfbmV3X2xpbmUiLCJyZWFsX2luZGVudCIsImJyZWFrX2xpbmUiLCJicmVha19zYW1lX2xpbmUiLCJmb3JtYXRfcHBfdG9rZW4iLCJzaXplJDAiLCJ0YWJzIiwiYWRkX3RhYiIsImxzIiwidGFnX25hbWUiLCJtYXJrZXIiLCJicmVha3MiLCJmaXRzIiwib2ZmIiwiYm94X3R5cGUkMCIsIm9mZiQwIiwiaW5zZXJ0aW9uX3BvaW50IiwidGFicyQwIiwiZmlyc3QiLCJoZWFkIiwidGFiIiwib2ZmJDEiLCJpbnNlcnRpb25fcG9pbnQkMCIsIndpZHRoJDIiLCJib3hfdHlwZSQxIiwidGJveCIsInRhZ19uYW1lJDAiLCJtYXJrZXIkMCIsImFkdmFuY2VfbGVmdCIsInBlbmRpbmdfY291bnQiLCJlbnF1ZXVlX2FkdmFuY2UiLCJlbnF1ZXVlX3N0cmluZ19hcyIsImluaXRpYWxpemVfc2Nhbl9zdGFjayIsInN0YWNrIiwicXVldWVfZWxlbSIsInNldF9zaXplIiwibGVmdF90b3RhbCIsInNjYW5fcHVzaCIsImVsZW0iLCJwcF9vcGVuX2JveF9nZW4iLCJicl90eSIsInBwX2Nsb3NlX2JveCIsInBwX29wZW5fc3RhZyIsInBwX2Nsb3NlX3N0YWciLCJwcF9vcGVuX3RhZyIsInBwX2Nsb3NlX3RhZyIsInBwX3NldF9wcmludF90YWdzIiwicHBfc2V0X21hcmtfdGFncyIsInBwX2dldF9wcmludF90YWdzIiwicHBfZ2V0X21hcmtfdGFncyIsInBwX3NldF90YWdzIiwicHBfZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9uIiwicHBfc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9uIiwicGN0IiwicG90IiwibWN0IiwibW90IiwicHBfcmluaXQiLCJwcF9mbHVzaF9xdWV1ZSIsInBwX3ByaW50X2FzX3NpemUiLCJwcF9wcmludF9hcyIsImlzaXplIiwicHBfcHJpbnRfc3RyaW5nIiwicHBfcHJpbnRfYnl0ZXMiLCJwcF9wcmludF9pbnQiLCJwcF9wcmludF9mbG9hdCIsInBwX3ByaW50X2Jvb2wiLCJwcF9wcmludF9jaGFyIiwicHBfb3Blbl9oYm94IiwicHBfb3Blbl92Ym94IiwicHBfb3Blbl9odmJveCIsInBwX29wZW5faG92Ym94IiwicHBfb3Blbl9ib3giLCJwcF9wcmludF9uZXdsaW5lIiwicHBfcHJpbnRfZmx1c2giLCJwcF9mb3JjZV9uZXdsaW5lIiwicHBfcHJpbnRfaWZfbmV3bGluZSIsInBwX3ByaW50X2N1c3RvbV9icmVhayIsInBwX3ByaW50X2JyZWFrIiwicHBfcHJpbnRfc3BhY2UiLCJwcF9wcmludF9jdXQiLCJwcF9vcGVuX3Rib3giLCJwcF9jbG9zZV90Ym94IiwicHBfcHJpbnRfdGJyZWFrIiwicHBfcHJpbnRfdGFiIiwicHBfc2V0X3RhYiIsInBwX3NldF9tYXhfYm94ZXMiLCJwcF9nZXRfbWF4X2JveGVzIiwicHBfb3Zlcl9tYXhfYm94ZXMiLCJwcF9zZXRfZWxsaXBzaXNfdGV4dCIsInBwX2dldF9lbGxpcHNpc190ZXh0IiwicHBfbGltaXQiLCJwcF9zZXRfbWF4X2luZGVudCIsInBwX2dldF9tYXhfaW5kZW50IiwicHBfc2V0X21hcmdpbiIsIm5ld19tYXhfaW5kZW50IiwidmFsaWRhdGVfZ2VvbWV0cnkiLCJtYXJnaW4iLCJtYXhfaW5kZW50IiwiY2hlY2tfZ2VvbWV0cnkiLCJnZW9tZXRyeSIsInBwX2dldF9tYXJnaW4iLCJwcF9zZXRfZnVsbF9nZW9tZXRyeSIsInBwX3NldF9nZW9tZXRyeSIsInBwX3NhZmVfc2V0X2dlb21ldHJ5IiwicHBfZ2V0X2dlb21ldHJ5IiwicHBfdXBkYXRlX2dlb21ldHJ5IiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwicHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3RpIiwicHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3RpIiwiZGlzcGxheV9uZXdsaW5lIiwiYmxhbmtfbGluZSIsImRpc3BsYXlfaW5kZW50IiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCIsImRlZmF1bHRfcHBfbWFya19vcGVuX3RhZyIsImRlZmF1bHRfcHBfbWFya19jbG9zZV90YWciLCJkZWZhdWx0X3BwX3ByaW50X29wZW5fdGFnIiwiZGVmYXVsdF9wcF9wcmludF9jbG9zZV90YWciLCJwcF9tYWtlX2Zvcm1hdHRlciIsInBwX3F1ZXVlIiwic3lzX3RvayIsInNjYW5fc3RhY2siLCJmb3JtYXR0ZXJfb2Zfb3V0X2Z1bmN0aW9ucyIsIm91dF9mdW5zIiwibWFrZV9mb3JtYXR0ZXIiLCJwcGYiLCJmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwiLCJmb3JtYXR0ZXJfb2ZfYnVmZmVyIiwicHBfYnVmZmVyX3NpemUiLCJwcF9tYWtlX2J1ZmZlciIsInN0ZGJ1ZiIsInN0ZF9mb3JtYXR0ZXIiLCJlcnJfZm9ybWF0dGVyIiwic3RyX2Zvcm1hdHRlciIsImZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIiLCJmbHVzaF9zdHJfZm9ybWF0dGVyIiwibWFrZV9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwiY2xlYXJfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsInNvYiIsImdldF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwiZmx1c2hfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsIml0ZW1zIiwiYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIiwiaXRlbSIsImZvcm1hdHRlcl9vZl9zeW1ib2xpY19vdXRwdXRfYiIsIm9wZW5faGJveCIsIm9wZW5fdmJveCIsIm9wZW5faHZib3giLCJvcGVuX2hvdmJveCIsIm9wZW5fYm94IiwiY2xvc2VfYm94Iiwib3Blbl90YWciLCJjbG9zZV90YWciLCJvcGVuX3N0YWciLCJjbG9zZV9zdGFnIiwicHJpbnRfYXMiLCJwcmludF9zdHJpbmckMCIsInByaW50X2J5dGVzJDAiLCJwcmludF9pbnQkMCIsInByaW50X2Zsb2F0JDAiLCJwcmludF9jaGFyJDAiLCJwcmludF9ib29sIiwicHJpbnRfYnJlYWsiLCJwcmludF9jdXQiLCJwcmludF9zcGFjZSIsImZvcmNlX25ld2xpbmUiLCJwcmludF9mbHVzaCIsInByaW50X25ld2xpbmUkMCIsInByaW50X2lmX25ld2xpbmUiLCJvcGVuX3Rib3giLCJjbG9zZV90Ym94IiwicHJpbnRfdGJyZWFrIiwic2V0X3RhYiIsInByaW50X3RhYiIsInNldF9tYXJnaW4iLCJnZXRfbWFyZ2luIiwic2V0X21heF9pbmRlbnQiLCJnZXRfbWF4X2luZGVudCIsInNldF9nZW9tZXRyeSIsInNhZmVfc2V0X2dlb21ldHJ5IiwiZ2V0X2dlb21ldHJ5IiwidXBkYXRlX2dlb21ldHJ5Iiwic2V0X21heF9ib3hlcyIsImdldF9tYXhfYm94ZXMiLCJvdmVyX21heF9ib3hlcyIsInNldF9lbGxpcHNpc190ZXh0IiwiZ2V0X2VsbGlwc2lzX3RleHQiLCJzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIiwic2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwic2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIiwic2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyIsImdldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMiLCJzZXRfcHJpbnRfdGFncyIsImdldF9wcmludF90YWdzIiwic2V0X21hcmtfdGFncyIsImdldF9tYXJrX3RhZ3MiLCJzZXRfdGFncyIsInBwX3ByaW50X2xpc3QiLCJwcF92Iiwib3B0JDAiLCJwcF9zZXAiLCJ2cyIsIm9wdCQxIiwicHBfcHJpbnRfc2VxIiwic2VxJDEiLCJzZXEkMiIsInBwX3ByaW50X3RleHQiLCJwcF9wcmludF9vcHRpb24iLCJwcF9wcmludF9yZXN1bHQiLCJwcF9wcmludF9laXRoZXIiLCJjb21wdXRlX3RhZyIsInRhZ19hY2MiLCJvdXRwdXRfZm9ybWF0dGluZ19saXQiLCJvdXRwdXRfYWNjJDAiLCJidHkiLCJwJDUiLCJwJDYiLCJzdHJwdXRfYWNjJDAiLCJzaXplJDEiLCJrZnByaW50ZiQwIiwiaWtmcHJpbnRmJDAiLCJpZnByaW50ZiQwIiwiZnByaW50ZiQwIiwicHJpbnRmJDAiLCJlcHJpbnRmJDAiLCJrZHByaW50ZiIsImRwcmludGYiLCJrcHJpbnRmIiwic3ByaW50ZiQwIiwia2FzcHJpbnRmIiwiYXNwcmludGYiLCJmbHVzaF9zdGFuZGFyZF9mb3JtYXR0ZXJzIiwicHBfc2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1IiwicHBfZ2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1Iiwic2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0IiwiZ2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0IiwiYnByaW50ZiQwIiwicHBfc2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIiwic3RyaW5naWZ5IiwicHBfZ2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIiwiZnVucyIsIm1hcmtfb3Blbl90YWciLCJtYXJrX2Nsb3NlX3RhZyIsInByaW50X29wZW5fdGFnIiwicHJpbnRfY2xvc2VfdGFnIiwic2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIiwibnVsbF9jaGFyIiwibmV4dF9jaGFyIiwiaWIiLCJwZWVrX2NoYXIiLCJjaGVja2VkX3BlZWtfY2hhciIsImVuZF9vZl9pbnB1dCIsImJlZ2lubmluZ19vZl9pbnB1dCIsIm5hbWVfb2ZfaW5wdXQiLCJjaGFyX2NvdW50IiwicmVzZXRfdG9rZW4iLCJpbnZhbGlkYXRlX2N1cnJlbnRfY2hhciIsInRva2VuX3N0cmluZyIsInRva2VuX2J1ZmZlciIsInNraXBfY2hhciIsImlnbm9yZV9jaGFyIiwic3RvcmVfY2hhciIsImRlZmF1bHRfdG9rZW5fYnVmZmVyX3NpemUiLCJjcmVhdGUkNCIsImluYW1lIiwiZnJvbV9zdHJpbmckMSIsImZyb21fZnVuY3Rpb24kMCIsInNjYW5fY2xvc2VfYXRfZW5kIiwic2Nhbl9yYWlzZV9hdF9lbmQiLCJmcm9tX2ljIiwic2Nhbl9jbG9zZV9pYyIsImVvZiIsInN0ZGliIiwib3Blbl9pbl9maWxlIiwib3Blbl9pbiIsImZyb21fZmlsZSIsImZyb21fZmlsZV9iaW4iLCJmcm9tX2NoYW5uZWwkMCIsImNsb3NlX2luIiwiaWMkMCIsIm1lbW8iLCJtZW1vX2Zyb21faWMiLCJtZW1vX2Zyb21fY2hhbm5lbCIsImJhZF9pbnB1dCIsImJhZF9pbnB1dF9lc2NhcGUiLCJiYWRfdG9rZW5fbGVuZ3RoIiwibWVzc2FnZSIsImJhZF9mbG9hdCIsImJhZF9oZXhfZmxvYXQiLCJjaGFyYWN0ZXJfbWlzbWF0Y2giLCJjaSIsImNoZWNrX3RoaXNfY2hhciIsImNoZWNrX2NoYXIiLCJ0b2tlbl9jaGFyIiwidG9rZW5fYm9vbCIsImludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIiwidG9rZW5faW50X2xpdGVyYWwiLCJ0b2tlbl9mbG9hdCIsInNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIiwic2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCIsInNjYW5fZGlnaXRfcGx1cyIsImJhc2lzIiwiZGlnaXRwIiwid2lkdGgkMyIsImlzX2JpbmFyeV9kaWdpdCIsInNjYW5fYmluYXJ5X2ludCIsImlzX29jdGFsX2RpZ2l0Iiwic2Nhbl9vY3RhbF9pbnQiLCJpc19oZXhhX2RpZ2l0Iiwic2Nhbl9oZXhhZGVjaW1hbF9pbnQiLCJzY2FuX3NpZ24iLCJzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWwiLCJzY2FuX2ludF9jb252ZXJzaW9uIiwic2Nhbl9mcmFjdGlvbmFsX3BhcnQiLCJzY2FuX2V4cG9uZW50X3BhcnQiLCJzY2FuX2Zsb2F0IiwicHJlY2lzaW9uIiwicHJlY2lzaW9uJDAiLCJjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyIsInNjYW5faGV4X2Zsb2F0Iiwid2lkdGgkNCIsIndpZHRoJDUiLCJ3aWR0aCQ2Iiwid2lkdGgkMTAiLCJ3aWR0aCQ3Iiwid2lkdGgkOCIsIndpZHRoJDkiLCJzY2FuX2NhbWxfZmxvYXRfcmVzdCIsIndpZHRoX3ByZWNpc2lvbiIsImZyYWNfd2lkdGgiLCJzY2FuX2NhbWxfZmxvYXQiLCJzY2FuX3N0cmluZyIsInN0cCIsInNjYW5fY2hhciIsImhleGFkZWNpbWFsX3ZhbHVlX29mX2NoYXIiLCJjaGVja19uZXh0X2NoYXIiLCJjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIiLCJjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyIsInNjYW5fYmFja3NsYXNoX2NoYXIiLCJjMCIsImdldF9kaWdpdCIsImdldF9kaWdpdCQwIiwiYzEkMCIsImMyJDAiLCJzY2FuX2NhbWxfY2hhciIsImZpbmRfc3RvcCIsInNjYW5fY2FtbF9zdHJpbmciLCJmaW5kX3N0b3AkMCIsInNraXBfc3BhY2VzIiwic2Nhbl9jaGFyc19pbl9jaGFyX3NldCIsInNjYW5faW5kaWMiLCJzY2FuX2NoYXJzIiwic2NhbmZfYmFkX2lucHV0IiwiZ2V0X2NvdW50ZXIiLCJ3aWR0aF9vZl9wYWRfb3B0Iiwic3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCIsImZtdGluZyIsInRha2VfZm9ybWF0X3JlYWRlcnMkMCIsInRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMkMCIsInJlYWRlciIsIm5ld19rIiwicmVhZGVyc19yZXN0IiwidGFrZV9mb3JtYXRfcmVhZGVycyIsImZtdCQyMyIsImZtdCQyNCIsImZtdCQyNSIsInRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMiLCJtYWtlX3NjYW5mIiwicmVhZGVycyIsInNjYW4kMCIsInN0cl9yZXN0IiwicGFkX3ByZWNfc2NhbmYiLCJzY2FuJDEiLCJzY2FuJDIiLCJzY2FuJDMiLCJzY2FuJDQiLCJjb252JDAiLCJzY2FuJDUiLCJjb252JDEiLCJzY2FuJDYiLCJjb252JDIiLCJzY2FuJDciLCJzY2FuJDgiLCJmbXRpbmdfbGl0JDAiLCJzdHAkMCIsInMkMiIsInN0cl9yZXN0JDAiLCJyZXN0JDI2IiwiYXJnX3Jlc3QiLCJrc2NhbmYiLCJlZiIsImFwcGx5IiwiYXJncyQwIiwiZXhjIiwiYnNjYW5mIiwia3NzY2FuZiIsInNzY2FuZiIsInNjYW5mIiwiYnNjYW5mX2Zvcm1hdCIsImZvcm1hdCIsInNzY2FuZl9mb3JtYXQiLCJmb3JtYXRfZnJvbV9zdHJpbmciLCJ1bmVzY2FwZWQiLCJrZnNjYW5mIiwiZnNjYW5mIiwicmVnaXN0ZXIiLCJyZWdpc3Rlcl9leGNlcHRpb24iLCJvJDAiLCJwYXJhbXMkMCIsImluaXRpYWxfb2JqZWN0X3NpemUiLCJkdW1teV9pdGVtIiwidGFnIiwiY29tcGFyZSQxNCIsImNvbXBhcmUkMTUiLCJjb21wYXJlJDE2IiwiZHVtbXlfdGFibGUiLCJ0YWJsZV9jb3VudCIsImR1bW15X21ldCIsImZpdF9zaXplIiwibmV3X3RhYmxlIiwicHViX2xhYmVscyIsIm1ldGhvZHMiLCJyZXNpemUkMSIsImFycmF5IiwibmV3X3NpemUiLCJvbGRfc2l6ZSIsIm5ld19idWNrIiwibWV0aG9kX2NvdW50IiwiaW5zdF92YXJfY291bnQiLCJuZXdfbWV0aG9kIiwidGFibGUiLCJnZXRfbWV0aG9kX2xhYmVsIiwibGFiZWwiLCJnZXRfbWV0aG9kX2xhYmVscyIsIm5hbWVzIiwic2V0X21ldGhvZCIsImVsZW1lbnQiLCJnZXRfbWV0aG9kIiwidG9fbGlzdCQzIiwiYXJyIiwibmFycm93IiwidmFycyIsInZpcnRfbWV0aHMiLCJjb25jcl9tZXRocyIsInZhcnMkMCIsInZpcnRfbWV0aHMkMCIsImNvbmNyX21ldGhzJDAiLCJ2aXJ0X21ldGhfbGFicyIsImNvbmNyX21ldGhfbGFicyIsImxhYiIsInR2YXJzIiwiYnlfbmFtZSIsImJ5X2xhYmVsIiwibWV0IiwiaG0iLCJ3aWRlbiIsInNhdmVkX3ZhcnMiLCJzYXZlZF9oaWRkZW5fbWV0aHMiLCJuZXdfc2xvdCIsIm5ld192YXJpYWJsZSIsInRvX2FycmF5IiwibmV3X21ldGhvZHNfdmFyaWFibGVzIiwibWV0aHMiLCJ2YWxzIiwibWV0aHMkMCIsIm5tZXRocyIsIm52YWxzIiwiZ2V0X3ZhcmlhYmxlIiwiZ2V0X3ZhcmlhYmxlcyIsImFkZF9pbml0aWFsaXplciIsImNyZWF0ZV90YWJsZSIsInB1YmxpY19tZXRob2RzIiwidGFncyIsImluaXRfY2xhc3MiLCJpbmhlcml0cyIsImNsYSIsInN1cGVyJDAiLCJubSIsIm1ha2VfY2xhc3MiLCJwdWJfbWV0aHMiLCJjbGFzc19pbml0IiwiZW52X2luaXQiLCJtYWtlX2NsYXNzX3N0b3JlIiwiaW5pdF90YWJsZSIsImR1bW15X2NsYXNzIiwibG9jIiwidW5kZWYiLCJjcmVhdGVfb2JqZWN0IiwiY3JlYXRlX29iamVjdF9vcHQiLCJvYmpfMCIsIml0ZXJfZiIsInJ1bl9pbml0aWFsaXplcnMiLCJpbml0cyIsInJ1bl9pbml0aWFsaXplcnNfb3B0IiwiY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpIiwiZ2V0X2RhdGEkMCIsImJ1aWxkX3BhdGgiLCJrZXlzIiwibG9va3VwX3RhYmxlcyIsInJvb3QiLCJ0YWJsZXMkMiIsInRhYmxlcyQwIiwidGFibGVzJDEiLCJuZXdfY2FjaGUiLCJzZXRfbWV0aG9kcyIsImNsbyIsImNsbyQwIiwibiQyIiwibiQzIiwibiQ0IiwibiQ1IiwibiQ2IiwieCQzIiwibiQ3IiwieCQ0IiwibiQ4IiwibiQ5IiwieCQ1IiwiZiQ4IiwiZSQyIiwibiQxMCIsIngkNiIsImYkOSIsIm4kMTEiLCJ4JDciLCJuJDEyIiwieCQ4IiwibiQxMyIsIm4kMTQiLCJlJDMiLCJuJDE1IiwibSQyIiwieCQ5IiwibSQzIiwibiQxNiIsIm0kNCIsImUkNCIsIm4kMTciLCJtJDUiLCJuJDE4Iiwic3RhdHMkMCIsImluaXRfbW9kX2Jsb2NrIiwiY29tcHMkMCIsIm1vZHUiLCJzaGFwZSIsImZuJDAiLCJjb21wcyIsImluaXRfbW9kIiwidXBkYXRlX21vZF9ibG9jayIsImNsIiwidXBkYXRlX21vZCIsImluaXRpYWxfYnVmZmVyIiwiYnVmZmVyIiwiYnVmcG9zIiwicmVzZXRfYnVmZmVyIiwic3RvcmUiLCJuZXdidWZmZXIiLCJnZXRfc3RyaW5nIiwibWFrZV9sZXhlciIsImtleXdvcmRzIiwia3dkX3RhYmxlIiwiaWRlbnRfb3Jfa2V5d29yZCIsImtleXdvcmRfb3JfZXJyb3IiLCJjb21tZW50IiwiZXNjYXBlIiwiZW5kX2V4cG9uZW50X3BhcnQiLCJleHBvbmVudF9wYXJ0IiwibnVtYmVyIiwiaWRlbnQyIiwibmVnX251bWJlciIsIm5leHRfdG9rZW4kMCIsIm1heWJlX2NvbW1lbnQiLCJuZXh0X3Rva2VuIiwiaGtleSIsImNsZWFuIiwiaW5zZXJ0X2J1Y2tldCIsImNvbnRhaW5lciIsInJlbW92ZV9idWNrZXQiLCJoayIsInJlcGxhY2VfYnVja2V0IiwibmV3X2QiLCJidWNrZXRfbGVuZ3RoX2FsaXZlIiwic3RhdHNfYWxpdmUiLCJjcmVhdGUkNSIsImdldF9rZXkkMCIsImdldF9rZXlfY29weSQwIiwic2V0X2tleSQwIiwidW5zZXRfa2V5JDAiLCJjaGVja19rZXkkMCIsImJsaXRfa2V5JDAiLCJnZXRfZGF0YSQxIiwiZ2V0X2RhdGFfY29weSIsInNldF9kYXRhIiwidW5zZXRfZGF0YSIsImNoZWNrX2RhdGEiLCJibGl0X2RhdGEiLCJtYWtlJDQiLCJlcGgiLCJxdWVyeSIsInNldF9rZXlfZGF0YSIsIm1ha2UkNSIsImFkZCQxIiwidGVzdF9rZXkiLCJyZW1vdmUkMCIsImZpbmQkMiIsImxlbmd0aCQ3IiwiY2xlYXIkMyIsImNyZWF0ZSQ2IiwiZ2V0X2tleTEiLCJnZXRfa2V5MV9jb3B5Iiwic2V0X2tleTEiLCJ1bnNldF9rZXkxIiwiY2hlY2tfa2V5MSIsImdldF9rZXkyIiwiZ2V0X2tleTJfY29weSIsInNldF9rZXkyIiwidW5zZXRfa2V5MiIsImNoZWNrX2tleTIiLCJibGl0X2tleTEiLCJibGl0X2tleTIiLCJibGl0X2tleTEyIiwiZ2V0X2RhdGEkMiIsImdldF9kYXRhX2NvcHkkMCIsInNldF9kYXRhJDAiLCJ1bnNldF9kYXRhJDAiLCJjaGVja19kYXRhJDAiLCJibGl0X2RhdGEkMCIsIm1ha2UkNiIsImtleTEiLCJrZXkyIiwicXVlcnkkMCIsImsyJDAiLCJrMSQwIiwibWFrZSQ3IiwiYWRkJDIiLCJ0ZXN0X2tleXMiLCJyZW1vdmUkMSIsImZpbmQkMyIsImxlbmd0aCQ4IiwiY2xlYXIkNCIsImNyZWF0ZSQ3IiwibGVuZ3RoJDkiLCJnZXRfa2V5JDEiLCJnZXRfa2V5X2NvcHkkMSIsInNldF9rZXkkMSIsInVuc2V0X2tleSQxIiwiY2hlY2tfa2V5JDEiLCJibGl0X2tleSQxIiwiZ2V0X2RhdGEkMyIsImdldF9kYXRhX2NvcHkkMSIsInNldF9kYXRhJDEiLCJ1bnNldF9kYXRhJDEiLCJjaGVja19kYXRhJDEiLCJibGl0X2RhdGEkMSIsIm1ha2UkOCIsInF1ZXJ5JDEiLCJraSIsImswIiwibWFrZSQ5IiwiYWRkJDMiLCJ0ZXN0X2tleXMkMCIsInJlbW92ZSQyIiwiZmluZCQ0IiwibGVuZ3RoJDEwIiwiY2xlYXIkNSIsImdlbmVyaWNfYmFzZW5hbWUiLCJpc19kaXJfc2VwIiwiZ2VuZXJpY19kaXJuYW1lIiwiaXNfcmVsYXRpdmUiLCJpc19pbXBsaWNpdCIsImNoZWNrX3N1ZmZpeCIsInN1ZmYiLCJjaG9wX3N1ZmZpeF9vcHQiLCJsZW5fZiIsInF1b3RlIiwicXVvdGVfY29tbWFuZCIsImJhc2VuYW1lIiwiZGlybmFtZSIsImlzX2Rpcl9zZXAkMCIsImlzX3JlbGF0aXZlJDAiLCJpc19pbXBsaWNpdCQwIiwiY2hlY2tfc3VmZml4JDAiLCJjaG9wX3N1ZmZpeF9vcHQkMCIsInRlbXBfZGlyX25hbWUiLCJxdW90ZSQwIiwiYWRkX2JzIiwibG9vcCQwIiwibG9vcF9icyIsInF1b3RlX2NtZF9maWxlbmFtZSIsInF1b3RlX2NvbW1hbmQkMCIsImRyaXZlX2FuZF9wYXRoIiwiZGlybmFtZSQwIiwicGF0aCIsImRyaXZlIiwiZGlyIiwiYmFzZW5hbWUkMCIsImJhc2VuYW1lJDEiLCJkaXJuYW1lJDEiLCJudWxsJDMiLCJjdXJyZW50X2Rpcl9uYW1lJDIiLCJwYXJlbnRfZGlyX25hbWUkMiIsImRpcl9zZXAkMiIsImlzX2Rpcl9zZXAkMSIsImlzX3JlbGF0aXZlJDEiLCJpc19pbXBsaWNpdCQxIiwiY2hlY2tfc3VmZml4JDEiLCJjaG9wX3N1ZmZpeF9vcHQkMSIsInRlbXBfZGlyX25hbWUkMCIsInF1b3RlJDEiLCJxdW90ZV9jb21tYW5kJDEiLCJiYXNlbmFtZSQyIiwiZGlybmFtZSQyIiwiY29uY2F0JDQiLCJjaG9wX3N1ZmZpeCIsImV4dGVuc2lvbl9sZW4iLCJleHRlbnNpb24iLCJjaG9wX2V4dGVuc2lvbiIsInJlbW92ZV9leHRlbnNpb24iLCJwcm5nJDAiLCJ0ZW1wX2ZpbGVfbmFtZSIsInRlbXBfZGlyIiwicm5kIiwiY3VycmVudF90ZW1wX2Rpcl9uYW1lIiwic2V0X3RlbXBfZGlyX25hbWUiLCJnZXRfdGVtcF9kaXJfbmFtZSIsInRlbXBfZmlsZSIsInRyeV9uYW1lIiwiY291bnRlciQxIiwib3Blbl90ZW1wX2ZpbGUiLCJzdGgkMCIsInBlcm1zIiwic3RoJDEiLCJhZGQkNCIsInN1YiQ0IiwibmVnIiwiY29uaiIsIm11bCIsImRpdiIsImludiIsIm5vcm0yIiwibm9ybSIsInEkMCIsInBvbGFyIiwic3FydCIsInckMCIsImV4cCIsImxvZyIsInBvdyIsImZsb2F0MzIiLCJmbG9hdDY0IiwiaW50OF9zaWduZWQiLCJpbnQ4X3Vuc2lnbmVkIiwiaW50MTZfc2lnbmVkIiwiaW50MTZfdW5zaWduZWQiLCJpbnQzMiQxIiwiaW50NjQkMSIsImludCQyIiwibmF0aXZlaW50JDEiLCJjb21wbGV4MzIiLCJjb21wbGV4NjQiLCJraW5kX3NpemVfaW5fYnl0ZXMiLCJjX2xheW91dCIsImZvcnRyYW5fbGF5b3V0IiwiY2xvb3AiLCJpZHgiLCJjb2wiLCJmbG9vcCIsImluaXQkNiIsImxheW91dCIsImRpbXMiLCJkbGVuIiwic2l6ZV9pbl9ieXRlcyIsImNyZWF0ZSQ4IiwiZ2V0JDMiLCJzZXQkMiIsInNpemVfaW5fYnl0ZXMkMCIsIm9mX3ZhbHVlIiwiY3JlYXRlJDkiLCJkaW0iLCJzaXplX2luX2J5dGVzJDEiLCJzbGljZSIsImluaXQkNyIsIm9mX2FycmF5IiwiYmEiLCJjcmVhdGUkMTAiLCJkaW0xIiwiZGltMiIsInNpemVfaW5fYnl0ZXMkMiIsInNsaWNlX2xlZnQiLCJzbGljZV9yaWdodCIsImluaXQkOCIsIm9mX2FycmF5JDAiLCJyb3ciLCJjcmVhdGUkMTEiLCJkaW0zIiwic2l6ZV9pbl9ieXRlcyQzIiwic2xpY2VfbGVmdF8xIiwic2xpY2VfcmlnaHRfMSIsInNsaWNlX2xlZnRfMiIsInNsaWNlX3JpZ2h0XzIiLCJpbml0JDkiLCJvZl9hcnJheSQxIiwiYXJyYXkwX29mX2dlbmFycmF5IiwiYXJyYXkxX29mX2dlbmFycmF5IiwiYXJyYXkyX29mX2dlbmFycmF5IiwiYXJyYXkzX29mX2dlbmFycmF5IiwicmVzaGFwZV8wIiwicmVzaGFwZV8xIiwicmVzaGFwZV8yIiwicmVzaGFwZV8zIiwid2l0aF9vcGVuIiwib3BlbmZ1biIsIndpdGhfb3Blbl9iaW4iLCJ3aXRoX29wZW5fdGV4dCIsIndpdGhfb3Blbl9nZW4iLCJzZWVrIiwibGVuZ3RoJDExIiwiaW5wdXRfY2hhciQwIiwiaW5wdXRfYnl0ZSQwIiwiaW5wdXRfbGluZSQwIiwicmVhbGx5X2lucHV0JDAiLCJyZWFsbHlfaW5wdXRfc3RyaW5nJDAiLCJyZWFkX3VwdG8iLCJlbnN1cmUiLCJuZXdfbGVuJDAiLCJuZXdfbGVuJDEiLCJpbnB1dF9hbGwiLCJjaHVua19zaXplIiwiaW5pdGlhbF9zaXplJDAiLCJpbml0aWFsX3NpemUkMSIsIm5yZWFkIiwiYnVmJDAiLCJidWYkMSIsInJlbSIsIndpdGhfb3BlbiQwIiwid2l0aF9vcGVuX2JpbiQwIiwid2l0aF9vcGVuX3RleHQkMCIsIndpdGhfb3Blbl9nZW4kMCIsInNlZWskMCIsInBvcyQwIiwibGVuZ3RoJDEyIiwidGFyaWYiLCJkZXN0aW5hdGFpcmVzIiwicGllY2VzIiwiZm91cm5pdHVyZXMiLCJzaG9ydF9zdHJpbmdfb2ZfcGllY2UiLCJsb25nX3N0cmluZ19vZl9waWVjZSIsImV4biIsIm1vZHVsZSIsImdsb2JhbFRoaXMiLCJudWxsIiwidW5kZWZpbmVkIiwianNvb19leHBvcnRzIiwiZXZlbnQiLCJzZXRfc3RyaW5nX2lucHV0X2J5X2lkIiwibm0iLCJ2IiwiaW5wIiwicmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQiLCJ6ZXJvX2ludF9pbnB1dF9ieV9pZCIsInJlYWRfaW50X2lucHV0X2J5X2lkIiwic2V0X3RkX2J5X2lkIiwidGQiLCJmaWVsZF9pZF9ieV9mb3Vybml0dXJlIiwiZiIsInAiLCJmaWVsZF9pZF9hbmRfcGllY2VfYnlfZm91cm5pdHUiLCJhbGxfbmFtZXMiLCJjb21wdXRlIiwicyIsImZpZWxkX2lkIiwicXRlIiwidG90YWwiLCJhIiwiYiIsInNob3J0JDAiLCJkZXRhaWwiLCJxIiwiZGVzY3IiLCJyZXN1bWUiLCJyZXNldF9mb3JtIiwiZG9pdCJdLCJzb3VyY2VzIjpbIiIsIi9idWlsdGluXFwraW50NjQuanMiLCIvYnVpbHRpblxcK21sQnl0ZXMuanMiLCIvYnVpbHRpblxcK2ZhaWwuanMiLCIvYnVpbHRpblxcK3N0ZGxpYi5qcyIsIi9idWlsdGluXFwrZm9ybWF0LmpzIiwiL2J1aWx0aW5cXCtpZWVlXzc1NC5qcyIsIi9idWlsdGluXFwrZnNfbm9kZS5qcyIsIi9idWlsdGluXFwrZnMuanMiLCIvYnVpbHRpblxcK3VuaXguanMiLCIvYnVpbHRpblxcK3N5cy5qcyIsIi9idWlsdGluXFwrZnNfZmFrZS5qcyIsIi9idWlsdGluXFwrbmF0LmpzIiwiL2J1aWx0aW5cXCtncmFwaGljcy5qcyIsIi9idWlsdGluXFwrbWFyc2hhbC5qcyIsIi9idWlsdGluXFwraW8uanMiLCIvYnVpbHRpblxcK2djLmpzIiwiL2J1aWx0aW5cXCtiaWdhcnJheS5qcyIsIi9idWlsdGluXFwranNsaWIuanMiLCIvYnVpbHRpblxcK3BhcnNpbmcuanMiLCIvYnVpbHRpblxcK2ludHMuanMiLCIvYnVpbHRpblxcK2hhc2guanMiLCIvYnVpbHRpblxcK2NvbXBhcmUuanMiLCIvYnVpbHRpblxcK2pzbGliX2pzX29mX29jYW1sLmpzIiwiL2J1aWx0aW5cXCtvYmouanMiLCIvYnVpbHRpblxcK2JpZ3N0cmluZy5qcyIsIi9idWlsdGluXFwrYmFja3RyYWNlLmpzIiwiL2J1aWx0aW5cXCtsZXhpbmcuanMiLCIvYnVpbHRpblxcK2FycmF5LmpzIiwiL2J1aWx0aW5cXCt3ZWFrLmpzIiwiL2J1aWx0aW5cXCttZDUuanMiLCIvYnVpbHRpblxcK3N0ci5qcyIsIi9idWlsdGluXFwrYmlnc3RyaW5nLWNzdHJ1Y3QuanMiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHVjaGFyLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxpbnQ2NC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcbGV4aW5nLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxjYW1saW50ZXJuYWxGb3JtYXQubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHByaW50ZXhjLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxmaWxlbmFtZS5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcY29tcGxleC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcY2FtbGludGVybmFsRm9ybWF0QmFzaWNzLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxjYW1saW50ZXJuYWxBdG9taWMubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHN0ZGxpYi5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxccGVydmFzaXZlcy5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcZmxvYXQubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHJhbmRvbS5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcbGlzdC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcaW5fY2hhbm5lbC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcb3V0X2NoYW5uZWwubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGVpdGhlci5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcbmF0aXZlaW50Lm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxvYmoubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGNhbWxpbnRlcm5hbExhenkubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGxhenkubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHNlcS5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcb3B0aW9uLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxyZXN1bHQubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGJvb2wubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGNoYXIubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGJ5dGVzLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxpbnQubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHN0cmluZy5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcdW5pdC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcbWFyc2hhbC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcYXJyYXkubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGludDMyLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxwYXJzaW5nLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxzZXQubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXG1hcC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcc3RhY2subWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXHF1ZXVlLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxzdHJlYW0ubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGJ1ZmZlci5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxccHJpbnRmLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxhcmcubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGZ1bi5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcZ2MubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGRpZ2VzdC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcaGFzaHRibC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcd2Vhay5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcZm9ybWF0Lm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxzY2FuZi5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcY2FsbGJhY2subWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGNhbWxpbnRlcm5hbE9PLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxjYW1saW50ZXJuYWxNb2QubWwiLCJDOi9Vc2Vycy9tYWR1Ly5vcGFtLzQuMTQuMCttaW5ndzY0Yy9saWIvb2NhbWxcXGdlbmxleC5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcZXBoZW1lcm9uLm1sIiwiQzovVXNlcnMvbWFkdS8ub3BhbS80LjE0LjArbWluZ3c2NGMvbGliL29jYW1sXFxiaWdhcnJheS5tbCIsIkM6XFxVc2Vyc1xcbWFkdVxccHJvamV0c1xccGVyc29cXGxvY2F0aW9uX2R1YnV2YWxcXF9idWlsZFxcZGVmYXVsdFxcaW52ZW50YWlyZV9saW5nZS9pbnZlbnRhaXJlX2xpbmdlLm1sIiwiIiwiIiwiQzpcXFVzZXJzXFxtYWR1XFxwcm9qZXRzXFxwZXJzb1xcbG9jYXRpb25fZHVidXZhbFxcX2J1aWxkXFxkZWZhdWx0XFxtZWNoYW5pYy9tZWNoYW5pYy5tbCIsIkM6L1VzZXJzL21hZHUvLm9wYW0vNC4xNC4wK21pbmd3NjRjL2xpYi9vY2FtbFxcc3RkX2V4aXQubWwiXSwibWFwcGluZ3MiOiI7O0NBQ0MsU0FBVUE7V0FDRkM7Ozs7S0FDTEM7T0FDRTtRQUNDO1VBQXNCRiw4Q0FFaEJHO1FBQ0hDO0lBRVIsU0FBU0Q7TUFDUCxJQUFJRSxPQUFTSCxRQUFRSTtNQUNyQkQsb0JBQW9CQTthQUNiTCxvQkFDVCxDQWJEO0dBY0NBOzs7SUMyTkYsU0FBU08sbUJBQW1CQyxHQUFLLFNBQVEsVUFBWTtJQ3pMckQsU0FBU0MsZ0JBQWdCQyxFQUFHQztNQUMxQixHQUFHRCxPQUFRO01BQ1gsR0FBSUMsU0FBVSxPQUFRLFNBQVNEO01BQy9CLElBQU0sS0FBUTtNQUNkO09BQVEsQ0FDTixHQUFJQSxNQUFPRSxLQUFLRDtRQUNoQkQ7UUFDQSxHQUFJQSxPQUFRLE9BQU9FO1FBQ25CRCxLQUFLQTtRQUNMRTtRQUNBLEdBQUlBLE9BQVEsYUFNaEI7SUQ3Q0EsSUFBSUMsa0JB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQ2tCS0M7S0FDQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0N3QkFDO0tBQ0FDO0tBQ0FDO0tBSUFDO0tBQ0FDOzs7O0tDekJBQztLQW1IQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQ285RU1DO0tBUVFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQ2xsRmRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tDc0VFQztLQUNBQztLQUNBQztLQUNBQzs7O0tBL0VZQztLQW1IWkM7S0FDQUM7S0FDQUM7S0FDQUM7OztLQW1JQUM7S0FDQUM7S0FDQUM7S0FDQUM7OztLQ3hQRkM7S0FDQUM7S0FDQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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T055Y1dNLEVBQXdCO0lBMUsxQixTQzVKVHNDLGFEdVVhaEYsR0FBSSxxQk0xY2pCb0MsT04wY2FwQyxFQUEwQjtJQTNLOUIsU0MzSlRpRixZRHVVWWpGLEdBQUksb0JNM2NoQm9DLE9OMmNZcEMsRUFBeUI7SUE1SzVCLFNDMUpUa0YsVUR1VVU1SjtNQUF5QixxQk01Y25DOEcsT040Y21DLDRCQUF6QjlHLEdBQTBDO0lBN0szQyxTQ3pKVDZKLFlEdVVZM0YsR0FBeUIscUJNN2NyQzRDLE9ONmNxQyxVQUF6QjVDLEdBQTRDO0lBOUsvQyxTQ3hKVDRGLGNEdVVjcEY7TUFDaEIsY00vY0VvQyxPTjhjY3BDO01BQ1Esb0JNL2N0Qm9DO01OK2MrQyxxQk0vYy9DQSxPTitjMkQ7SUFoTGxELFNDdkpUaUQ7TUR3VW1CLG9CTWhkbkJqRCxXTmdkNEMscUJNaGQ1Q0EsT05nZHdEO0lBakwvQyxTQ3RKVGtELFdEMlVXNUMsR0FBSSwyQk1uZGZMLE9ObWRXSyxFQUF3QjtJQXJMMUIsU0NySlQ2QyxhRDJVYXZGLEdBQUkscUJNcGRqQnFDLE9Ob2RhckMsRUFBMEI7SUF0TDlCLFNDcEpUd0YsWUQyVVl4RixHQUFJLG9CTXJkaEJxQyxPTnFkWXJDLEVBQXlCO0lBdkw1QixTQ25KVHlGLFVEMlVVbks7TUFBeUIscUJNdGRuQytHLE9Oc2RtQyw0QkFBekIvRyxHQUEwQztJQXhMM0MsU0NsSlRvSyxZRDJVWWxHLEdBQXlCLHFCTXZkckM2QyxPTnVkcUMsVUFBekI3QyxHQUE0QztJQXpML0MsU0NqSlRtRyxjRDJVYzNGO01BQ2hCLGNNemRFcUMsT053ZGNyQztNQUNRLG9CTXpkdEJxQztNTnlkK0MscUJNemQvQ0EsT055ZDJEO0lBM0xsRCxTQ2hKVHVEO01ENFVtQixvQk0xZG5CdkQsV04wZDRDLHFCTTFkNUNBLE9OMGR3RDtJQTVML0MsU0MvSVR3RCxpQkQrVWUsY00vZGZ6RCxRTitkZSxrQksvZGZELE1MK2Q2QztJQWhNcEMsU0M5SVQyRCxnQkQrVXdDLDBCQUFiLGFBQWE7SUFqTS9CLFNDN0lUQyxvQkQrVW1DLHNDQUFh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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2VDQ0NBLFdEREQsNkJDQ0NDLEtEREQsSUNDQ0M7SURERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUNDQ0NDLHVCREREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dCQ0NDQyxNREREOzs7Ozs7Ozs7O3lCQ0NDQSxNREREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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Q0gsd0NBREdBO1lBQ0g7Y0FFSzs7Ozs7ZUFDVSx1QkFEUU07Y0FDUixPQUFKTztlQUdpQjsyQ0FIakJBO2dCQUdTO3dCQUFULHNCQUpzQkYsY0FBbkJDOzs7d0JBQUhQLElBQ0FRLFdBSVk7WUFDWDs4QkFQVDthQVFBOzBCQUNPO1lBRkUsSUFHRyxnQkFBd0IsK0JBQWxDRDtZQUFrQyxhQVpwQ1osZ0JBWW9EO1NBYjNEOzs7WUFlVTtlQUFnQlk7YUFTZTtxREFUZkE7bUJBU1I7OztZQVRSO2FBTUQ7YUFEQSxtQ0FMT0U7YUFJUDthQURJLDJCQUhVRDthQUdkO3FEQVFBO3dCQVhSO1NBaEJMO1NBREE7U0FIc0M7U0FBSjtTQUExQjtTQUZKO1NBRko7U0FIWTtTQUFKO1NBREE7U0FGSjtTQUZKO1NBRmdDO1NBQUo7U0FBcEI7U0FBSjtTQUZKO1NBRko7U0FtRXNCO1NBQXNCOzt1QkFBM0M7ZUF3RElFO01BREcsUUFvQkc7SUEzTEMsU0E2TFpDO01BR0U7O09BQXNFO2FBRnRFQztnQkFNRjtnQkFDQTtnQkFDQTtnQkFDMkM7a0JBQTlCLDJCQTFPYnRCLHNCQW1DQVE7Z0JBdU0yQztlQVR6Q2MsSUFVVTtJQUdkLDBDQWhDRWI7SUFpQ0YsNkNBZkVZO0lBZUY7O1VEbFFIOzs7Ozs7O0lDQUE7Ozs7SUNrQlM7OztVRGxCVCIsInNvdXJjZXNDb250ZW50IjpbbnVsbCwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG52YXIgY2FtbF9pbnQ2NF9vZmZzZXQgPSBNYXRoLnBvdygyLCAtMjQpO1xuXG4vL1Byb3ZpZGVzOiBNbEludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuZnVuY3Rpb24gTWxJbnQ2NCAobG8sbWksaGkpIHtcbiAgdGhpcy5sbyA9IGxvICYgMHhmZmZmZmY7XG4gIHRoaXMubWkgPSBtaSAmIDB4ZmZmZmZmO1xuICB0aGlzLmhpID0gaGkgJiAweGZmZmY7XG59XG5NbEludDY0LnByb3RvdHlwZS5jYW1sX2N1c3RvbSA9IFwiX2pcIlxuTWxJbnQ2NC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8sdGhpcy5taSx0aGlzLmhpKTtcbn1cblxuTWxJbnQ2NC5wcm90b3R5cGUudWNvbXBhcmUgPSBmdW5jdGlvbiAoeCkge1xuICBpZiAodGhpcy5oaSA+IHguaGkpIHJldHVybiAxO1xuICBpZiAodGhpcy5oaSA8IHguaGkpIHJldHVybiAtMTtcbiAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMubWkgPCB4Lm1pKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgaGkgPSB0aGlzLmhpIDw8IDE2O1xuICB2YXIgeGhpID0geC5oaSA8PCAxNjtcbiAgaWYgKGhpID4geGhpKSByZXR1cm4gMTtcbiAgaWYgKGhpIDwgeGhpKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLm1pID4geC5taSkgcmV0dXJuIDE7XG4gIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICBpZiAodGhpcy5sbyA8IHgubG8pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5NbEludDY0LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsbyA9IC0gdGhpcy5sbztcbiAgdmFyIG1pID0gLSB0aGlzLm1pICsgKGxvID4+IDI0KTtcbiAgdmFyIGhpID0gLSB0aGlzLmhpICsgKG1pID4+IDI0KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIGxvID0gdGhpcy5sbyArIHgubG87XG4gIHZhciBtaSA9IHRoaXMubWkgKyB4Lm1pICsgKGxvID4+IDI0KTtcbiAgdmFyIGhpID0gdGhpcy5oaSArIHguaGkgKyAobWkgPj4gMjQpO1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbG8gPSB0aGlzLmxvIC0geC5sbztcbiAgdmFyIG1pID0gdGhpcy5taSAtIHgubWkgKyAobG8gPj4gMjQpO1xuICB2YXIgaGkgPSB0aGlzLmhpIC0geC5oaSArIChtaSA+PiAyNCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBsbyA9IHRoaXMubG8gKiB4LmxvO1xuICB2YXIgbWkgPSAoKGxvICogY2FtbF9pbnQ2NF9vZmZzZXQpIHwgMCkgKyB0aGlzLm1pICogeC5sbyArIHRoaXMubG8gKiB4Lm1pO1xuICB2YXIgaGkgPSAoKG1pICogY2FtbF9pbnQ2NF9vZmZzZXQpIHwgMCkgKyB0aGlzLmhpICogeC5sbyArIHRoaXMubWkgKiB4Lm1pICsgdGhpcy5sbyAqIHguaGk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLmxvfHRoaXMubWl8dGhpcy5oaSkgPT0gMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuaGkgPDwgMTYpIDwgMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh0aGlzLmxvICYgeC5sbywgdGhpcy5taSAmIHgubWksIHRoaXMuaGkgJiB4LmhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG98eC5sbywgdGhpcy5taXx4Lm1pLCB0aGlzLmhpfHguaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG9eeC5sbywgdGhpcy5taV54Lm1pLCB0aGlzLmhpXnguaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuc2hpZnRfbGVmdCA9IGZ1bmN0aW9uIChzKSB7XG4gIHMgPSBzICYgNjM7XG4gIGlmIChzID09IDApIHJldHVybiB0aGlzO1xuICBpZiAocyA8IDI0KSB7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0ICh0aGlzLmxvIDw8IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5taSA8PCBzKSB8ICh0aGlzLmxvID4+ICgyNCAtIHMpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhpIDw8IHMpIHwgKHRoaXMubWkgPj4gKDI0IC0gcykpKTtcbiAgfVxuICBpZiAocyA8IDQ4KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG8gPDwgKHMgLSAyNCksXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5taSA8PCAocyAtIDI0KSkgfCAodGhpcy5sbyA+PiAoNDggLSBzKSkpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoMCwgMCwgdGhpcy5sbyA8PCAocyAtIDQ4KSlcbn1cbk1sSW50NjQucHJvdG90eXBlLnNoaWZ0X3JpZ2h0X3Vuc2lnbmVkID0gZnVuY3Rpb24gKHMpIHtcbiAgcyA9IHMgJiA2MztcbiAgaWYgKHMgPT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChzIDwgMjQpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgKHRoaXMubWkgPj4gcykgfCAodGhpcy5oaSA8PCAoMjQgLSBzKSksXG4gICAgICAodGhpcy5oaSA+PiBzKSk7XG4gIGlmIChzIDwgNDgpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICh0aGlzLmhpID4+IChzIC0gMjQpKSxcbiAgICAgIDApO1xuICByZXR1cm4gbmV3IE1sSW50NjQgKHRoaXMuaGkgPj4gKHMgLSA0OCksIDAsIDApO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuc2hpZnRfcmlnaHQgPSBmdW5jdGlvbiAocykge1xuICBzID0gcyAmIDYzO1xuICBpZiAocyA9PSAwKSByZXR1cm4gdGhpcztcbiAgdmFyIGggPSAodGhpcy5oaSA8PCAxNikgPj4gMTY7XG4gIGlmIChzIDwgMjQpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgKHRoaXMubWkgPj4gcykgfCAoaCA8PCAoMjQgLSBzKSksXG4gICAgICAoKHRoaXMuaGkgPDwgMTYpID4+IHMpID4+PiAxNik7XG4gIHZhciBzaWduID0gKHRoaXMuaGkgPDwgMTYpID4+IDMxO1xuICBpZiAocyA8IDQ4KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgICAodGhpcy5taSA+PiAocyAtIDI0KSkgfCAodGhpcy5oaSA8PCAoNDggLSBzKSksXG4gICAgICAodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAyNCkgPj4gMTYsXG4gICAgICBzaWduICYgMHhmZmZmKTtcbiAgcmV0dXJuIG5ldyBNbEludDY0ICgodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAzMiksIHNpZ24sIHNpZ24pO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubHNsMSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oaSA9ICh0aGlzLmhpIDw8IDEpIHwgKHRoaXMubWkgPj4gMjMpO1xuICB0aGlzLm1pID0gKCh0aGlzLm1pIDw8IDEpIHwgKHRoaXMubG8gPj4gMjMpKSAmIDB4ZmZmZmZmO1xuICB0aGlzLmxvID0gKHRoaXMubG8gPDwgMSkgJiAweGZmZmZmZjtcbn1cbk1sSW50NjQucHJvdG90eXBlLmxzcjEgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubG8gPSAoKHRoaXMubG8gPj4+IDEpIHwgKHRoaXMubWkgPDwgMjMpKSAmIDB4ZmZmZmZmO1xuICB0aGlzLm1pID0gKCh0aGlzLm1pID4+PiAxKSB8ICh0aGlzLmhpIDw8IDIzKSkgJiAweGZmZmZmZjtcbiAgdGhpcy5oaSA9IHRoaXMuaGkgPj4+IDE7XG59XG5NbEludDY0LnByb3RvdHlwZS51ZGl2bW9kID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBtb2R1bHVzID0gdGhpcy5jb3B5KCk7XG4gIHZhciBkaXZpc29yID0geC5jb3B5KCk7XG4gIHZhciBxdW90aWVudCA9IG5ldyBNbEludDY0KDAsMCwwKTtcbiAgd2hpbGUgKG1vZHVsdXMudWNvbXBhcmUoZGl2aXNvcikgPiAwKSB7XG4gICAgb2Zmc2V0Kys7XG4gICAgZGl2aXNvci5sc2wxKCk7XG4gIH1cbiAgd2hpbGUgKG9mZnNldCA+PSAwKSB7XG4gICAgb2Zmc2V0IC0tO1xuICAgIHF1b3RpZW50LmxzbDEoKTtcbiAgICBpZiAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+PSAwKSB7XG4gICAgICBxdW90aWVudC5sbyArKztcbiAgICAgIG1vZHVsdXMgPSBtb2R1bHVzLnN1YihkaXZpc29yKTtcbiAgICB9XG4gICAgZGl2aXNvci5sc3IxKCk7XG4gIH1cbiAgcmV0dXJuIHsgcXVvdGllbnQgOiBxdW90aWVudCwgbW9kdWx1cyA6IG1vZHVsdXMgfTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uICh5KVxue1xuICB2YXIgeCA9IHRoaXM7XG4gIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpO1xuICB2YXIgc2lnbiA9IHguaGkgXiB5LmhpO1xuICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gIGlmICh5LmhpICYgMHg4MDAwKSB5ID0geS5uZWcoKTtcbiAgdmFyIHEgPSB4LnVkaXZtb2QoeSkucXVvdGllbnQ7XG4gIGlmIChzaWduICYgMHg4MDAwKSBxID0gcS5uZWcoKTtcbiAgcmV0dXJuIHE7XG59XG5NbEludDY0LnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiAoeSlcbntcbiAgdmFyIHggPSB0aGlzO1xuICBpZiAoeS5pc1plcm8oKSkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgdmFyIHNpZ24gPSB4LmhpO1xuICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gIGlmICh5LmhpICYgMHg4MDAwKSB5ID0geS5uZWcoKTtcbiAgdmFyIHIgPSB4LnVkaXZtb2QoeSkubW9kdWx1cztcbiAgaWYgKHNpZ24gJiAweDgwMDApIHIgPSByLm5lZygpO1xuICByZXR1cm4gcjtcbn1cbk1sSW50NjQucHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sbyB8ICh0aGlzLm1pIDw8IDI0KTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnRvRmxvYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoKHRoaXMuaGkgPDwgMTYpICogTWF0aC5wb3coMiwgMzIpICsgdGhpcy5taSAqIE1hdGgucG93KDIsIDI0KSkgKyB0aGlzLmxvO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmhpID4+IDgsXG4gICAgICAgICAgdGhpcy5oaSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5taSA+PiAxNixcbiAgICAgICAgICAodGhpcy5taSA+PiA4KSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5taSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5sbyA+PiAxNixcbiAgICAgICAgICAodGhpcy5sbyA+PiA4KSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5sbyAmIDB4ZmZdO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubG8zMiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubG8gfCAoKHRoaXMubWkgJiAweGZmKSA8PCAyNCk7XG59XG5NbEludDY0LnByb3RvdHlwZS5oaTMyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKCh0aGlzLm1pID4+PiA4KSAmIDB4ZmZmZikgfCAodGhpcy5oaSA8PCAxNik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdWx0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3VsdCh4LHkpIHsgcmV0dXJuIHgudWNvbXBhcmUoeSkgPCAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY29tcGFyZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9jb21wYXJlKHgseSwgdG90YWwpIHsgcmV0dXJuIHguY29tcGFyZSh5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbmVnIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X25lZyAoeCkgeyByZXR1cm4geC5uZWcoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYWRkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FkZCAoeCwgeSkgeyByZXR1cm4geC5hZGQoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3N1YiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zdWIgKHgsIHkpIHsgcmV0dXJuIHguc3ViKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9tdWwgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2ludDY0X211bCh4LHkpIHsgcmV0dXJuIHgubXVsKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc196ZXJvIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2lzX3plcm8oeCkgeyByZXR1cm4gK3guaXNaZXJvKCk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSB7IHJldHVybiAreC5pc05lZygpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYW5kIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FuZCAoeCwgeSkgeyByZXR1cm4geC5hbmQoeSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vciBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vciAoeCwgeSkgeyByZXR1cm4geC5vcih5KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3hvciBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF94b3IgKHgsIHkpIHsgcmV0dXJuIHgueG9yKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgKHgsIHMpIHsgcmV0dXJuIHguc2hpZnRfbGVmdChzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgKHgsIHMpIHsgcmV0dXJuIHguc2hpZnRfcmlnaHRfdW5zaWduZWQocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0ICh4LCBzKSB7IHJldHVybiB4LnNoaWZ0X3JpZ2h0KHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9kaXYgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZGl2ICh4LCB5KSB7IHJldHVybiB4LmRpdih5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbW9kIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X21vZCAoeCwgeSkgeyByZXR1cm4geC5tb2QoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mX2ludDMyIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2ludDMyICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh4ICYgMHhmZmZmZmYsICh4ID4+IDI0KSAmIDB4ZmZmZmZmLCAoeCA+PiAzMSkgJiAweGZmZmYpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9faW50MzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9faW50MzIgKHgpIHsgcmV0dXJuIHgudG9JbnQoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fZmxvYXQgKHgpIHsgcmV0dXJuIHgudG9GbG9hdCAoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2Zsb2F0ICh4KSB7XG4gIGlmICh4IDwgMCkgeCA9IE1hdGguY2VpbCh4KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KFxuICAgIHggJiAweGZmZmZmZixcbiAgICBNYXRoLmZsb29yKHggKiBjYW1sX2ludDY0X29mZnNldCkgJiAweGZmZmZmZixcbiAgICBNYXRoLmZsb29yKHggKiBjYW1sX2ludDY0X29mZnNldCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfZm9ybWF0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZ1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSwgY2FtbF9pbnQ2NF9uZWdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdG9faW50MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfemVybywgY2FtbF9zdHJfcmVwZWF0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2Zvcm1hdCAoZm10LCB4KSB7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGYuc2lnbmVkY29udiAmJiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpKSB7XG4gICAgZi5zaWduID0gLTE7IHggPSBjYW1sX2ludDY0X25lZyh4KTtcbiAgfVxuICB2YXIgYnVmZmVyID0gXCJcIjtcbiAgdmFyIHdiYXNlID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihmLmJhc2UpO1xuICB2YXIgY3Z0YmwgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgZG8ge1xuICAgIHZhciBwID0geC51ZGl2bW9kKHdiYXNlKTtcbiAgICB4ID0gcC5xdW90aWVudDtcbiAgICBidWZmZXIgPSBjdnRibC5jaGFyQXQoY2FtbF9pbnQ2NF90b19pbnQzMihwLm1vZHVsdXMpKSArIGJ1ZmZlcjtcbiAgfSB3aGlsZSAoISBjYW1sX2ludDY0X2lzX3plcm8oeCkpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9ICcgJztcbiAgICB2YXIgbiA9IGYucHJlYyAtIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBidWZmZXIgPSBjYW1sX3N0cl9yZXBlYXQgKG4sICcwJykgKyBidWZmZXI7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgYnVmZmVyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSwgY2FtbF9mYWlsd2l0aCwgY2FtbF9wYXJzZV9kaWdpdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiwgY2FtbF9pbnQ2NF91bHRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X211bCwgY2FtbF9pbnQ2NF9uZWdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCxjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX3N0cmluZyhzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIChzKTtcbiAgdmFyIGkgPSByWzBdLCBzaWduID0gclsxXSwgYmFzZSA9IHJbMl07XG4gIHZhciBiYXNlNjQgPSBjYW1sX2ludDY0X29mX2ludDMyKGJhc2UpO1xuICB2YXIgdGhyZXNob2xkID1cbiAgICAgIG5ldyBNbEludDY0KDB4ZmZmZmZmLCAweGZmZmZmZmYsIDB4ZmZmZikudWRpdm1vZChiYXNlNjQpLnF1b3RpZW50O1xuICB2YXIgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICBmb3IgKDs7KSB7XG4gICAgaSsrO1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICAvKiBEZXRlY3Qgb3ZlcmZsb3cgaW4gbXVsdGlwbGljYXRpb24gYmFzZSAqIHJlcyAqL1xuICAgIGlmIChjYW1sX2ludDY0X3VsdCh0aHJlc2hvbGQsIHJlcykpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICAgIGQgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfYWRkKGNhbWxfaW50NjRfbXVsKGJhc2U2NCwgcmVzKSwgZCk7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIGFkZGl0aW9uIChiYXNlICogcmVzKSArIGQgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQocmVzLCBkKSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIH1cbiAgaWYgKGkgIT0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgaWYgKGJhc2UgPT0gMTAgJiYgY2FtbF9pbnQ2NF91bHQobmV3IE1sSW50NjQoMCwgMCwgMHg4MDAwKSwgcmVzKSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgaWYgKHNpZ24gPCAwKSByZXMgPSBjYW1sX2ludDY0X25lZyhyZXMpO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkobG8sIG1pLCBoaSl7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKVxufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkgY29uc3Rcbi8vUmVxdWlyZXM6IE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpKGxvLCBoaSl7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgbG8gJiAweGZmZmZmZixcbiAgICAoKGxvID4+PiAyNCkgJiAweGZmKSB8ICgoaGkgJiAweGZmZmYpIDw8IDgpLFxuICAgIChoaSA+Pj4gMTYpICYgMHhmZmZmKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbG8zMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9sbzMyKHYpeyByZXR1cm4gdi5sbzMyKCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hpMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGkzMih2KXsgcmV0dXJuIHYuaGkzMigpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChhWzddIDw8IDAgfCAoYVs2XSA8PCA4KSB8IChhWzVdIDw8IDE2KSxcbiAgICAgICAgICAgICAgICAgICAgIGFbNF0gPDwgMCB8IChhWzNdIDw8IDgpIHwgKGFbMl0gPDwgMTYpLFxuICAgICAgICAgICAgICAgICAgICAgYVsxXSA8PCAwIHwgKGFbMF0gPDwgOCkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF90b19ieXRlcyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19ieXRlcyh4KSB7IHJldHVybiB4LnRvQXJyYXkoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGFzaCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oYXNoKHYpe1xuICByZXR1cm4gKHYubG8zMigpKSBeICh2LmhpMzIoKSlcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEFuIE9DYW1sIHN0cmluZyBpcyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBmaWVsZHM6XG4vLyAtIHRhZyAndCdcbi8vIC0gbGVuZ3RoICdsJ1xuLy8gLSBjb250ZW50cyAnYydcbi8vXG4vLyBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgSmF2YVNjcmlwdCBhcnJheSBvclxuLy8gYSBKYXZhU2NyaXB0IHN0cmluZy4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyBjYW4gYmUgbGVzcyB0aGFuIHRoZVxuLy8gbGVuZ3RoIG9mIHRoZSBPQ2FtbCBzdHJpbmcuIEluIHRoaXMgY2FzZSwgcmVtYWluaW5nIGJ5dGVzIGFyZVxuLy8gYXNzdW1lZCB0byBiZSB6ZXJvZXMuIEFycmF5cyBhcmUgbXV0YWJsZSBidXQgY29uc3VtZXMgbW9yZSBtZW1vcnlcbi8vIHRoYW4gc3RyaW5ncy4gQSBjb21tb24gcGF0dGVybiBpcyB0byBzdGFydCBmcm9tIGFuIGVtcHR5IHN0cmluZyBhbmRcbi8vIHByb2dyZXNzaXZlbHkgZmlsbCBpdCBmcm9tIHRoZSBzdGFydC4gUGFydGlhbCBzdHJpbmdzIG1ha2VzIGl0XG4vLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcyBlZmZpY2llbnRseS5cbi8vXG4vLyBXaGVuIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gVVRGLTE2LCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlXG4vLyBzdHJpbmcgaXMgY29tcG9zZWQgb25seSBvZiBBU0NJSSBjaGFyYWN0ZXJzIChpbiB3aGljaCBjYXNlLCBub1xuLy8gY29udmVyc2lvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQpIG9yIG5vdC5cbi8vXG4vLyBUaGUgc3RyaW5nIHRhZyBjYW4gdGh1cyB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy8gICBmdWxsIHN0cmluZyAgICAgQllURSB8IFVOS05PV046ICAgICAgMFxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IEFTQ0lJOiAgICAgICAgOVxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IE5PVF9BU0NJSTogICAgOFxuLy8gICBzdHJpbmcgcHJlZml4ICAgUEFSVElBTDogICAgICAgICAgICAgMlxuLy8gICBhcnJheSAgICAgICAgICAgQVJSQVk6ICAgICAgICAgICAgICAgNFxuLy9cbi8vIE9uZSBjYW4gdXNlIGJpdCBtYXNraW5nIHRvIGRpc2NyaW1pbmF0ZSB0aGVzZSBkaWZmZXJlbnQgY2FzZXM6XG4vLyAgIGtub3duX2VuY29kaW5nKHgpID0geCY4XG4vLyAgIGlzX2FzY2lpKHgpID0gICAgICAgeCYxXG4vLyAgIGtpbmQoeCkgPSAgICAgICAgICAgeCY2XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9zdHJfcmVwZWF0KG4sIHMpIHtcbiAgaWYobiA9PSAwKSByZXR1cm4gXCJcIjtcbiAgaWYgKHMucmVwZWF0KSB7cmV0dXJuIHMucmVwZWF0KG4pO30gLy8gRUNNQXNjcmlwdCA2IGFuZCBGaXJlZm94IDI0K1xuICB2YXIgciA9IFwiXCIsIGwgPSAwO1xuICBmb3IoOzspIHtcbiAgICBpZiAobiAmIDEpIHIgKz0gcztcbiAgICBuID4+PSAxO1xuICAgIGlmIChuID09IDApIHJldHVybiByO1xuICAgIHMgKz0gcztcbiAgICBsKys7XG4gICAgaWYgKGwgPT0gOSkge1xuICAgICAgcy5zbGljZSgwLDEpOyAvLyBmbGF0dGVuIHRoZSBzdHJpbmdcbiAgICAgIC8vIHRoZW4sIHRoZSBmbGF0dGVuaW5nIG9mIHRoZSB3aG9sZSBzdHJpbmcgd2lsbCBiZSBmYXN0ZXIsXG4gICAgICAvLyBhcyBpdCB3aWxsIGJlIGNvbXBvc2VkIG9mIGxhcmdlciBwaWVjZXNcbiAgICB9XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdWJhcnJheV90b19qc2J5dGVzXG4vL1dlYWtkZWZcbi8vIFByZSBFQ01BU2NyaXB0IDUsIFthcHBseV0gd291bGQgbm90IHN1cHBvcnQgYXJyYXktbGlrZSBvYmplY3QuXG4vLyBJbiBzdWNoIHNldHVwLCBUeXBlZF9hcnJheSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBwb2x5ZmlsbCwgYW5kIFtmLmFwcGx5XSB3b3VsZFxuLy8gZmFpbCBoZXJlLiBNYXJrIHRoZSBwcmltaXRpdmUgYXMgV2Vha2RlZiwgc28gdGhhdCBwZW9wbGUgY2FuIG92ZXJyaWRlIGl0IGVhc2lseS5cbmZ1bmN0aW9uIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyAoYSwgaSwgbGVuKSB7XG4gIHZhciBmID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgaWYgKGkgPT0gMCAmJiBsZW4gPD0gNDA5NiAmJiBsZW4gPT0gYS5sZW5ndGgpIHJldHVybiBmLmFwcGx5IChudWxsLCBhKTtcbiAgdmFyIHMgPSBcIlwiO1xuICBmb3IgKDsgMCA8IGxlbjsgaSArPSAxMDI0LGxlbi09MTAyNClcbiAgICBzICs9IGYuYXBwbHkgKG51bGwsIGEuc2xpY2UoaSxpICsgTWF0aC5taW4obGVuLCAxMDI0KSkpO1xuICByZXR1cm4gcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF91dGY4X29mX3V0ZjE2XG5mdW5jdGlvbiBjYW1sX3V0Zjhfb2ZfdXRmMTYocykge1xuICBmb3IgKHZhciBiID0gXCJcIiwgdCA9IGIsIGMsIGQsIGkgPSAwLCBsID0gcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyAoaiA8IGwpICYmIChjID0gcy5jaGFyQ29kZUF0KGopKSA8IDB4ODA7IGorKyk7XG4gICAgICBpZiAoaiAtIGkgPiA1MTIpIHsgdC5zdWJzdHIoMCwgMSk7IGIgKz0gdDsgdCA9IFwiXCI7IGIgKz0gcy5zbGljZShpLCBqKSB9XG4gICAgICBlbHNlIHQgKz0gcy5zbGljZShpLCBqKTtcbiAgICAgIGlmIChqID09IGwpIGJyZWFrO1xuICAgICAgaSA9IGo7XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGMwIHwgKGMgPj4gNikpO1xuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGRmZmYpIHtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGUwIHwgKGMgPj4gMTIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfSBlbHNlIGlmIChjID49IDB4ZGJmZiB8fCBpICsgMSA9PSBsIHx8XG4gICAgICAgICAgICAgICAoZCA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGQgPiAweGRmZmYpIHtcbiAgICAgIC8vIFVubWF0Y2hlZCBzdXJyb2dhdGUgcGFpciwgcmVwbGFjZWQgYnkgXFx1ZmZmZCAocmVwbGFjZW1lbnQgY2hhcmFjdGVyKVxuICAgICAgdCArPSBcIlxceGVmXFx4YmZcXHhiZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBpKys7XG4gICAgICBjID0gKGMgPDwgMTApICsgZCAtIDB4MzVmZGMwMDtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGYwIHwgKGMgPj4gMTgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzZiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9XG4gICAgaWYgKHQubGVuZ3RoID4gMTAyNCkge3Quc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiO31cbiAgfVxuICByZXR1cm4gYit0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3V0ZjE2X29mX3V0ZjhcbmZ1bmN0aW9uIGNhbWxfdXRmMTZfb2ZfdXRmOChzKSB7XG4gIGZvciAodmFyIGIgPSBcIlwiLCB0ID0gXCJcIiwgYywgYzEsIGMyLCB2LCBpID0gMCwgbCA9IHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYzEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGMxIDwgMHg4MCkge1xuICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyAoaiA8IGwpICYmIChjMSA9IHMuY2hhckNvZGVBdChqKSkgPCAweDgwOyBqKyspO1xuICAgICAgaWYgKGogLSBpID4gNTEyKSB7IHQuc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiOyBiICs9IHMuc2xpY2UoaSwgaikgfVxuICAgICAgZWxzZSB0ICs9IHMuc2xpY2UoaSwgaik7XG4gICAgICBpZiAoaiA9PSBsKSBicmVhaztcbiAgICAgIGkgPSBqO1xuICAgIH1cbiAgICB2ID0gMTtcbiAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSkge1xuICAgICAgYyA9IGMyICsgKGMxIDw8IDYpO1xuICAgICAgaWYgKGMxIDwgMHhlMCkge1xuICAgICAgICB2ID0gYyAtIDB4MzA4MDtcbiAgICAgICAgaWYgKHYgPCAweDgwKSB2ID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHYgPSAyO1xuICAgICAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSkge1xuICAgICAgICAgIGMgPSBjMiArIChjIDw8IDYpO1xuICAgICAgICAgIGlmIChjMSA8IDB4ZjApIHtcbiAgICAgICAgICAgIHYgPSBjIC0gMHhlMjA4MDtcbiAgICAgICAgICAgIGlmICgodiA8IDB4ODAwKSB8fCAoKHYgPj0gMHhkN2ZmKSAmJiAodiA8IDB4ZTAwMCkpKSB2ID0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdiA9IDM7XG4gICAgICAgICAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSAmJlxuICAgICAgICAgICAgICAgIChjMSA8IDB4ZjUpKSB7XG4gICAgICAgICAgICAgIHYgPSBjMiAtIDB4M2M4MjA4MCArIChjIDw8IDYpO1xuICAgICAgICAgICAgICBpZiAodiA8IDB4MTAwMDAgfHwgdiA+IDB4MTBmZmZmKSB2ID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHYgPCA0KSB7IC8vIEludmFsaWQgc2VxdWVuY2VcbiAgICAgIGkgLT0gdjtcbiAgICAgIHQgKz0gXCJcXHVmZmZkXCI7XG4gICAgfSBlbHNlIGlmICh2ID4gMHhmZmZmKVxuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZDdjMCArICh2ID4+IDEwKSwgMHhkYzAwICsgKHYgJiAweDNGRikpXG4gICAgZWxzZVxuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEwMjQpIHt0LnN1YnN0cigwLCAxKTsgYiArPSB0OyB0ID0gXCJcIjt9XG4gIH1cbiAgcmV0dXJuIGIrdDtcbn1cblxuLy9Qcm92aWRlczoganNvb19pc19hc2NpaVxuZnVuY3Rpb24ganNvb19pc19hc2NpaSAocykge1xuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGdldHMgYmV0dGVyIGF0IGFyb3VuZCB0aGlzIHBvaW50IGZvciBhbGwgYnJvd3NlcnNcbiAgaWYgKHMubGVuZ3RoIDwgMjQpIHtcbiAgICAvLyBTcGlkZXJtb25rZXkgZ2V0cyBtdWNoIHNsb3dlciB3aGVuIHMubGVuZ3RoID49IDI0IChvbiA2NCBiaXQgYXJjaHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBpZiAocy5jaGFyQ29kZUF0KGkpID4gMTI3KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZVxuICAgIHJldHVybiAhL1teXFx4MDAtXFx4N2ZdLy50ZXN0KHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICBkZWZhdWx0OiAvKiBQQVJUSUFMICovXG4gICAgaWYgKGkgPj0gcy5jLmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNhc2UgMDogLyogQllURVMgKi9cbiAgICByZXR1cm4gcy5jLmNoYXJDb2RlQXQoaSk7XG4gIGNhc2UgNDogLyogQVJSQVkgKi9cbiAgICByZXR1cm4gcy5jW2ldXG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSwgYykge1xuICAvLyBUaGUgT0NhbWwgY29tcGlsZXIgdXNlcyBDaGFyLnVuc2FmZV9jaHIgb24gaW50ZWdlcnMgbGFyZ2VyIHRoYW4gMjU1IVxuICBjICY9IDB4ZmY7XG4gIGlmIChzLnQgIT0gNCAvKiBBUlJBWSAqLykge1xuICAgIGlmIChpID09IHMuYy5sZW5ndGgpIHtcbiAgICAgIHMuYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlIChjKTtcbiAgICAgIGlmIChpICsgMSA9PSBzLmwpIHMudCA9IDA7IC8qQllURVMgfCBVTktPV04qL1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheSAocyk7XG4gIH1cbiAgcy5jW2ldID0gYztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcImluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ib3VuZF9lcnJvciAoKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldCAocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDE2KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykgLSAxKSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDEpO1xuICByZXR1cm4gKGIyIDw8IDggfCBiMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQxNihzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMSkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ2V0MzIocyxpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDMpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgMSksXG4gICAgICBiMyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyAyKSxcbiAgICAgIGI0ID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0IHwgYjMgPDwgMTYgfCBiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MzIocyxpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgMSksXG4gICAgICBiMyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIDIpLFxuICAgICAgYjQgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCB8IGIzIDw8IDE2IHwgYjIgPDwgOCB8IGIxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDY0KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykgLSA3KSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yKHZhciBqID0gMDsgaiA8IDg7IGorKyl7XG4gICAgYVs3IC0gal0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQ2NChzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yKHZhciBqID0gMDsgaiA8IDg7IGorKyl7XG4gICAgYVs3IC0gal0gPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQgKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0IChzLCBpLCBjKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX3NldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldCAocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfc2V0IChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldDE2KHMsaSxpMTYpe1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMiA9IDB4RkYgJiBpMTYgPj4gOCxcbiAgICAgIGIxID0gMHhGRiAmIGkxNjtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMCwgYjEpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAxLCBiMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDE2KHMsaSxpMTYpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0MTZcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQxNihzLGksaTE2KXtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfc2V0MTYocyxpLGkxNik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQzMihzLGksaTMyKXtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjQgPSAweEZGICYgaTMyID4+IDI0LFxuICAgICAgYjMgPSAweEZGICYgaTMyID4+IDE2LFxuICAgICAgYjIgPSAweEZGICYgaTMyID4+IDgsXG4gICAgICBiMSA9IDB4RkYgJiBpMzI7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMSwgYjIpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAyLCBiMyk7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDMsIGI0KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0MzIocyxpLGkzMil7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXQzMlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfc2V0MzJcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDMyKHMsaSxpMzIpe1xuICByZXR1cm4gY2FtbF9ieXRlc19zZXQzMihzLGksaTMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldDY0KHMsaSxpNjQpe1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSA3KSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBhID0gY2FtbF9pbnQ2NF90b19ieXRlcyhpNjQpO1xuICBmb3IodmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgNyAtIGosIGFbal0pO1xuICB9XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDY0KHMsaSxpNjQpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0NjRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3NldDY0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQ2NChzLGksaTY0KXtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfc2V0NjQocyxpLGk2NCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0IChzLCBpLCBjKSB7XG4gIGlmIChpID4+PiAwID49IHMubCkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGY4X29mX3V0ZjE2LCBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nIChzKSB7XG4gIHZhciB0YWcgPSA5IC8qIEJZVEVTIHwgQVNDSUkgKi87XG4gIGlmICghanNvb19pc19hc2NpaShzKSlcbiAgICB0YWcgPSA4IC8qIEJZVEVTIHwgTk9UX0FTQ0lJICovLCBzID0gY2FtbF91dGY4X29mX3V0ZjE2KHMpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXModGFnLCBzLCBzLmxlbmd0aCk7XG59XG5cblxuLy9Qcm92aWRlczogTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywganNvb19pc19hc2NpaSwgY2FtbF91dGYxNl9vZl91dGY4XG5mdW5jdGlvbiBNbEJ5dGVzICh0YWcsIGNvbnRlbnRzLCBsZW5ndGgpIHtcbiAgdGhpcy50PXRhZzsgdGhpcy5jPWNvbnRlbnRzOyB0aGlzLmw9bGVuZ3RoO1xufVxuTWxCeXRlcy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpe1xuICBzd2l0Y2ggKHRoaXMudCkge1xuICBjYXNlIDk6IC8qQllURVMgfCBBU0NJSSovXG4gICAgcmV0dXJuIHRoaXMuYztcbiAgZGVmYXVsdDpcbiAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHRoaXMpO1xuICBjYXNlIDA6IC8qQllURVMgfCBVTktPV04qL1xuICAgIGlmIChqc29vX2lzX2FzY2lpKHRoaXMuYykpIHtcbiAgICAgIHRoaXMudCA9IDk7IC8qQllURVMgfCBBU0NJSSovXG4gICAgICByZXR1cm4gdGhpcy5jO1xuICAgIH1cbiAgICB0aGlzLnQgPSA4OyAvKkJZVEVTIHwgTk9UX0FTQ0lJKi9cbiAgY2FzZSA4OiAvKkJZVEVTIHwgTk9UX0FTQ0lJKi9cbiAgICByZXR1cm4gdGhpcy5jO1xuICB9XG59O1xuTWxCeXRlcy5wcm90b3R5cGUudG9VdGYxNiA9IGZ1bmN0aW9uICgpe1xuICB2YXIgciA9IHRoaXMudG9TdHJpbmcoKTtcbiAgaWYodGhpcy50ID09IDkpIHJldHVybiByXG4gIHJldHVybiBjYW1sX3V0ZjE2X29mX3V0Zjgocik7XG59XG5NbEJ5dGVzLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uICgpe1xuICB2YXIgY29udGVudCA9IHRoaXMudCA9PSA0ID8gdGhpcy5jLnNsaWNlKCkgOiB0aGlzLmM7XG4gIHJldHVybiBuZXcgTWxCeXRlcyh0aGlzLnQsY29udGVudCx0aGlzLmwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlc1xuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyAocykge1xuICAvKiBBc3N1bWVzIG5vdCBCWVRFUyAqL1xuICBpZiAocy50ID09IDIgLyogUEFSVElBTCAqLylcbiAgICBzLmMgKz0gY2FtbF9zdHJfcmVwZWF0KHMubCAtIHMuYy5sZW5ndGgsICdcXDAnKVxuICBlbHNlXG4gICAgcy5jID0gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzIChzLmMsIDAsIHMuYy5sZW5ndGgpO1xuICBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LT1dOKi9cbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkgKHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQVJSQVkgKi9cbiAgaWYoZ2xvYmFsVGhpcy5VaW50OEFycmF5KSB7XG4gICAgdmFyIGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50OEFycmF5KHMubCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEgPSBuZXcgQXJyYXkocy5sKTtcbiAgfVxuICB2YXIgYiA9IHMuYywgbCA9IGIubGVuZ3RoLCBpID0gMDtcbiAgZm9yICg7IGkgPCBsOyBpKyspIGFbaV0gPSBiLmNoYXJDb2RlQXQoaSk7XG4gIGZvciAobCA9IHMubDsgaSA8IGw7IGkrKykgYVtpXSA9IDA7XG4gIHMuYyA9IGE7XG4gIHMudCA9IDQ7IC8qIEFSUkFZICovXG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X29mX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9hcnJheV9vZl9ieXRlcyAocykge1xuICBpZiAocy50ICE9IDQgLyogQVJSQVkgKi8pIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheShzKTtcbiAgcmV0dXJuIHMuYztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9zdHJpbmcgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2Zfc3RyaW5nIChzKSB7XG4gIHZhciBsID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocyxpKTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3JlYXRlX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcobGVuKSB7XG4gIGlmKGxlbiA8IDApIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0cmluZy5jcmVhdGVcIik7XG4gIHJldHVybiBuZXcgTWxCeXRlcyhsZW4/Mjo5LFwiXCIsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcyxjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2J5dGVzKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQnl0ZXMuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuPzI6OSxcIlwiLGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2FycmF5IChhKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhhLDAsYS5sZW5ndGgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl9hcnJheSAoYSkge1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoNCxhLGEubGVuZ3RoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19jb21wYXJlIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfY29tcGFyZShzMSwgczIpIHtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jIDwgczIuYyk/LTE6KHMxLmMgPiBzMi5jKT8xOjA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMikge1xuICBpZihzMSA9PT0gczIpIHJldHVybiAxO1xuICAoczEudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICAoczIudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gKHMxLmMgPT0gczIuYyk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19lcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbm90ZXF1YWwoczEsIHMyKSB7IHJldHVybiAxLWNhbWxfc3RyaW5nX2VxdWFsKHMxLCBzMik7IH1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX25vdGVxdWFsKHMxLCBzMikgeyByZXR1cm4gMS1jYW1sX2J5dGVzX2VxdWFsKHMxLCBzMik7IH1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzZXF1YWwgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIChzMS50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIChzMi50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiAoczEuYyA8PSBzMi5jKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfbGVzc3RoYW4gbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzdGhhbihzMSwgczIpIHtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jIDwgczIuYyk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWxcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ3JlYXRlcmVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMyLHMxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMixzMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ3JlYXRlcnRoYW4oczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dyZWF0ZXJ0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19sZXNzdGhhbihzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbGxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyX3JlcGVhdCwgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX2ZpbGxfYnl0ZXMocywgaSwgbCwgYykge1xuICBpZiAobCA+IDApIHtcbiAgICBpZiAoaSA9PSAwICYmIChsID49IHMubCB8fCAocy50ID09IDIgLyogUEFSVElBTCAqLyAmJiBsID49IHMuYy5sZW5ndGgpKSkge1xuICAgICAgaWYgKGMgPT0gMCkge1xuICAgICAgICBzLmMgPSBcIlwiO1xuICAgICAgICBzLnQgPSAyOyAvKiBQQVJUSUFMICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzLmMgPSBjYW1sX3N0cl9yZXBlYXQgKGwsIFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICBzLnQgPSAobCA9PSBzLmwpPzAgLyogQllURVMgfCBVTktPV04gKi8gOjI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHMudCAhPSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gICAgICBmb3IgKGwgKz0gaTsgaSA8IGw7IGkrKykgcy5jW2ldID0gYztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmlsbF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZmlsbF9ieXRlc1xudmFyIGNhbWxfZmlsbF9zdHJpbmcgPSBjYW1sX2ZpbGxfYnl0ZXNcblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ibGl0X2J5dGVzKHMxLCBpMSwgczIsIGkyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgaWYgKChpMiA9PSAwKSAmJlxuICAgICAgKGxlbiA+PSBzMi5sIHx8IChzMi50ID09IDIgLyogUEFSVElBTCAqLyAmJiBsZW4gPj0gczIuYy5sZW5ndGgpKSkge1xuICAgIHMyLmMgPSAoczEudCA9PSA0IC8qIEFSUkFZICovKT9cbiAgICAgIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhzMS5jLCBpMSwgbGVuKTpcbiAgICAgIChpMSA9PSAwICYmIHMxLmMubGVuZ3RoID09IGxlbik/czEuYzpzMS5jLnN1YnN0cihpMSwgbGVuKTtcbiAgICBzMi50ID0gKHMyLmMubGVuZ3RoID09IHMyLmwpPzAgLyogQllURVMgfCBVTktPV04gKi8gOjI7IC8qIFBBUlRJQUwgKi9cbiAgfSBlbHNlIGlmIChzMi50ID09IDIgLyogUEFSVElBTCAqLyAmJiBpMiA9PSBzMi5jLmxlbmd0aCkge1xuICAgIHMyLmMgKz0gKHMxLnQgPT0gNCAvKiBBUlJBWSAqLyk/XG4gICAgICBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbik6XG4gICAgICAoaTEgPT0gMCAmJiBzMS5jLmxlbmd0aCA9PSBsZW4pP3MxLmM6czEuYy5zdWJzdHIoaTEsIGxlbik7XG4gICAgczIudCA9IChzMi5jLmxlbmd0aCA9PSBzMi5sKT8wIC8qIEJZVEVTIHwgVU5LT1dOICovIDoyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSB7XG4gICAgaWYgKHMyLnQgIT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMyKTtcbiAgICB2YXIgYzEgPSBzMS5jLCBjMiA9IHMyLmM7XG4gICAgaWYgKHMxLnQgPT0gNCAvKiBBUlJBWSAqLykge1xuICAgICAgaWYgKGkyIDw9IGkxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGMyIFtpMiArIGldID0gYzEgW2kxICsgaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIGMyIFtpMiArIGldID0gYzEgW2kxICsgaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsID0gTWF0aC5taW4gKGxlbiwgYzEubGVuZ3RoIC0gaTEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIGMyIFtpMiArIGldID0gYzEuY2hhckNvZGVBdChpMSArIGkpO1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykgYzIgW2kyICsgaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ibGl0X3N0cmluZyhhLGIsYyxkLGUpIHtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGEpLGIsYyxkLGUpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19sZW5ndGgocykgeyByZXR1cm4gcy5sIH1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSB7XG4gIHJldHVybiBzLmNoYXJDb2RlQXQoaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfdW5zYWZlX3NldCAocywgaSwgYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfdW5zYWZlX3NldFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBzLmxlbmd0aFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb21wYXJlIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbXBhcmUoczEsIHMyKSB7XG4gIHJldHVybiAoczEgPCBzMik/LTE6KHMxID4gczIpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIGlmKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gKHMxIDw9IHMyKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3N0aGFuKHMxLCBzMikge1xuICByZXR1cm4gKHMxIDwgczIpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocykge1xuICAocy50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocy5jKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4KSB7IHJldHVybiB4IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHgpIHsgcmV0dXJuIHggfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGYxNl9vZl91dGY4XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgaWYoanNvb19pc19hc2NpaShzKSlcbiAgICByZXR1cm4gcztcbiAgcmV0dXJuIGNhbWxfdXRmMTZfb2ZfdXRmOChzKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGY4X29mX3V0ZjE2LCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChzKSB7XG4gIGlmIChqc29vX2lzX2FzY2lpKHMpKVxuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpXG4gIGVsc2UgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF91dGY4X29mX3V0ZjE2KHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMocykgeyByZXR1cm4gbmV3IE1sQnl0ZXMoMCxzLHMubGVuZ3RoKTsgfVxuXG5cbi8vIFRoZSBzZWN0aW9uIGJlbG93IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlLWpzLXN0cmluZz1mYWxzZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQgKHMsIGksIGMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLGksYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBjYW1sX21sX2J5dGVzX2xlbmd0aChzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb21wYXJlXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbXBhcmUoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2NvbXBhcmUoczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2VxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfZXF1YWwoczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzdGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3N0aGFuKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9ieXRlc1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocykgeyByZXR1cm4gcyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7IHJldHVybiBzIH1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpIHsgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgKHMudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gIHJldHVybiBzLmMgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpe1xuICByZXR1cm4gcy50b1V0ZjE2KClcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2lzX21sX2J5dGVzKHMpIHtcbiAgcmV0dXJuIChzIGluc3RhbmNlb2YgTWxCeXRlcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfYnl0ZXNfY29udGVudFxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19jb250ZW50KHMpIHtcbiAgc3dpdGNoIChzLnQgJiA2KSB7XG4gIGRlZmF1bHQ6IC8qIFBBUlRJQUwgKi9cbiAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICBjYXNlIDA6IC8qIEJZVEVTICovXG4gICAgcmV0dXJuIHMuYztcbiAgY2FzZSA0OlxuICAgIHJldHVybiBzLmNcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX21sX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19pc19hc2NpaVxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgIS9bXlxceDAwLVxceGZmXS8udGVzdChzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2lzX21sX2J5dGVzKHMpO1xufVxuXG4vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZXByZWNhdGVkXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcocykgeyByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmV3X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9uZXdfc3RyaW5nIChzKSB7IHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdG9fanNfc3RyaW5nIG11dGFibGUgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdG9fanNfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc190b19zdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHMpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9SYWlzZSBleGNlcHRpb25cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2NvbnN0YW50ICh0YWcpIHsgdGhyb3cgdGFnOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmV0dXJuX2V4bl9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JldHVybl9leG5fY29uc3RhbnQgKHRhZykgeyByZXR1cm4gdGFnOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9hcmcgKHRhZywgYXJnKSB7IHRocm93IFswLCB0YWcsIGFyZ107IH1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZ3MgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9hcmdzICh0YWcsIGFyZ3MpIHsgdGhyb3cgWzAsIHRhZ10uY29uY2F0KGFyZ3MpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKHRhZywgbXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9hcmcgKHRhZywgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhtc2cpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYWlsd2l0aCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ZhaWx3aXRoIChtc2cpIHtcbiAgaWYoIWNhbWxfZ2xvYmFsX2RhdGEuRmFpbHVyZSlcbiAgICBjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmU9WzI0OCxjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiRmFpbHVyZVwiKSwtM107XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLCBtc2cpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2ludmFsaWRfYXJndW1lbnQgKG1zZykge1xuICBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nKGNhbWxfZ2xvYmFsX2RhdGEuSW52YWxpZF9hcmd1bWVudCwgbXNnKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9jb25zdGFudCwgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSAoKSB7XG4gIGNhbWxfcmFpc2VfY29uc3RhbnQoY2FtbF9nbG9iYWxfZGF0YS5FbmRfb2ZfZmlsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfemVyb19kaXZpZGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfY29uc3RhbnQsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRGl2aXNpb25fYnlfemVybyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9mb3VuZCAoKSB7XG4gIGNhbWxfcmFpc2VfY29uc3RhbnQoY2FtbF9nbG9iYWxfZGF0YS5Ob3RfZm91bmQpOyB9XG5cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuIChjb25zdCwgc2hhbGxvdylcbi8vV2Vha2RlZlxuZnVuY3Rpb24gY2FtbF9jYWxsX2dlbihmLCBhcmdzKSB7XG4gIGlmKGYuZnVuKVxuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYuZnVuLCBhcmdzKTtcbiAgLy9GSVhNRSwgY2FuIGhhcHBlbiB3aXRoIHRvbyBtYW55IGFyZ3VtZW50c1xuICBpZih0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZjtcbiAgdmFyIG4gPSBmLmxlbmd0aCB8IDA7XG4gIGlmKG4gPT09IDApIHJldHVybiBmLmFwcGx5KG51bGwsYXJncyk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGggfCAwO1xuICB2YXIgZCA9IG4gLSBhcmdzTGVuIHwgMDtcbiAgaWYgKGQgPT0gMClcbiAgICByZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKTtcbiAgZWxzZSBpZiAoZCA8IDApIHtcbiAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihmLmFwcGx5KG51bGwsYXJncy5zbGljZSgwLG4pKSxhcmdzLnNsaWNlKG4pKTtcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCl7XG4gICAgICB2YXIgZXh0cmFfYXJncyA9IChhcmd1bWVudHMubGVuZ3RoID09IDApPzE6YXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzLmxlbmd0aCtleHRyYV9hcmdzKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIG5hcmdzW2FyZ3MubGVuZ3RoK2ldID0gYXJndW1lbnRzW2ldO1xuICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgbmFyZ3MpXG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG52YXIgY2FtbF9uYW1lZF92YWx1ZXMgPSB7fTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSAoY29uc3QsY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZShubSx2KSB7XG4gIGNhbWxfbmFtZWRfdmFsdWVzW2NhbWxfanNieXRlc19vZl9zdHJpbmcobm0pXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlc1xuZnVuY3Rpb24gY2FtbF9uYW1lZF92YWx1ZShubSkge1xuICByZXR1cm4gY2FtbF9uYW1lZF92YWx1ZXNbbm1dXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2xvYmFsX2RhdGFcbnZhciBjYW1sX2dsb2JhbF9kYXRhID0gWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlZ2lzdGVyX2dsb2JhbCAoY29uc3QsIHNoYWxsb3csIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKG4sIHYsIG5hbWVfb3B0KSB7XG4gIGlmKG5hbWVfb3B0ICYmIGdsb2JhbFRoaXMudG9wbGV2ZWxSZWxvYylcbiAgICBuID0gZ2xvYmFsVGhpcy50b3BsZXZlbFJlbG9jKG5hbWVfb3B0KTtcbiAgY2FtbF9nbG9iYWxfZGF0YVtuICsgMV0gPSB2O1xuICBpZihuYW1lX29wdCkgY2FtbF9nbG9iYWxfZGF0YVtuYW1lX29wdF0gPSB2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9nbG9iYWxfZGF0YSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2dldF9nbG9iYWxfZGF0YSAoKSB7IHJldHVybiBjYW1sX2dsb2JhbF9kYXRhOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfcHJpbnRhYmxlIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfaXNfcHJpbnRhYmxlKGMpIHsgcmV0dXJuICsoYyA+IDMxICYmIGMgPCAxMjcpOyB9XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEZvcm1hdFxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2Zvcm1hdFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2Zvcm1hdCAoZm10KSB7XG4gIGZtdCA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoZm10KTtcbiAgdmFyIGxlbiA9IGZtdC5sZW5ndGg7XG4gIGlmIChsZW4gPiAzMSkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZm9ybWF0X2ludDogZm9ybWF0IHRvbyBsb25nXCIpO1xuICB2YXIgZiA9XG4gICAgICB7IGp1c3RpZnk6JysnLCBzaWduc3R5bGU6Jy0nLCBmaWxsZXI6JyAnLCBhbHRlcm5hdGU6ZmFsc2UsXG4gICAgICAgIGJhc2U6MCwgc2lnbmVkY29udjpmYWxzZSwgd2lkdGg6MCwgdXBwZXJjYXNlOmZhbHNlLFxuICAgICAgICBzaWduOjEsIHByZWM6LTEsIGNvbnY6J2YnIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAnLSc6XG4gICAgICBmLmp1c3RpZnkgPSAnLSc7IGJyZWFrO1xuICAgIGNhc2UgJysnOiBjYXNlICcgJzpcbiAgICAgIGYuc2lnbnN0eWxlID0gYzsgYnJlYWs7XG4gICAgY2FzZSAnMCc6XG4gICAgICBmLmZpbGxlciA9ICcwJzsgYnJlYWs7XG4gICAgY2FzZSAnIyc6XG4gICAgICBmLmFsdGVybmF0ZSA9IHRydWU7IGJyZWFrO1xuICAgIGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzpcbiAgICBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzpcbiAgICAgIGYud2lkdGggPSAwO1xuICAgICAgd2hpbGUgKGM9Zm10LmNoYXJDb2RlQXQoaSkgLSA0OCwgYyA+PSAwICYmIGMgPD0gOSkge1xuICAgICAgICBmLndpZHRoID0gZi53aWR0aCAqIDEwICsgYzsgaSsrXG4gICAgICB9XG4gICAgICBpLS07XG4gICAgICBicmVhaztcbiAgICBjYXNlICcuJzpcbiAgICAgIGYucHJlYyA9IDA7XG4gICAgICBpKys7XG4gICAgICB3aGlsZSAoYz1mbXQuY2hhckNvZGVBdChpKSAtIDQ4LCBjID49IDAgJiYgYyA8PSA5KSB7XG4gICAgICAgIGYucHJlYyA9IGYucHJlYyAqIDEwICsgYzsgaSsrXG4gICAgICB9XG4gICAgICBpLS07XG4gICAgY2FzZSAnZCc6IGNhc2UgJ2knOlxuICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTsgLyogZmFsbHRocm91Z2ggKi9cbiAgICBjYXNlICd1JzpcbiAgICAgIGYuYmFzZSA9IDEwOyBicmVhaztcbiAgICBjYXNlICd4JzpcbiAgICAgIGYuYmFzZSA9IDE2OyBicmVhaztcbiAgICBjYXNlICdYJzpcbiAgICAgIGYuYmFzZSA9IDE2OyBmLnVwcGVyY2FzZSA9IHRydWU7IGJyZWFrO1xuICAgIGNhc2UgJ28nOlxuICAgICAgZi5iYXNlID0gODsgYnJlYWs7XG4gICAgY2FzZSAnZSc6IGNhc2UgJ2YnOiBjYXNlICdnJzpcbiAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7IGYuY29udiA9IGM7IGJyZWFrO1xuICAgIGNhc2UgJ0UnOiBjYXNlICdGJzogY2FzZSAnRyc6XG4gICAgICBmLnNpZ25lZGNvbnYgPSB0cnVlOyBmLnVwcGVyY2FzZSA9IHRydWU7XG4gICAgICBmLmNvbnYgPSBjLnRvTG93ZXJDYXNlICgpOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcmF3YnVmZmVyKSB7XG4gIGlmIChmLnVwcGVyY2FzZSkgcmF3YnVmZmVyID0gcmF3YnVmZmVyLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBsZW4gPSByYXdidWZmZXIubGVuZ3RoO1xuICAvKiBBZGp1c3QgbGVuIHRvIHJlZmxlY3QgYWRkaXRpb25hbCBjaGFycyAoc2lnbiwgZXRjKSAqL1xuICBpZiAoZi5zaWduZWRjb252ICYmIChmLnNpZ24gPCAwIHx8IGYuc2lnbnN0eWxlICE9ICctJykpIGxlbisrO1xuICBpZiAoZi5hbHRlcm5hdGUpIHtcbiAgICBpZiAoZi5iYXNlID09IDgpIGxlbiArPSAxO1xuICAgIGlmIChmLmJhc2UgPT0gMTYpIGxlbiArPSAyO1xuICB9XG4gIC8qIERvIHRoZSBmb3JtYXR0aW5nICovXG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICBpZiAoZi5qdXN0aWZ5ID09ICcrJyAmJiBmLmZpbGxlciA9PSAnICcpXG4gICAgZm9yICh2YXIgaSA9IGxlbjsgaSA8IGYud2lkdGg7IGkrKykgYnVmZmVyICs9ICcgJztcbiAgaWYgKGYuc2lnbmVkY29udikge1xuICAgIGlmIChmLnNpZ24gPCAwKSBidWZmZXIgKz0gJy0nO1xuICAgIGVsc2UgaWYgKGYuc2lnbnN0eWxlICE9ICctJykgYnVmZmVyICs9IGYuc2lnbnN0eWxlO1xuICB9XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT0gOCkgYnVmZmVyICs9ICcwJztcbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PSAxNikgYnVmZmVyICs9IFwiMHhcIjtcbiAgaWYgKGYuanVzdGlmeSA9PSAnKycgJiYgZi5maWxsZXIgPT0gJzAnKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSAnMCc7XG4gIGJ1ZmZlciArPSByYXdidWZmZXI7XG4gIGlmIChmLmp1c3RpZnkgPT0gJy0nKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSAnICc7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGJ1ZmZlcik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczoganNvb19mbG9vcl9sb2cyXG52YXIgbG9nMl9vayA9IE1hdGgubG9nMiAmJiBNYXRoLmxvZzIoMS4xMjM1NTgyMDkyODg5NDc0RSszMDcpID09IDEwMjBcbmZ1bmN0aW9uIGpzb29fZmxvb3JfbG9nMih4KSB7XG4gIGlmKGxvZzJfb2spIHJldHVybiBNYXRoLmZsb29yKE1hdGgubG9nMih4KSlcbiAgdmFyIGkgPSAwO1xuICBpZiAoeCA9PSAwKSByZXR1cm4gLUluZmluaXR5O1xuICBpZih4Pj0xKSB7d2hpbGUgKHg+PTIpIHt4Lz0yOyBpKyt9IH1cbiAgZWxzZSB7d2hpbGUgKHggPCAxKSB7eCo9MjsgaS0tfSB9O1xuICByZXR1cm4gaTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2Zsb29yX2xvZzIsIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXG5mdW5jdGlvbiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKHgpIHtcbiAgaWYgKCFpc0Zpbml0ZSh4KSkge1xuICAgIGlmIChpc05hTih4KSlcbiAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgxLCAwLCAweDdmZjApO1xuICAgIGlmICh4ID4gMClcbiAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgwLCAwLCAweDdmZjApXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKDAsIDAsIDB4ZmZmMClcbiAgfVxuICB2YXIgc2lnbiA9ICh4PT0wICYmIDEveCA9PSAtSW5maW5pdHkpPzB4ODAwMDooeD49MCk/MDoweDgwMDA7XG4gIGlmIChzaWduKSB4ID0gLXg7XG4gIC8vIEludDY0LmJpdHNfb2ZfZmxvYXQgMS4xMjM1NTgyMDkyODg5NDc0RSszMDcgPSAweDdmYjAwMDAwMDAwMDAwMDBMXG4gIC8vIHVzaW5nIE1hdGguTE9HMkUqTWF0aC5sb2coeCkgaW4gcGxhY2Ugb2YgTWF0aC5sb2cyIHJlc3VsdCBpbiBwcmVjaXNpb24gbG9zdFxuICB2YXIgZXhwID0ganNvb19mbG9vcl9sb2cyKHgpICsgMTAyMztcbiAgaWYgKGV4cCA8PSAwKSB7XG4gICAgZXhwID0gMDtcbiAgICB4IC89IE1hdGgucG93KDIsLTEwMjYpO1xuICB9IGVsc2Uge1xuICAgIHggLz0gTWF0aC5wb3coMixleHAtMTAyNyk7XG4gICAgaWYgKHggPCAxNikge1xuICAgICAgeCAqPSAyOyBleHAgLT0xOyB9XG4gICAgaWYgKGV4cCA9PSAwKSB7XG4gICAgICB4IC89IDI7IH1cbiAgfVxuICB2YXIgayA9IE1hdGgucG93KDIsMjQpO1xuICB2YXIgcjMgPSB4fDA7XG4gIHggPSAoeCAtIHIzKSAqIGs7XG4gIHZhciByMiA9IHh8MDtcbiAgeCA9ICh4IC0gcjIpICogaztcbiAgdmFyIHIxID0geHwwO1xuICByMyA9IChyMyAmMHhmKSB8IHNpZ24gfCBleHAgPDwgNDtcbiAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKHIxLCByMiwgcjMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZmxvb3JfbG9nMlxuZnVuY3Rpb24gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0ICh4KSB7XG4gIHZhciBmbG9hdDMyYSA9IG5ldyBnbG9iYWxUaGlzLkZsb2F0MzJBcnJheSgxKTtcbiAgZmxvYXQzMmFbMF0gPSB4O1xuICB2YXIgaW50MzJhID0gbmV3IGdsb2JhbFRoaXMuSW50MzJBcnJheShmbG9hdDMyYS5idWZmZXIpO1xuICByZXR1cm4gaW50MzJhWzBdIHwgMDtcbn1cblxuLy9GUCBsaXRlcmFscyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgaGV4YWRlY2ltYWxcbi8vbm90YXRpb24gMHg8bWFudGlzc2EgaW4gaGV4PnA8ZXhwb25lbnQ+IGZyb20gSVNPIEM5OS5cbi8vaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWhleGZsb2F0L2Jsb2IvbWFzdGVyL2hleGZsb2F0LmpzXG4vL1Byb3ZpZGVzOiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQgKHgsIHByZWMsIHN0eWxlKSB7XG4gIGlmICghaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoaXNOYU4oeCkpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIm5hblwiKTtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKCh4ID4gMCk/XCJpbmZpbml0eVwiOlwiLWluZmluaXR5XCIpO1xuICB9XG4gIHZhciBzaWduID0gKHg9PTAgJiYgMS94ID09IC1JbmZpbml0eSk/MTooeD49MCk/MDoxO1xuICBpZihzaWduKSB4ID0gLXg7XG4gIHZhciBleHAgPSAwO1xuICBpZiAoeCA9PSAwKSB7IH1cbiAgZWxzZSBpZiAoeCA8IDEpIHtcbiAgICB3aGlsZSAoeCA8IDEgJiYgZXhwID4gLTEwMjIpICB7IHggKj0gMjsgZXhwLS0gfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlICh4ID49IDIpIHsgeCAvPSAyOyBleHArKyB9XG4gIH1cbiAgdmFyIGV4cF9zaWduID0gZXhwIDwgMCA/ICcnIDogJysnO1xuICB2YXIgc2lnbl9zdHIgPSAnJztcbiAgaWYgKHNpZ24pIHNpZ25fc3RyID0gJy0nXG4gIGVsc2Uge1xuICAgIHN3aXRjaChzdHlsZSl7XG4gICAgY2FzZSA0MyAvKiAnKycgKi86IHNpZ25fc3RyID0gJysnOyBicmVhaztcbiAgICBjYXNlIDMyIC8qICcgJyAqLzogc2lnbl9zdHIgPSAnICc7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAocHJlYyA+PSAwICYmIHByZWMgPCAxMykge1xuICAgIC8qIElmIGEgcHJlY2lzaW9uIGlzIGdpdmVuLCBhbmQgaXMgc21hbGwsIHJvdW5kIG1hbnRpc3NhIGFjY29yZGluZ2x5ICovXG4gICAgdmFyIGNzdCA9IE1hdGgucG93KDIscHJlYyAqIDQpO1xuICAgIHggPSBNYXRoLnJvdW5kKHggKiBjc3QpIC8gY3N0O1xuICB9XG4gIHZhciB4X3N0ciA9IHgudG9TdHJpbmcoMTYpO1xuICBpZihwcmVjID49IDApe1xuICAgIHZhciBpZHggPSB4X3N0ci5pbmRleE9mKCcuJyk7XG4gICAgaWYoaWR4PDApIHtcbiAgICAgIHhfc3RyICs9ICcuJyArIGNhbWxfc3RyX3JlcGVhdChwcmVjLCAnMCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBzaXplID0gaWR4KzErcHJlYztcbiAgICAgIGlmKHhfc3RyLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHhfc3RyICs9IGNhbWxfc3RyX3JlcGVhdChzaXplIC0geF9zdHIubGVuZ3RoLCAnMCcpO1xuICAgICAgZWxzZVxuICAgICAgICB4X3N0ciA9IHhfc3RyLnN1YnN0cigwLHNpemUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKHNpZ25fc3RyICsgJzB4JyArIHhfc3RyICsgJ3AnICsgZXhwX3NpZ24gKyBleHAudG9TdHJpbmcoMTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgKHgpIHtcbiAgdmFyIGxvID0geC5sbztcbiAgdmFyIG1pID0geC5taTtcbiAgdmFyIGhpID0geC5oaTtcbiAgdmFyIGV4cCA9IChoaSAmIDB4N2ZmZikgPj4gNDtcbiAgaWYgKGV4cCA9PSAyMDQ3KSB7XG4gICAgaWYgKChsb3xtaXwoaGkmMHhmKSkgPT0gMClcbiAgICAgIHJldHVybiAoaGkgJiAweDgwMDApPygtSW5maW5pdHkpOkluZmluaXR5O1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBOYU47XG4gIH1cbiAgdmFyIGsgPSBNYXRoLnBvdygyLC0yNCk7XG4gIHZhciByZXMgPSAobG8qayttaSkqaysoaGkmMHhmKTtcbiAgaWYgKGV4cCA+IDApIHtcbiAgICByZXMgKz0gMTY7XG4gICAgcmVzICo9IE1hdGgucG93KDIsZXhwLTEwMjcpO1xuICB9IGVsc2VcbiAgICByZXMgKj0gTWF0aC5wb3coMiwtMTAyNik7XG4gIGlmIChoaSAmIDB4ODAwMCkgcmVzID0gLSByZXM7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmV4dGFmdGVyX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMsIGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCwgY2FtbF9pbnQ2NF9hZGQsIGNhbWxfaW50NjRfc3ViLGNhbWxfaW50NjRfb2ZfaW50MzJcbmZ1bmN0aW9uIGNhbWxfbmV4dGFmdGVyX2Zsb2F0ICh4LHkpIHtcbiAgaWYoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiBOYU47XG4gIGlmKHg9PXkpIHJldHVybiB5O1xuICBpZih4PT0wKXtcbiAgICBpZih5IDwgMClcbiAgICAgIHJldHVybiAtTWF0aC5wb3coMiwgLTEwNzQpXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIE1hdGgucG93KDIsIC0xMDc0KVxuICB9XG4gIHZhciBiaXRzID0gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpO1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxKTtcbiAgaWYgKCh4PHkpID09ICh4PjApKVxuICAgIGJpdHMgPSBjYW1sX2ludDY0X2FkZChiaXRzLCBvbmUpXG4gIGVsc2VcbiAgICBiaXRzID0gY2FtbF9pbnQ2NF9zdWIoYml0cywgb25lKVxuICByZXR1cm4gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGJpdHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RydW5jX2Zsb2F0XG5mdW5jdGlvbiBjYW1sX3RydW5jX2Zsb2F0KHgpe1xuICByZXR1cm4gTWF0aC50cnVuYyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMgKHgpIHtcbiAgdmFyIGludDMyYSA9IG5ldyBnbG9iYWxUaGlzLkludDMyQXJyYXkoMSk7XG4gIGludDMyYVswXSA9IHg7XG4gIHZhciBmbG9hdDMyYSA9IG5ldyBnbG9iYWxUaGlzLkZsb2F0MzJBcnJheShpbnQzMmEuYnVmZmVyKTtcbiAgcmV0dXJuIGZsb2F0MzJhWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NsYXNzaWZ5X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NsYXNzaWZ5X2Zsb2F0ICh4KSB7XG4gIGlmIChpc0Zpbml0ZSAoeCkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPj0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHJldHVybiAwO1xuICAgIGlmICh4ICE9IDApIHJldHVybiAxO1xuICAgIHJldHVybiAyO1xuICB9XG4gIHJldHVybiBpc05hTih4KT80OjM7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21vZGZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbW9kZl9mbG9hdCAoeCkge1xuICBpZiAoaXNGaW5pdGUgKHgpKSB7XG4gICAgdmFyIG5lZyA9ICgxL3gpIDwgMDtcbiAgICB4ID0gTWF0aC5hYnMoeCk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yICh4KTtcbiAgICB2YXIgZiA9IHggLSBpO1xuICAgIGlmIChuZWcpIHsgaSA9IC1pOyBmID0gLWY7IH1cbiAgICByZXR1cm4gWzAsIGYsIGldO1xuICB9XG4gIGlmIChpc05hTiAoeCkpIHJldHVybiBbMCwgTmFOLCBOYU5dO1xuICByZXR1cm4gWzAsIDEveCwgeF07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xkZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xkZXhwX2Zsb2F0ICh4LGV4cCkge1xuICBleHAgfD0gMDtcbiAgaWYgKGV4cCA+IDEwMjMpIHtcbiAgICBleHAgLT0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIGlmIChleHAgPiAxMDIzKSB7ICAvLyBpbiBjYXNlIHggaXMgc3Vibm9ybWFsXG4gICAgICBleHAgLT0gMTAyMztcbiAgICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgfVxuICB9XG4gIGlmIChleHAgPCAtMTAyMykge1xuICAgIGV4cCArPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgLTEwMjMpO1xuICB9XG4gIHggKj0gTWF0aC5wb3coMiwgZXhwKTtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXhwX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2Zsb29yX2xvZzJcbmZ1bmN0aW9uIGNhbWxfZnJleHBfZmxvYXQgKHgpIHtcbiAgaWYgKCh4ID09IDApIHx8ICFpc0Zpbml0ZSh4KSkgcmV0dXJuIFswLCB4LCAwXTtcbiAgdmFyIG5lZyA9IHggPCAwO1xuICBpZiAobmVnKSB4ID0gLSB4O1xuICB2YXIgZXhwID0gTWF0aC5tYXgoLTEwMjMsIGpzb29fZmxvb3JfbG9nMih4KSArIDEpO1xuICB4ICo9IE1hdGgucG93KDIsLWV4cCk7XG4gIHdoaWxlICh4IDwgMC41KSB7XG4gICAgeCAqPSAyO1xuICAgIGV4cC0tO1xuICB9XG4gIHdoaWxlICh4ID49IDEpIHtcbiAgICB4ICo9IDAuNTtcbiAgICBleHArKztcbiAgfVxuICBpZiAobmVnKSB4ID0gLSB4O1xuICByZXR1cm4gWzAsIHgsIGV4cF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRfY29tcGFyZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9mbG9hdF9jb21wYXJlICh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSByZXR1cm4gMDtcbiAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gIGlmICh4ID4geSkgcmV0dXJuIDE7XG4gIGlmICh4ID09PSB4KSByZXR1cm4gMTtcbiAgaWYgKHkgPT09IHkpIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29weXNpZ25fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29weXNpZ25fZmxvYXQgKHgsIHkpIHtcbiAgaWYgKHkgPT0gMCkgeSA9IDEgLyB5O1xuICB4ID0gTWF0aC5hYnMoeCk7XG4gIHJldHVybiAoeSA8IDApPygteCk6eDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zaWduYml0X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3NpZ25iaXRfZmxvYXQoeCkge1xuICBpZiAoeCA9PSAwKSB4ID0gMSAvIHg7XG4gIHJldHVybiAoeCA8IDApPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9leHBtMV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHBtMV9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5leHBtMSh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9leHAyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cDJfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5wb3coMiwgeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbG9nMXBfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMXBfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5sb2cxcCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9sb2cyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzJfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5sb2cyKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2h5cG90X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2h5cG90X2Zsb2F0ICh4LCB5KSB7IHJldHVybiBNYXRoLmh5cG90KHgsIHkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzEwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzEwX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmxvZzEwKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2Nvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29zaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5jb3NoKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2Fjb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Fjb3NoX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmFjb3NoKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3NpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2luaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5zaW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2FzaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2FzaW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmFzaW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3RhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdGFuaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC50YW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2F0YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2F0YW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmF0YW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3JvdW5kX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3JvdW5kX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2NicnRfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY2JydF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5jYnJ0KHgpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXJmX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2VyZl9mbG9hdCh4KSB7XG4gIHZhciBhMSA9IDAuMjU0ODI5NTkyO1xuICB2YXIgYTIgPSAtMC4yODQ0OTY3MzY7XG4gIHZhciBhMyA9IDEuNDIxNDEzNzQxO1xuICB2YXIgYTQgPSAtMS40NTMxNTIwMjc7XG4gIHZhciBhNSA9IDEuMDYxNDA1NDI5O1xuICB2YXIgcCA9IDAuMzI3NTkxMTtcblxuICB2YXIgc2lnbiA9IDE7XG4gIGlmICh4IDwgMCkge1xuICAgIHNpZ24gPSAtMTtcbiAgfVxuICB4ID0gTWF0aC5hYnMoeCk7XG4gIHZhciB0ID0gMS4wIC8gKDEuMCArIHAgKiB4KTtcbiAgdmFyIHkgPSAxLjAgLSAoKCgoYTUgKiB0ICsgYTQpICogdCArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdCAqIE1hdGguZXhwKC14ICogeCk7XG5cbiAgcmV0dXJuIHNpZ24gKiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VyZmNfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfZXJmX2Zsb2F0XG5mdW5jdGlvbiBjYW1sX2VyZmNfZmxvYXQoeCkge1xuICByZXR1cm4gMSAtIGNhbWxfZXJmX2Zsb2F0KHgpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZm1hX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZtYV9mbG9hdCh4LCB5LCB6KSB7XG4gIHZhciBTUExJVCA9IE1hdGgucG93KDIsIDI3KSArIDE7XG4gIHZhciBNSU5fVkFMVUUgPSBNYXRoLnBvdygyLCAtMTAyMik7XG4gIHZhciBFUFNJTE9OID0gTWF0aC5wb3coMiwgLTUyKTtcbiAgdmFyIEMgPSA0MTY7XG4gIHZhciBBID0gTWF0aC5wb3coMiwgK0MpO1xuICB2YXIgQiA9IE1hdGgucG93KDIsIC1DKTtcblxuICBmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICAgIHZhciBhdCA9IFNQTElUICogYTtcbiAgICB2YXIgYWhpID0gYXQgLSAoYXQgLSBhKTtcbiAgICB2YXIgYWxvID0gYSAtIGFoaTtcbiAgICB2YXIgYnQgPSBTUExJVCAqIGI7XG4gICAgdmFyIGJoaSA9IGJ0IC0gKGJ0IC0gYik7XG4gICAgdmFyIGJsbyA9IGIgLSBiaGk7XG4gICAgdmFyIHAgPSBhICogYjtcbiAgICB2YXIgZSA9ICgoYWhpICogYmhpIC0gcCkgKyBhaGkgKiBibG8gKyBhbG8gKiBiaGkpICsgYWxvICogYmxvO1xuICAgIHJldHVybiB7XG4gICAgICBwOiBwLFxuICAgICAgZTogZVxuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gICAgdmFyIHMgPSBhICsgYjtcbiAgICB2YXIgdiA9IHMgLSBhO1xuICAgIHZhciBlID0gKGEgLSAocyAtIHYpKSArIChiIC0gdik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IHMsXG4gICAgICBlOiBlXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGp1c3QgKHgsIHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCAmJiB5ICE9PSAwICYmIFNQTElUICogeCAtIChTUExJVCAqIHggLSB4KSA9PT0geCA/IHggKiAoMSArICh4IDwgMCA/IC0xIDogKzEpICogKHkgPCAwID8gLTEgOiArMSkgKiBFUFNJTE9OKSA6IHg7XG4gIH07XG5cbiAgaWYgKHggPT09IDAgfHwgeCAhPT0geCB8fCB4ID09PSArMSAvIDAgfHwgeCA9PT0gLTEgLyAwIHx8XG4gICAgICB5ID09PSAwIHx8IHkgIT09IHkgfHwgeSA9PT0gKzEgLyAwIHx8IHkgPT09IC0xIC8gMCkge1xuICAgIHJldHVybiB4ICogeSArIHo7XG4gIH1cbiAgaWYgKHogPT09IDApIHtcbiAgICByZXR1cm4geCAqIHk7XG4gIH1cbiAgaWYgKHogIT09IHogfHwgeiA9PT0gKzEgLyAwIHx8IHogPT09IC0xIC8gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHNjYWxlID0gMTtcbiAgd2hpbGUgKE1hdGguYWJzKHgpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeCAqPSBCO1xuICB9XG4gIHdoaWxlIChNYXRoLmFicyh5KSA+IEEpIHtcbiAgICBzY2FsZSAqPSBBO1xuICAgIHkgKj0gQjtcbiAgfVxuICBpZiAoc2NhbGUgPT09IDEgLyAwKSB7XG4gICAgcmV0dXJuIHggKiB5ICogc2NhbGU7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHgpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeCAqPSBBO1xuICB9XG4gIHdoaWxlIChNYXRoLmFicyh5KSA8IEIpIHtcbiAgICBzY2FsZSAqPSBCO1xuICAgIHkgKj0gQTtcbiAgfVxuICBpZiAoc2NhbGUgPT09IDApIHtcbiAgICByZXR1cm4gejtcbiAgfVxuXG4gIHZhciB4cyA9IHg7XG4gIHZhciB5cyA9IHk7XG4gIHZhciB6cyA9IHogLyBzY2FsZTtcblxuICBpZiAoTWF0aC5hYnMoenMpID4gTWF0aC5hYnMoeHMgKiB5cykgKiA0IC8gRVBTSUxPTikge1xuICAgIHJldHVybiB6O1xuICB9XG4gIGlmIChNYXRoLmFicyh6cykgPCBNYXRoLmFicyh4cyAqIHlzKSAqIEVQU0lMT04gLyA0ICogRVBTSUxPTiAvIDQpIHtcbiAgICB6cyA9ICh6IDwgMCA/IC0xIDogKzEpICogTUlOX1ZBTFVFO1xuICB9XG5cbiAgdmFyIHh5ID0gbXVsdGlwbHkoeHMsIHlzKTtcbiAgdmFyIHMgPSBhZGQoeHkucCwgenMpO1xuICB2YXIgdSA9IGFkZCh4eS5lLCBzLmUpO1xuICB2YXIgaSA9IGFkZChzLnMsIHUucyk7XG5cbiAgdmFyIGYgPSBpLnMgKyBhZGp1c3QoaS5lLCB1LmUpO1xuICBpZiAoZiA9PT0gMCkge1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgdmFyIGZzID0gZiAqIHNjYWxlO1xuICBpZiAoTWF0aC5hYnMoZnMpID4gTUlOX1ZBTFVFKSB7XG4gICAgcmV0dXJuIGZzO1xuICB9XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSB3YXMgZXh0cmEgcm91bmRpbmcgZm9yIGEgZGVub3JtYWxpemVkIHZhbHVlLlxuICByZXR1cm4gZnMgKyBhZGp1c3QoZiAtIGZzIC8gc2NhbGUsIGkuZSkgKiBzY2FsZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9mbG9hdCAoZm10LCB4KSB7XG4gIGZ1bmN0aW9uIHRvRml4ZWQoeCxkcCkge1xuICAgIGlmIChNYXRoLmFicyh4KSA8IDEuMCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChkcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlID0gcGFyc2VJbnQoeC50b1N0cmluZygpLnNwbGl0KCcrJylbMV0pO1xuICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICBlIC09IDIwO1xuICAgICAgICB4IC89IE1hdGgucG93KDEwLGUpO1xuICAgICAgICB4ICs9IChuZXcgQXJyYXkoZSsxKSkuam9pbignMCcpO1xuICAgICAgICBpZihkcCA+IDApIHtcbiAgICAgICAgICB4ID0geCArICcuJyArIChuZXcgQXJyYXkoZHArMSkpLmpvaW4oJzAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICAgIGVsc2UgcmV0dXJuIHgudG9GaXhlZChkcClcbiAgICB9XG4gIH1cbiAgdmFyIHMsIGYgPSBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpO1xuICB2YXIgcHJlYyA9IChmLnByZWMgPCAwKT82OmYucHJlYztcbiAgaWYgKHggPCAwIHx8ICh4ID09IDAgJiYgMS94ID09IC1JbmZpbml0eSkpIHsgZi5zaWduID0gLTE7IHggPSAteDsgfVxuICBpZiAoaXNOYU4oeCkpIHsgcyA9IFwibmFuXCI7IGYuZmlsbGVyID0gJyAnOyB9XG4gIGVsc2UgaWYgKCFpc0Zpbml0ZSh4KSkgeyBzID0gXCJpbmZcIjsgZi5maWxsZXIgPSAnICc7IH1cbiAgZWxzZVxuICAgIHN3aXRjaCAoZi5jb252KSB7XG4gICAgY2FzZSAnZSc6XG4gICAgICB2YXIgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjKTtcbiAgICAgIC8vIGV4cG9uZW50IHNob3VsZCBiZSBhdCBsZWFzdCB0d28gZGlnaXRzXG4gICAgICB2YXIgaSA9IHMubGVuZ3RoO1xuICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PSAnZScpXG4gICAgICAgIHMgPSBzLnNsaWNlICgwLCBpIC0gMSkgKyAnMCcgKyBzLnNsaWNlIChpIC0gMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmJzpcbiAgICAgIHMgPSB0b0ZpeGVkKHgsIHByZWMpOyBicmVhaztcbiAgICBjYXNlICdnJzpcbiAgICAgIHByZWMgPSBwcmVjP3ByZWM6MTtcbiAgICAgIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyAtIDEpO1xuICAgICAgdmFyIGogPSBzLmluZGV4T2YoJ2UnKTtcbiAgICAgIHZhciBleHAgPSArcy5zbGljZShqICsgMSk7XG4gICAgICBpZiAoZXhwIDwgLTQgfHwgeCA+PSAxZTIxIHx8IHgudG9GaXhlZCgwKS5sZW5ndGggPiBwcmVjKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgdmFyIGkgPSBqIC0gMTsgd2hpbGUgKHMuY2hhckF0KGkpID09ICcwJykgaS0tO1xuICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gJy4nKSBpLS07XG4gICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgKyAxKSArIHMuc2xpY2Uoaik7XG4gICAgICAgIGkgPSBzLmxlbmd0aDtcbiAgICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PSAnZScpXG4gICAgICAgICAgcyA9IHMuc2xpY2UgKDAsIGkgLSAxKSArICcwJyArIHMuc2xpY2UgKGkgLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcCA9IHByZWM7XG4gICAgICAgIGlmIChleHAgPCAwKSB7IHAgLT0gZXhwICsgMTsgcyA9IHgudG9GaXhlZChwKTsgfVxuICAgICAgICBlbHNlIHdoaWxlIChzID0geC50b0ZpeGVkKHApLCBzLmxlbmd0aCA+IHByZWMgKyAxKSBwLS07XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHplcm9lc1xuICAgICAgICAgIHZhciBpID0gcy5sZW5ndGggLSAxOyB3aGlsZSAocy5jaGFyQXQoaSkgPT0gJzAnKSBpLS07XG4gICAgICAgICAgaWYgKHMuY2hhckF0KGkpID09ICcuJykgaS0tO1xuICAgICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICByZXR1cm4gY2FtbF9maW5pc2hfZm9ybWF0dGluZyhmLCBzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9mbG9hdF9vZl9zdHJpbmcocykge1xuICB2YXIgcmVzO1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKVxuICByZXMgPSArcztcbiAgaWYgKChzLmxlbmd0aCA+IDApICYmIChyZXMgPT09IHJlcykpIHJldHVybiByZXM7XG4gIHMgPSBzLnJlcGxhY2UoL18vZyxcIlwiKTtcbiAgcmVzID0gK3M7XG4gIGlmICgoKHMubGVuZ3RoID4gMCkgJiYgKHJlcyA9PT0gcmVzKSkgfHwgL15bKy1dP25hbiQvaS50ZXN0KHMpKSByZXR1cm4gcmVzO1xuICB2YXIgbSA9IC9eICooWystXT8pMHgoWzAtOWEtZl0rKVxcLj8oWzAtOWEtZl0qKShwKFsrLV0/WzAtOV0rKSk/L2kuZXhlYyhzKTtcbiAgLy8gICAgICAgICAgMSAgICAgICAgMiAgICAgICAgICAgICAzICAgICAgICAgICA1XG4gIGlmKG0pe1xuICAgIHZhciBtMyA9IG1bM10ucmVwbGFjZSgvMCskLywnJyk7XG4gICAgdmFyIG1hbnRpc3NhID0gcGFyc2VJbnQobVsxXSArIG1bMl0gKyBtMywgMTYpO1xuICAgIHZhciBleHBvbmVudCA9IChtWzVdfDApIC0gNCptMy5sZW5ndGg7XG4gICAgcmVzID0gbWFudGlzc2EgKiBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZigvXlxcKz9pbmYoaW5pdHkpPyQvaS50ZXN0KHMpKSByZXR1cm4gSW5maW5pdHk7XG4gIGlmKC9eLWluZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiAtSW5maW5pdHk7XG4gIGNhbWxfZmFpbHdpdGgoXCJmbG9hdF9vZl9zdHJpbmdcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gZnNfbm9kZV9zdXBwb3J0ZWQgKCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBnbG9iYWxUaGlzLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJ1xuICAgICAgJiYgdHlwZW9mIGdsb2JhbFRoaXMucHJvY2Vzcy52ZXJzaW9ucy5ub2RlICE9PSAndW5kZWZpbmVkJylcbn1cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9SZXF1aXJlczogTWxOb2RlRmlsZSwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfcmFpc2Vfd2l0aF9hcmdzXG4vL1JlcXVpcmVzOiBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBNbE5vZGVEZXZpY2Uocm9vdCkge1xuICB0aGlzLmZzID0gcmVxdWlyZSgnZnMnKTtcbiAgdGhpcy5yb290ID0gcm9vdDtcbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUubm0gPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiAodGhpcy5yb290ICsgbmFtZSk7XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmV4aXN0cyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHRoaXMubm0obmFtZSkpPzE6MDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUubWtkaXIgPSBmdW5jdGlvbihuYW1lLCBtb2RlLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5ta2RpclN5bmModGhpcy5ubShuYW1lKSx7bW9kZTptb2RlfSk7XG4gICAgcmV0dXJuIDBcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5ybWRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnJtZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICByZXR1cm4gMFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJlYWRkaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMucmVhZGRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuaXNfZGlyID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRGlyZWN0b3J5KCk/MTowO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUudW5saW5rID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBiID0gdGhpcy5mcy5leGlzdHNTeW5jKHRoaXMubm0obmFtZSkpPzE6MDtcbiAgICB0aGlzLmZzLnVubGlua1N5bmModGhpcy5ubShuYW1lKSk7XG4gICAgcmV0dXJuIGI7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG5hbWUsIGYsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIGNvbnN0cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpO1xuICB2YXIgcmVzID0gMDtcbiAgZm9yKHZhciBrZXkgaW4gZil7XG4gICAgc3dpdGNoKGtleSl7XG4gICAgY2FzZSBcInJkb25seVwiICA6IHJlcyB8PSBjb25zdHMuT19SRE9OTFk7IGJyZWFrO1xuICAgIGNhc2UgXCJ3cm9ubHlcIiAgOiByZXMgfD0gY29uc3RzLk9fV1JPTkxZOyBicmVhaztcbiAgICBjYXNlIFwiYXBwZW5kXCIgIDpcbiAgICAgIHJlcyB8PSBjb25zdHMuT19XUk9OTFkgfCBjb25zdHMuT19BUFBFTkQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY3JlYXRlXCIgICA6IHJlcyB8PSBjb25zdHMuT19DUkVBVDsgICAgYnJlYWs7XG4gICAgY2FzZSBcInRydW5jYXRlXCIgOiByZXMgfD0gY29uc3RzLk9fVFJVTkM7ICAgIGJyZWFrO1xuICAgIGNhc2UgXCJleGNsXCIgICAgIDogcmVzIHw9IGNvbnN0cy5PX0VYQ0w7ICAgICBicmVhaztcbiAgICBjYXNlIFwiYmluYXJ5XCIgICA6IHJlcyB8PSBjb25zdHMuT19CSU5BUlk7ICAgYnJlYWs7XG4gICAgY2FzZSBcInRleHRcIiAgICAgOiByZXMgfD0gY29uc3RzLk9fVEVYVDsgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJub25ibG9ja1wiIDogcmVzIHw9IGNvbnN0cy5PX05PTkJMT0NLOyBicmVhaztcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICB2YXIgZmQgPSB0aGlzLmZzLm9wZW5TeW5jKHRoaXMubm0obmFtZSksIHJlcyk7XG4gICAgcmV0dXJuIG5ldyBNbE5vZGVGaWxlKGZkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuXG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJlbmFtZSA9IGZ1bmN0aW9uKG8sIG4sIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnJlbmFtZVN5bmModGhpcy5ubShvKSwgdGhpcy5ubShuKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuc3RhdCA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiB0aGlzLnN0YXRzX2Zyb21fanMoanNfc3RhdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmxzdGF0ID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMubHN0YXRTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiB0aGlzLnN0YXRzX2Zyb21fanMoanNfc3RhdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnN5bWxpbmsgPSBmdW5jdGlvbih0b19kaXIsIHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHRoaXMuZnMuc3ltbGlua1N5bmModGhpcy5ubSh0YXJnZXQpLCB0aGlzLm5tKHBhdGgpLCB0b19kaXIgPyAnZGlyJyA6ICdmaWxlJyk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUucmVhZGxpbmsgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdmFyIGxpbmsgPSB0aGlzLmZzLnJlYWRsaW5rU3luYyh0aGlzLm5tKG5hbWUpLCAndXRmOCcpO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhsaW5rKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5yYWlzZV9ub2RlanNfZXJyb3IgPSBmdW5jdGlvbihlcnIsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKFwiVW5peC5Vbml4X2Vycm9yXCIpO1xuICBpZiAocmFpc2VfdW5peCAmJiB1bml4X2Vycm9yKSB7XG4gICAgdmFyIGFyZ3MgPSBtYWtlX3VuaXhfZXJyX2FyZ3MoZXJyLmNvZGUsIGVyci5zeXNjYWxsLCBlcnIucGF0aCwgZXJyLmVycm5vKTtcbiAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuc3RhdHNfZnJvbV9qcyA9IGZ1bmN0aW9uKGpzX3N0YXRzKSB7XG4gIC8qID09PVVuaXguZmlsZV9raW5kPT09XG4gICAqIHR5cGUgZmlsZV9raW5kID1cbiAgICogICAgIFNfUkVHICAgICAgICAgICAgICAgICAgICAgICAoKiogUmVndWxhciBmaWxlICopXG4gICAqICAgfCBTX0RJUiAgICAgICAgICAgICAgICAgICAgICAgKCoqIERpcmVjdG9yeSAqKVxuICAgKiAgIHwgU19DSFIgICAgICAgICAgICAgICAgICAgICAgICgqKiBDaGFyYWN0ZXIgZGV2aWNlICopXG4gICAqICAgfCBTX0JMSyAgICAgICAgICAgICAgICAgICAgICAgKCoqIEJsb2NrIGRldmljZSAqKVxuICAgKiAgIHwgU19MTksgICAgICAgICAgICAgICAgICAgICAgICgqKiBTeW1ib2xpYyBsaW5rICopXG4gICAqICAgfCBTX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgKCoqIE5hbWVkIHBpcGUgKilcbiAgICogICB8IFNfU09DSyAgICAgICAgICAgICAgICAgICAgICAoKiogU29ja2V0ICopXG4gICAqL1xuICB2YXIgZmlsZV9raW5kO1xuICBpZiAoanNfc3RhdHMuaXNGaWxlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAwO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBmaWxlX2tpbmQgPSAxO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAyO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzQmxvY2tEZXZpY2UoKSkge1xuICAgIGZpbGVfa2luZCA9IDM7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGZpbGVfa2luZCA9IDQ7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNGSUZPKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA1O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU29ja2V0KCkpIHtcbiAgICBmaWxlX2tpbmQgPSA2O1xuICB9XG4gIC8qID09PVVuaXguc3RhdHM9PT1cbiAgICogdHlwZSBzdGF0cyA9XG4gICAqICB7IHN0X2RldiA6IGludDsgICAgICAgICAgICAgICAoKiogRGV2aWNlIG51bWJlciAqKVxuICAgKiAgICBzdF9pbm8gOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIElub2RlIG51bWJlciAqKVxuICAgKiAgICBzdF9raW5kIDogZmlsZV9raW5kOyAgICAgICAgKCoqIEtpbmQgb2YgdGhlIGZpbGUgKilcbiAgICogICAgc3RfcGVybSA6IGZpbGVfcGVybTsgICAgICAgICgqKiBBY2Nlc3MgcmlnaHRzICopXG4gICAqICAgIHN0X25saW5rIDogaW50OyAgICAgICAgICAgICAoKiogTnVtYmVyIG9mIGxpbmtzICopXG4gICAqICAgIHN0X3VpZCA6IGludDsgICAgICAgICAgICAgICAoKiogVXNlciBpZCBvZiB0aGUgb3duZXIgKilcbiAgICogICAgc3RfZ2lkIDogaW50OyAgICAgICAgICAgICAgICgqKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwICopXG4gICAqICAgIHN0X3JkZXYgOiBpbnQ7ICAgICAgICAgICAgICAoKiogRGV2aWNlIElEIChpZiBzcGVjaWFsIGZpbGUpICopXG4gICAqICAgIHN0X3NpemUgOiBpbnQ7ICAgICAgICAgICAgICAoKiogU2l6ZSBpbiBieXRlcyAqKVxuICAgKiAgICBzdF9hdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3QgYWNjZXNzIHRpbWUgKilcbiAgICogICAgc3RfbXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lICopXG4gICAqICAgIHN0X2N0aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBzdGF0dXMgY2hhbmdlIHRpbWUgKilcbiAgICogIH1cbiAgICovXG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGpzX3N0YXRzLmRldixcbiAgICBqc19zdGF0cy5pbm8sXG4gICAgZmlsZV9raW5kLFxuICAgIGpzX3N0YXRzLm1vZGUsXG4gICAganNfc3RhdHMubmxpbmssXG4gICAganNfc3RhdHMudWlkLFxuICAgIGpzX3N0YXRzLmdpZCxcbiAgICBqc19zdGF0cy5yZGV2LFxuICAgIGpzX3N0YXRzLnNpemUsXG4gICAganNfc3RhdHMuYXRpbWVNcyxcbiAgICBqc19zdGF0cy5tdGltZU1zLFxuICAgIGpzX3N0YXRzLmN0aW1lTXNcbiAgKTtcbn1cblxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sTm9kZURldmljZVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIE1sTm9kZURldmljZSgpIHtcbn1cblxuLy9Qcm92aWRlczogTWxOb2RlRmlsZVxuLy9SZXF1aXJlczogTWxGaWxlLCBjYW1sX2FycmF5X29mX3N0cmluZywgY2FtbF9hcnJheV9vZl9ieXRlcywgY2FtbF9ieXRlc19zZXQsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBNbE5vZGVGaWxlKGZkKXtcbiAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHRoaXMuZmQgPSBmZDtcbn1cbk1sTm9kZUZpbGUucHJvdG90eXBlID0gbmV3IE1sRmlsZSAoKTtcblxuTWxOb2RlRmlsZS5wcm90b3R5cGUudHJ1bmNhdGUgPSBmdW5jdGlvbihsZW4pe1xuICB0cnkge1xuICAgIHRoaXMuZnMuZnRydW5jYXRlU3luYyh0aGlzLmZkLGxlbnwwKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZUZpbGUucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5mc3RhdFN5bmModGhpcy5mZCkuc2l6ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVGaWxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG9mZnNldCxidWYsYnVmX29mZnNldCxsZW4pe1xuICB2YXIgYSA9IGNhbWxfYXJyYXlfb2Zfc3RyaW5nKGJ1Zik7XG4gIGlmKCEgKGEgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlVpbnQ4QXJyYXkpKVxuICAgIGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50OEFycmF5KGEpO1xuICB2YXIgYnVmZmVyID0gZ2xvYmFsVGhpcy5CdWZmZXIuZnJvbShhKTtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLndyaXRlU3luYyh0aGlzLmZkLCBidWZmZXIsIGJ1Zl9vZmZzZXQsIGxlbiwgb2Zmc2V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiAwO1xufVxuTWxOb2RlRmlsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG9mZnNldCxidWYsYnVmX29mZnNldCxsZW4pe1xuICB2YXIgYSA9IGNhbWxfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgaWYoISAoYSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuVWludDhBcnJheSkpXG4gICAgYSA9IG5ldyBnbG9iYWxUaGlzLlVpbnQ4QXJyYXkoYSk7XG4gIHZhciBidWZmZXIgPSBnbG9iYWxUaGlzLkJ1ZmZlci5mcm9tKGEpO1xuICB0cnkge1xuICAgIHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYnVmZmVyLCBidWZfb2Zmc2V0LCBsZW4sIG9mZnNldCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspe1xuICAgIGNhbWxfYnl0ZXNfc2V0KGJ1ZixidWZfb2Zmc2V0ICsgaSxidWZmZXJbYnVmX29mZnNldCtpXSk7XG4gIH1cbiAgcmV0dXJuIDBcbn1cbk1sTm9kZUZpbGUucHJvdG90eXBlLnJlYWRfb25lID0gZnVuY3Rpb24ob2Zmc2V0KXtcbiAgdmFyIGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50OEFycmF5KDEpO1xuICB2YXIgYnVmZmVyID0gZ2xvYmFsVGhpcy5CdWZmZXIuZnJvbShhKTtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGJ1ZmZlciwgMCwgMSwgb2Zmc2V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBidWZmZXJbMF07XG59XG5NbE5vZGVGaWxlLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5jbG9zZVN5bmModGhpcy5mZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuXG5NbE5vZGVGaWxlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sTm9kZUZpbGU7XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZpbGVcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIE1sTm9kZUZpbGUoKXtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRHVtbXkgZmlsZXN5c3RlbVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpe1xuICByZXR1cm4gKG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIikgPyAobmFtZSArIFwiL1wiKSA6IG5hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5pZihmc19ub2RlX3N1cHBvcnRlZCAoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZClcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XG5lbHNlXG4gIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gIFwiL3N0YXRpY1wiO1xuY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2goY2FtbF9jdXJyZW50X2Rpcik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3Jvb3Rcbi8vUmVxdWlyZXM6IHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfZ2V0X3Jvb3QocGF0aCl7XG4gIHZhciB4ID0gcGF0aF9pc19hYnNvbHV0ZShwYXRoKTtcbiAgaWYgKCF4KSByZXR1cm47XG4gIHJldHVybiB4WzBdICsgXCIvXCJ9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcm9vdFxuLy9SZXF1aXJlczogY2FtbF9nZXRfcm9vdCwgY2FtbF9jdXJyZW50X2RpciwgY2FtbF9mYWlsd2l0aFxudmFyIGNhbWxfcm9vdCA9IGNhbWxfZ2V0X3Jvb3QoY2FtbF9jdXJyZW50X2RpcikgfHwgY2FtbF9mYWlsd2l0aChcInVuYWJsZSB0byBjb21wdXRlIGNhbWxfcm9vdFwiKTtcblxuXG4vL1Byb3ZpZGVzOiBNbEZpbGVcbmZ1bmN0aW9uIE1sRmlsZSgpeyAgfVxuXG4vL1Byb3ZpZGVzOiBwYXRoX2lzX2Fic29sdXRlXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCkge1xuICBmdW5jdGlvbiBwb3NpeChwYXRoKSB7XG4gICAgaWYgKHBhdGguY2hhckF0KDApID09PSAnLycpIHJldHVybiBbXCJcIiwgcGF0aC5zdWJzdHJpbmcoMSldO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpbjMyKHBhdGgpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9iM2ZjYzI0NWZiMjU1Mzk5MDllZjFkNWVhYTAxZGJmOTJlMTY4NjMzL2xpYi9wYXRoLmpzI0w1NlxuICAgIHZhciBzcGxpdERldmljZVJlID0gL14oW2EtekEtWl06fFtcXFxcL117Mn1bXlxcXFwvXStbXFxcXC9dK1teXFxcXC9dKyk/KFtcXFxcL10pPyhbXFxzXFxTXSo/KSQvO1xuICAgIHZhciByZXN1bHQgPSBzcGxpdERldmljZVJlLmV4ZWMocGF0aCk7XG4gICAgdmFyIGRldmljZSA9IHJlc3VsdFsxXSB8fCAnJztcbiAgICB2YXIgaXNVbmMgPSBCb29sZWFuKGRldmljZSAmJiBkZXZpY2UuY2hhckF0KDEpICE9PSAnOicpO1xuXG4gICAgLy8gVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGVcbiAgICBpZiAoQm9vbGVhbihyZXN1bHRbMl0gfHwgaXNVbmMpKSB7XG4gICAgICB2YXIgcm9vdCA9IChyZXN1bHRbMV0gfHwgJycpO1xuICAgICAgdmFyIHNlcCA9IChyZXN1bHRbMl0gfHwgJycpO1xuICAgICAgcmV0dXJuIFtyb290LCBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCArIHNlcC5sZW5ndGgpXVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYoZnNfbm9kZV9zdXBwb3J0ZWQgKCkgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzICYmIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSkge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMiA6IHBvc2l4O1xuICB9XG4gIGVsc2UgcmV0dXJuIHBvc2l4XG59XG52YXIgcGF0aF9pc19hYnNvbHV0ZSA9IG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfcGF0aFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfbWFrZV9wYXRoIChuYW1lKSB7XG4gIG5hbWU9Y2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmKCAhcGF0aF9pc19hYnNvbHV0ZShuYW1lKSApXG4gICAgbmFtZSA9IGNhbWxfY3VycmVudF9kaXIgKyBuYW1lO1xuICB2YXIgY29tcDAgPSBwYXRoX2lzX2Fic29sdXRlKG5hbWUpO1xuICB2YXIgY29tcCA9IGNvbXAwWzFdLnNwbGl0KFwiL1wiKTtcbiAgdmFyIG5jb21wID0gW11cbiAgZm9yKHZhciBpID0gMDsgaTxjb21wLmxlbmd0aDsgaSsrKXtcbiAgICBzd2l0Y2goY29tcFtpXSl7XG4gICAgY2FzZSBcIi4uXCI6IGlmKG5jb21wLmxlbmd0aD4xKSBuY29tcC5wb3AoKTsgYnJlYWs7XG4gICAgY2FzZSBcIi5cIjogYnJlYWs7XG4gICAgZGVmYXVsdDogbmNvbXAucHVzaChjb21wW2ldKTticmVha1xuICAgIH1cbiAgfVxuICBuY29tcC51bnNoaWZ0KGNvbXAwWzBdKTtcbiAgbmNvbXAub3JpZyA9IG5hbWU7XG4gIHJldHVybiBuY29tcDtcbn1cblxuLy9Qcm92aWRlczpqc29vX21vdW50X3BvaW50XG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIE1sTm9kZURldmljZSwgY2FtbF9yb290LCBmc19ub2RlX3N1cHBvcnRlZFxudmFyIGpzb29fbW91bnRfcG9pbnQgPSBbXVxuaWYgKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOmNhbWxfcm9vdCxkZXZpY2U6bmV3IE1sTm9kZURldmljZShjYW1sX3Jvb3QpfSk7XG59IGVsc2Uge1xuICBqc29vX21vdW50X3BvaW50LnB1c2goe3BhdGg6Y2FtbF9yb290LGRldmljZTpuZXcgTWxGYWtlRGV2aWNlKGNhbWxfcm9vdCl9KTtcbn1cbmpzb29fbW91bnRfcG9pbnQucHVzaCh7cGF0aDpcIi9zdGF0aWMvXCIsIGRldmljZTpuZXcgTWxGYWtlRGV2aWNlKFwiL3N0YXRpYy9cIil9KTtcblxuLy9Qcm92aWRlczpjYW1sX2xpc3RfbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbGlzdF9tb3VudF9wb2ludCgpe1xuICB2YXIgcHJldiA9IDBcbiAgZm9yKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspe1xuICAgIHZhciBvbGQgPSBwcmV2O1xuICAgIHByZXYgPSBbMCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhqc29vX21vdW50X3BvaW50W2ldLnBhdGgpLCBvbGRdXG4gIH1cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8vUHJvdmlkZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2V0X3Jvb3QsIE1sTm9kZURldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpe1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IHBhdGguam9pbihcIi9cIik7XG4gIHZhciBuYW1lX3NsYXNoID0gY2FtbF90cmFpbGluZ19zbGFzaChuYW1lKTtcbiAgdmFyIHJlcztcbiAgZm9yKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbSA9IGpzb29fbW91bnRfcG9pbnRbaV07XG4gICAgaWYobmFtZV9zbGFzaC5zZWFyY2gobS5wYXRoKSA9PSAwXG4gICAgICAgJiYgKCFyZXMgfHwgcmVzLnBhdGgubGVuZ3RoIDwgbS5wYXRoLmxlbmd0aCkpXG4gICAgICByZXMgPSB7cGF0aDptLnBhdGgsZGV2aWNlOm0uZGV2aWNlLHJlc3Q6bmFtZS5zdWJzdHJpbmcobS5wYXRoLmxlbmd0aCxuYW1lLmxlbmd0aCl9O1xuICB9XG4gIGlmKCAhcmVzICYmIGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAgICB2YXIgcm9vdCA9IGNhbWxfZ2V0X3Jvb3QobmFtZSk7XG4gICAgaWYgKHJvb3QgJiYgcm9vdC5tYXRjaCgvXlthLXpBLVpdOlxcLyQvKSl7XG4gICAgICB2YXIgbSA9IHtwYXRoOnJvb3QsZGV2aWNlOm5ldyBNbE5vZGVEZXZpY2Uocm9vdCl9O1xuICAgICAganNvb19tb3VudF9wb2ludC5wdXNoKG0pO1xuICAgICAgcmVzID0ge3BhdGg6bS5wYXRoLGRldmljZTptLmRldmljZSxyZXN0Om5hbWUuc3Vic3RyaW5nKG0ucGF0aC5sZW5ndGgsbmFtZS5sZW5ndGgpfTtcbiAgICB9XG4gIH1cbiAgaWYoIHJlcyApIHJldHVybiByZXM7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwibm8gZGV2aWNlIGZvdW5kIGZvciBcIiArIG5hbWVfc2xhc2gpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vdW50X2F1dG9sb2FkXG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX21vdW50X2F1dG9sb2FkKG5hbWUsZil7XG4gIHZhciBwYXRoID0gY2FtbF9tYWtlX3BhdGgobmFtZSk7XG4gIHZhciBuYW1lID0gY2FtbF90cmFpbGluZ19zbGFzaChwYXRoLmpvaW4oXCIvXCIpKTtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOm5hbWUsZGV2aWNlOm5ldyBNbEZha2VEZXZpY2UobmFtZSxmKX0pXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VubW91bnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfbWFrZV9wYXRoLCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3VubW91bnQobmFtZSl7XG4gIHZhciBwYXRoID0gY2FtbF9tYWtlX3BhdGgobmFtZSk7XG4gIHZhciBuYW1lID0gY2FtbF90cmFpbGluZ19zbGFzaChwYXRoLmpvaW4oXCIvXCIpKTtcbiAgdmFyIGlkeCA9IC0xO1xuICBmb3IodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKylcbiAgICBpZihqc29vX21vdW50X3BvaW50W2ldLnBhdGggPT0gbmFtZSkgaWR4ID0gaTtcbiAgaWYoaWR4ID4gLTEpIGpzb29fbW91bnRfcG9pbnQuc3BsaWNlKGlkeCwxKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0Y3dkXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfZGlyLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRjd2QoKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNhbWxfY3VycmVudF9kaXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jaGRpclxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUsIHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3RyYWlsaW5nX3NsYXNoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N5c19jaGRpcihkaXIpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkaXIpO1xuICBpZihyb290LmRldmljZS5leGlzdHMocm9vdC5yZXN0KSkge1xuICAgIGlmKHJvb3QucmVzdCkgY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocm9vdC5wYXRoICsgcm9vdC5yZXN0KTtcbiAgICBlbHNlIGNhbWxfY3VycmVudF9kaXIgPSByb290LnBhdGg7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhkaXIpKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKG5hbWUpe1xuICBjYW1sX3JhaXNlX3N5c19lcnJvciAobmFtZSArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX25vdF9hX2RpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfbm90X2FfZGlyKG5hbWUpe1xuICBjYW1sX3JhaXNlX3N5c19lcnJvciAobmFtZSArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2ZpbGVfZXhpc3RzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfZmlsZV9leGlzdHMgKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfYV9kaXIsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeShuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGEgPSByb290LmRldmljZS5yZWFkZGlyKHJvb3QucmVzdCk7XG4gIHZhciBsID0gbmV3IEFycmF5KGEubGVuZ3RoICsgMSk7XG4gIGxbMF0gPSAwO1xuICBmb3IodmFyIGk9MDtpPGEubGVuZ3RoO2krKylcbiAgICBsW2krMV0gPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGFbaV0pO1xuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVtb3ZlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSwgcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX3JlbW92ZShuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIG9rID0gcm9vdC5kZXZpY2UudW5saW5rKHJvb3QucmVzdCk7XG4gIGlmKG9rID09IDApIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKGNhbWxfanNieXRlc19vZl9zdHJpbmcobmFtZSkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNfZGlyZWN0b3J5XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfaXNfZGlyZWN0b3J5KG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLmlzX2Rpcihyb290LnJlc3QpO1xuICByZXR1cm4gYT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JlbmFtZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX3JlbmFtZShvLG4pe1xuICB2YXIgb19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobyk7XG4gIHZhciBuX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuKTtcbiAgaWYob19yb290LmRldmljZSAhPSBuX3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N5c19yZW5hbWU6IGNhbm5vdCBtb3ZlIGZpbGUgYmV0d2VlbiB0d28gZmlsZXN5c3RlbVwiKTtcbiAgaWYoIW9fcm9vdC5kZXZpY2UucmVuYW1lKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N5c19yZW5hbWU6IG5vIGltcGxlbWVudGVkXCIpO1xuICBvX3Jvb3QuZGV2aWNlLnJlbmFtZShvX3Jvb3QucmVzdCwgbl9yb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N5c19ta2RpcihuYW1lLCBwZXJtKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcm9vdC5kZXZpY2UubWtkaXIocm9vdC5yZXN0LHBlcm0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9yYWlzZV9ub3RfYV9kaXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3JtZGlyKG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ybWRpcihyb290LnJlc3QpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9tYXBfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9iYV9tYXBfZmlsZSh2ZmQsIGtpbmQsIGxheW91dCwgc2hhcmVkLCBkaW1zLCBwb3MpIHtcbiAgLy8gdmFyIGRhdGEgPSBjYW1sX2dsb2JhbF9kYXRhLmZkc1t2ZmRdO1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9iYV9tYXBfZmlsZSBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUoYXJndixhcmduKXtcbiAgcmV0dXJuIGNhbWxfYmFfbWFwX2ZpbGUoYXJndlswXSxhcmd2WzFdLGFyZ3ZbMl0sYXJndlszXSxhcmd2WzRdLGFyZ3ZbNV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX2NyZWF0ZV9maWxlX2V4dGVyblxuZnVuY3Rpb24ganNvb19jcmVhdGVfZmlsZV9leHRlcm4obmFtZSxjb250ZW50KXtcbiAgaWYoZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKVxuICAgIGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZShuYW1lLGNvbnRlbnQpO1xuICBlbHNlIHtcbiAgICBpZighZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCkgZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCA9IFtdO1xuICAgIGdsb2JhbFRoaXMuY2FtbF9mc190bXAucHVzaCh7bmFtZTpuYW1lLGNvbnRlbnQ6Y29udGVudH0pO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZzX2luaXRcbi8vUmVxdWlyZXM6IGpzb29fY3JlYXRlX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfZnNfaW5pdCAoKXtcbiAgdmFyIHRtcD1nbG9iYWxUaGlzLmNhbWxfZnNfdG1wXG4gIGlmKHRtcCl7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKyl7XG4gICAgICBqc29vX2NyZWF0ZV9maWxlKHRtcFtpXS5uYW1lLHRtcFtpXS5jb250ZW50KTtcbiAgICB9XG4gIH1cbiAgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlID0ganNvb19jcmVhdGVfZmlsZTtcbiAgZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCA9IFtdO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2ZpbGUobmFtZSxjb250ZW50KSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmKCEgcm9vdC5kZXZpY2UucmVnaXN0ZXIpIGNhbWxfZmFpbHdpdGgoXCJjYW5ub3QgcmVnaXN0ZXIgZmlsZVwiKTtcbiAgcm9vdC5kZXZpY2UucmVnaXN0ZXIocm9vdC5yZXN0LGNvbnRlbnQpO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBqc29vX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9maWxlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlKG5hbWUsY29udGVudCkge1xuICB2YXIgbmFtZSA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobmFtZSk7XG4gIHZhciBjb250ZW50ID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhjb250ZW50KTtcbiAgcmV0dXJuIGNhbWxfY3JlYXRlX2ZpbGUobmFtZSwgY29udGVudCk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9yZWFkX2ZpbGVfY29udGVudFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfcmVhZF9maWxlX2NvbnRlbnQgKG5hbWUpIHtcbiAgdmFyIG5hbWUgPSAodHlwZW9mIG5hbWUgPT0gXCJzdHJpbmdcIik/Y2FtbF9zdHJpbmdfb2ZfanNieXRlcyhuYW1lKTpuYW1lO1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZihyb290LmRldmljZS5leGlzdHMocm9vdC5yZXN0KSkge1xuICAgIHZhciBmaWxlID0gcm9vdC5kZXZpY2Uub3Blbihyb290LnJlc3Qse3Jkb25seToxfSk7XG4gICAgdmFyIGxlbiAgPSBmaWxlLmxlbmd0aCgpO1xuICAgIHZhciBidWYgID0gY2FtbF9jcmVhdGVfYnl0ZXMobGVuKTtcbiAgICBmaWxlLnJlYWQoMCxidWYsMCxsZW4pO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9ieXRlcyhidWYpXG4gIH1cbiAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSk7XG59XG4iLCIvL1Byb3ZpZGVzOiB1bml4X2dldHRpbWVvZmRheVxuZnVuY3Rpb24gdW5peF9nZXR0aW1lb2ZkYXkgKCkge1xuICByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDA7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfdGltZVxuLy9SZXF1aXJlczogdW5peF9nZXR0aW1lb2ZkYXlcbmZ1bmN0aW9uIHVuaXhfdGltZSAoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKHVuaXhfZ2V0dGltZW9mZGF5ICgpKTtcbn1cblxuLy9Qcm92aWRlczogdW5peF9nbXRpbWVcbmZ1bmN0aW9uIHVuaXhfZ210aW1lICh0KSB7XG4gIHZhciBkID0gbmV3IERhdGUgKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSAobmV3IERhdGUoRGF0ZS5VVEMoZC5nZXRVVENGdWxsWWVhcigpLCAwLCAxKSkpLmdldFRpbWUoKTtcbiAgdmFyIGRveSA9IE1hdGguZmxvb3IoKGRfbnVtIC0gamFudWFyeWZpcnN0KSAvIDg2NDAwMDAwKTtcbiAgcmV0dXJuIEJMT0NLKDAsIGQuZ2V0VVRDU2Vjb25kcygpLCBkLmdldFVUQ01pbnV0ZXMoKSwgZC5nZXRVVENIb3VycygpLFxuICAgICAgICAgICAgICAgZC5nZXRVVENEYXRlKCksIGQuZ2V0VVRDTW9udGgoKSwgZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCxcbiAgICAgICAgICAgICAgIGQuZ2V0VVRDRGF5KCksIGRveSxcbiAgICAgICAgICAgICAgIGZhbHNlIHwgMCAvKiBmb3IgVVRDIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpcyBmYWxzZSAqLylcbn1cblxuLy9Qcm92aWRlczogdW5peF9sb2NhbHRpbWVcbmZ1bmN0aW9uIHVuaXhfbG9jYWx0aW1lICh0KSB7XG4gIHZhciBkID0gbmV3IERhdGUgKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSAobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKSkuZ2V0VGltZSgpO1xuICB2YXIgZG95ID0gTWF0aC5mbG9vcigoZF9udW0gLSBqYW51YXJ5Zmlyc3QpIC8gODY0MDAwMDApO1xuICB2YXIgamFuID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgdmFyIGp1bCA9IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgNiwgMSk7XG4gIHZhciBzdGRUaW1lem9uZU9mZnNldCA9IE1hdGgubWF4KGphbi5nZXRUaW1lem9uZU9mZnNldCgpLCBqdWwuZ2V0VGltZXpvbmVPZmZzZXQoKSk7XG4gIHJldHVybiBCTE9DSygwLCBkLmdldFNlY29uZHMoKSwgZC5nZXRNaW51dGVzKCksIGQuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgICAgIGQuZ2V0RGF0ZSgpLCBkLmdldE1vbnRoKCksIGQuZ2V0RnVsbFllYXIoKSAtIDE5MDAsXG4gICAgICAgICAgICAgICBkLmdldERheSgpLCBkb3ksXG4gICAgICAgICAgICAgICAoZC5nZXRUaW1lem9uZU9mZnNldCgpIDwgc3RkVGltZXpvbmVPZmZzZXQpIHwgMCAvKiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgIGZpZWxkLiAqLylcbn1cblxuLy9Qcm92aWRlczogdW5peF9ta3RpbWVcbi8vUmVxdWlyZXM6IHVuaXhfbG9jYWx0aW1lXG5mdW5jdGlvbiB1bml4X21rdGltZSh0bSl7XG4gIHZhciBkID0gKG5ldyBEYXRlKHRtWzZdKzE5MDAsdG1bNV0sdG1bNF0sdG1bM10sdG1bMl0sdG1bMV0pKS5nZXRUaW1lKCk7XG4gIHZhciB0ID0gTWF0aC5mbG9vcihkIC8gMTAwMCk7XG4gIHZhciB0bTIgPSB1bml4X2xvY2FsdGltZSh0KTtcbiAgcmV0dXJuIEJMT0NLKDAsdCx0bTIpO1xufVxuXG4vL1Byb3ZpZGVzOiB3aW5fc3RhcnR1cCBjb25zdFxuZnVuY3Rpb24gd2luX3N0YXJ0dXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiB3aW5fY2xlYW51cCBjb25zdFxuZnVuY3Rpb24gd2luX2NsZWFudXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiB3aW5faGFuZGxlX2ZkIGNvbnN0XG5mdW5jdGlvbiB3aW5faGFuZGxlX2ZkKHgpIHtyZXR1cm4geDt9XG5cbi8vUHJvdmlkZXM6IHVuaXhfaXNhdHR5XG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gdW5peF9pc2F0dHkoZmlsZURlc2NyaXB0b3IpIHtcbiAgaWYoZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbiAgICByZXR1cm4gdHR5LmlzYXR0eShmaWxlRGVzY3JpcHRvcik/MTowO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IG1ha2VfdW5peF9lcnJfYXJnc1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbnZhciB1bml4X2Vycm9yID0gW1xuICAvKiA9PT1Vbml4LmVycm9yPT09XG4gICAqXG4gICAqIFRoaXMgYXJyYXkgaXMgaW4gb3JkZXIgb2YgdGhlIHZhcmlhbnQgaW4gT0NhbWxcbiAgICovXG4gIFwiRTJCSUdcIiwgXCJFQUNDRVNcIiwgXCJFQUdBSU5cIiwgXCJFQkFERlwiLCBcIkVCVVNZXCIsIFwiRUNISUxEXCIsIFwiRURFQURMS1wiLCBcIkVET01cIixcbiAgXCJFRVhJU1RcIiwgXCJFRkFVTFRcIiwgXCJFRkJJR1wiLCBcIkVJTlRSXCIsIFwiRUlOVkFMXCIsIFwiRUlPXCIsIFwiRUlTRElSXCIsIFwiRU1GSUxFXCIsXG4gIFwiRU1MSU5LXCIsIFwiRU5BTUVUT09MT05HXCIsIFwiRU5GSUxFXCIsIFwiRU5PREVWXCIsIFwiRU5PRU5UXCIsIFwiRU5PRVhFQ1wiLCBcIkVOT0xDS1wiLFxuICBcIkVOT01FTVwiLCBcIkVOT1NQQ1wiLCBcIkVOT1NZU1wiLCBcIkVOT1RESVJcIiwgXCJFTk9URU1QVFlcIiwgXCJFTk9UVFlcIiwgXCJFTlhJT1wiLFxuICBcIkVQRVJNXCIsIFwiRVBJUEVcIiwgXCJFUkFOR0VcIiwgXCJFUk9GU1wiLCBcIkVTUElQRVwiLCBcIkVTUkNIXCIsIFwiRVhERVZcIiwgXCJFV09VTERCTE9DS1wiLFxuICBcIkVJTlBST0dSRVNTXCIsIFwiRUFMUkVBRFlcIiwgXCJFTk9UU09DS1wiLCBcIkVERVNUQUREUlJFUVwiLCBcIkVNU0dTSVpFXCIsXG4gIFwiRVBST1RPVFlQRVwiLCBcIkVOT1BST1RPT1BUXCIsIFwiRVBST1RPTk9TVVBQT1JUXCIsIFwiRVNPQ0tUTk9TVVBQT1JUXCIsXG4gIFwiRU9QTk9UU1VQUFwiLCBcIkVQRk5PU1VQUE9SVFwiLCBcIkVBRk5PU1VQUE9SVFwiLCBcIkVBRERSSU5VU0VcIiwgXCJFQUREUk5PVEFWQUlMXCIsXG4gIFwiRU5FVERPV05cIiwgXCJFTkVUVU5SRUFDSFwiLCBcIkVORVRSRVNFVFwiLCBcIkVDT05OQUJPUlRFRFwiLCBcIkVDT05OUkVTRVRcIiwgXCJFTk9CVUZTXCIsXG4gIFwiRUlTQ09OTlwiLCBcIkVOT1RDT05OXCIsIFwiRVNIVVRET1dOXCIsIFwiRVRPT01BTllSRUZTXCIsIFwiRVRJTUVET1VUXCIsIFwiRUNPTk5SRUZVU0VEXCIsXG4gIFwiRUhPU1RET1dOXCIsIFwiRUhPU1RVTlJFQUNIXCIsIFwiRUxPT1BcIiwgXCJFT1ZFUkZMT1dcIlxuXTtcbmZ1bmN0aW9uIG1ha2VfdW5peF9lcnJfYXJncyhjb2RlLCBzeXNjYWxsLCBwYXRoLCBlcnJubykge1xuICB2YXIgdmFyaWFudCA9IHVuaXhfZXJyb3IuaW5kZXhPZihjb2RlKTtcbiAgaWYgKHZhcmlhbnQgPCAwKSB7XG4gICAgLy8gRGVmYXVsdCBpZiB1bmRlZmluZWRcbiAgICBpZiAoZXJybm8gPT0gbnVsbCkge1xuICAgICAgZXJybm8gPSAtOTk5OVxuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHRoZSBhYm92ZSB2YXJpYW50cywgZmFsbGJhY2sgdG8gRVVOS05PV05FUlIoaW50KVxuICAgIHZhcmlhbnQgPSBCTE9DSygwLCBlcnJubyk7XG4gIH1cbiAgdmFyIGFyZ3MgPSBbXG4gICAgdmFyaWFudCxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzeXNjYWxsIHx8IFwiXCIpLFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGggfHwgXCJcIilcbiAgXTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIHVuaXhfc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2Uuc3RhdCkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJ1bml4X3N0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfc3RhdF82NFxuLy9SZXF1aXJlczogdW5peF9zdGF0XG52YXIgdW5peF9zdGF0XzY0ID0gdW5peF9zdGF0O1xuXG4vL1Byb3ZpZGVzOiB1bml4X2xzdGF0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gdW5peF9sc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwidW5peF9sc3RhdDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5sc3RhdChyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfbHN0YXRfNjRcbi8vUmVxdWlyZXM6IHVuaXhfbHN0YXRcbnZhciB1bml4X2xzdGF0XzY0ID0gdW5peF9sc3RhdDtcblxuLy9Qcm92aWRlczogdW5peF9ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIHVuaXhfbWtkaXIobmFtZSwgcGVybSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLm1rZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcInVuaXhfbWtkaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UubWtkaXIocm9vdC5yZXN0LCBwZXJtLCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiB1bml4X3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gdW5peF9ybWRpcihuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2Uucm1kaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwidW5peF9ybWRpcjogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5ybWRpcihyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfc3ltbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIHVuaXhfc3ltbGluayh0b19kaXIsIHNyYywgZHN0KSB7XG4gIHZhciBzcmNfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKHNyYyk7XG4gIHZhciBkc3Rfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRzdCk7XG4gIGlmKHNyY19yb290LmRldmljZSAhPSBkc3Rfcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcInVuaXhfc3ltbGluazogY2Fubm90IHN5bWxpbmsgYmV0d2VlbiB0d28gZmlsZXN5c3RlbXNcIik7XG4gIGlmICghc3JjX3Jvb3QuZGV2aWNlLnN5bWxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwidW5peF9zeW1saW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHNyY19yb290LmRldmljZS5zeW1saW5rKHRvX2Rpciwgc3JjX3Jvb3QucmVzdCwgZHN0X3Jvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogdW5peF9yZWFkbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIHVuaXhfcmVhZGxpbmsobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnJlYWRsaW5rKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcInVuaXhfcmVhZGxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UucmVhZGxpbmsocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiB1bml4X3VubGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIHVuaXhfdW5saW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS51bmxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwidW5peF91bmxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UudW5saW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogdW5peF9nZXR1aWRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG5mdW5jdGlvbiB1bml4X2dldHVpZCh1bml0KSB7XG4gIGlmKGdsb2JhbFRoaXMucHJvY2VzcyAmJiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0dWlkKXtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLmdldHVpZCgpO1xuICB9XG4gIGNhbWxfcmFpc2Vfbm90X2ZvdW5kKCk7XG59XG5cbi8vUHJvdmlkZXM6IHVuaXhfZ2V0cHd1aWRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG5mdW5jdGlvbiB1bml4X2dldHB3dWlkKHVuaXQpIHtcbiAgY2FtbF9yYWlzZV9ub3RfZm91bmQoKVxufVxuXG4vL1Byb3ZpZGVzOiB1bml4X2hhc19zeW1saW5rXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gdW5peF9oYXNfc3ltbGluayh1bml0KSB7XG4gIHJldHVybiBmc19ub2RlX3N1cHBvcnRlZCgpPzE6MFxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBTeXNcblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9zeXNfZXJyb3IgKG1zZykge1xuICBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nKGNhbWxfZ2xvYmFsX2RhdGEuU3lzX2Vycm9yLCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19leGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4aXQgKGNvZGUpIHtcbiAgdmFyIGcgPSBnbG9iYWxUaGlzO1xuICBpZihnLnF1aXQpIGcucXVpdChjb2RlKTtcbiAgLy9ub2RlanNcbiAgaWYoZy5wcm9jZXNzICYmIGcucHJvY2Vzcy5leGl0KVxuICAgIGcucHJvY2Vzcy5leGl0KGNvZGUpO1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJGdW5jdGlvbiAnZXhpdCcgbm90IGltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uKGV4bil7XG4gIHN3aXRjaChleG5bMl0pIHtcbiAgY2FzZSAtODogLy8gTWF0Y2hfZmFpbHVyZVxuICBjYXNlIC0xMTogLy8gQXNzZXJ0X2ZhaWx1cmVcbiAgY2FzZSAtMTI6IC8vIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlXG4gICAgcmV0dXJuIDE7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9leGNlcHRpb24oZXhuKXtcbiAgdmFyIHIgPSBcIlwiO1xuICBpZihleG5bMF0gPT0gMCkge1xuICAgIHIgKz0gZXhuWzFdWzFdO1xuICAgIGlmKGV4bi5sZW5ndGggPT0gMyAmJiBleG5bMl1bMF0gPT0gMCAmJiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uKGV4blsxXSkpIHtcblxuICAgICAgdmFyIGJ1Y2tldCA9IGV4blsyXTtcbiAgICAgIHZhciBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFydCA9IDJcbiAgICAgIHZhciBidWNrZXQgPSBleG47XG4gICAgfVxuICAgIHIgKz0gXCIoXCI7XG4gICAgZm9yKHZhciBpID0gc3RhcnQ7IGkgPCBidWNrZXQubGVuZ3RoOyBpICsrKXtcbiAgICAgIGlmKGkgPiBzdGFydCkgcis9XCIsIFwiO1xuICAgICAgdmFyIHYgPSBidWNrZXRbaV1cbiAgICAgIGlmKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpXG4gICAgICAgIHIrPSB2LnRvU3RyaW5nKCk7XG4gICAgICBlbHNlIGlmKHYgaW5zdGFuY2VvZiBNbEJ5dGVzKXtcbiAgICAgICAgcis9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfVxuICAgICAgZWxzZSBpZih0eXBlb2YgdiA9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgcis9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfVxuICAgICAgZWxzZSByICs9IFwiX1wiO1xuICAgIH1cbiAgICByICs9IFwiKVwiXG4gIH0gZWxzZSBpZiAoZXhuWzBdID09IDI0OCl7XG4gICAgciArPSBleG5bMV1cbiAgfVxuICByZXR1cm4gclxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9mb3JtYXRfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihlcnIpe1xuICBpZihlcnIgaW5zdGFuY2VvZiBBcnJheSAmJiAoZXJyWzBdID09IDAgfHwgZXJyWzBdID09IDI0OCkpIHtcbiAgICB2YXIgaGFuZGxlciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCIpO1xuICAgIGlmKGhhbmRsZXIpIGhhbmRsZXIoZXJyLGZhbHNlKTtcbiAgICBlbHNlIHtcbiAgICAgIHZhciBtc2cgPSBjYW1sX2Zvcm1hdF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHZhciBhdF9leGl0ID0gY2FtbF9uYW1lZF92YWx1ZShcIlBlcnZhc2l2ZXMuZG9fYXRfZXhpdFwiKTtcbiAgICAgIGlmKGF0X2V4aXQpIHsgYXRfZXhpdCgwKSB9XG4gICAgICBnbG9iYWxUaGlzLmNvbnNvbGUuZXJyb3IoXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uIFwiICsgbXNnICsgXCJcXG5cIik7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IGVyclxuICB9XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zZXRfc3RhdGljX2VudlxuZnVuY3Rpb24gY2FtbF9zZXRfc3RhdGljX2VudihrLHYpe1xuICBpZighZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnYpXG4gICAgZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnYgPSB7fVxuICBnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudltrXSA9IHY7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0ZW52IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGVudiAobmFtZSkge1xuICB2YXIgZyA9IGdsb2JhbFRoaXM7XG4gIHZhciBuID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIC8vbm9kZWpzIGVudlxuICBpZihnLnByb2Nlc3NcbiAgICAgJiYgZy5wcm9jZXNzLmVudlxuICAgICAmJiBnLnByb2Nlc3MuZW52W25dICE9IHVuZGVmaW5lZClcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoZy5wcm9jZXNzLmVudltuXSk7XG4gIGlmKGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52XG4gICAgICYmIGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52W25dKVxuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudltuXSlcbiAgY2FtbF9yYWlzZV9ub3RfZm91bmQgKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnZcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2dldGVudlxuZnVuY3Rpb24gY2FtbF9zeXNfdW5zYWZlX2dldGVudihuYW1lKXtcbiAgcmV0dXJuIGNhbWxfc3lzX2dldGVudiAobmFtZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJndlxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbnZhciBjYW1sX2FyZ3YgPSAoKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGcgPSBnbG9iYWxUaGlzO1xuICB2YXIgbWFpbiA9IFwiYS5vdXRcIjtcbiAgdmFyIGFyZ3MgPSBbXVxuXG4gIGlmKGcucHJvY2Vzc1xuICAgICAmJiBnLnByb2Nlc3MuYXJndlxuICAgICAmJiBnLnByb2Nlc3MuYXJndi5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3YgPSBnLnByb2Nlc3MuYXJndlxuICAgIC8vbm9kZWpzXG4gICAgbWFpbiA9IGFyZ3ZbMV07XG4gICAgYXJncyA9IGFyZ3Yuc2xpY2UoMik7XG4gIH1cblxuICB2YXIgcCA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG1haW4pO1xuICB2YXIgYXJnczIgPSBbMCwgcF07XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKVxuICAgIGFyZ3MyLnB1c2goY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoYXJnc1tpXSkpO1xuICByZXR1cm4gYXJnczI7XG59KSgpKVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG52YXIgY2FtbF9leGVjdXRhYmxlX25hbWUgPSBjYW1sX2FyZ3ZbMV1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0X2FyZ3YgKGEpIHtcbiAgcmV0dXJuIFswLCBjYW1sX2FyZ3ZbMV0sIGNhbWxfYXJndl07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfYXJndiAoYSkge1xuICByZXR1cm4gY2FtbF9hcmd2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19tb2RpZnlfYXJndlxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG5mdW5jdGlvbiBjYW1sX3N5c19tb2RpZnlfYXJndihhcmcpe1xuICBjYW1sX2FyZ3YgPSBhcmc7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19leGVjdXRhYmxlX25hbWUgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfZXhlY3V0YWJsZV9uYW1lXG5mdW5jdGlvbiBjYW1sX3N5c19leGVjdXRhYmxlX25hbWUoYSl7XG4gIHJldHVybiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKGNtZCl7XG4gIHZhciBjbWQgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhjbWQpO1xuICBpZiAodHlwZW9mIHJlcXVpcmUgIT0gXCJ1bmRlZmluZWRcIlxuICAgICAgJiYgcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpXG4gICAgICAmJiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1N5bmMpIHtcbiAgICB0cnkge3JlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjU3luYyhjbWQse3N0ZGlvOiAnaW5oZXJpdCd9KTsgcmV0dXJuIDB9XG4gICAgY2F0Y2ggKGUpIHtyZXR1cm4gMX1cbiAgfVxuICBlbHNlIHJldHVybiAxMjc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RpbWUgbXV0YWJsZVxudmFyIGNhbWxfaW5pdGlhbF90aW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAqIDAuMDAxO1xuZnVuY3Rpb24gY2FtbF9zeXNfdGltZSAoKSB7XG4gIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICByZXR1cm4gbm93ICogMC4wMDEgLSBjYW1sX2luaXRpYWxfdGltZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuXG4vL1JlcXVpcmVzOiBjYW1sX3N5c190aW1lXG5mdW5jdGlvbiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4oYikge1xuICByZXR1cm4gY2FtbF9zeXNfdGltZSgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yYW5kb21fc2VlZCBtdXRhYmxlXG4vL1RoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gYW4gYXJyYXkgc2luY2UgT0NhbWwgNC4wLi4uXG5mdW5jdGlvbiBjYW1sX3N5c19yYW5kb21fc2VlZCAoKSB7XG4gIGlmKGdsb2JhbFRoaXMuY3J5cHRvKSB7XG4gICAgaWYodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAvLyBXZWJicm93c2Vyc1xuICAgICAgdmFyIGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50MzJBcnJheSgxKTtcbiAgICAgIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhKTtcbiAgICAgIHJldHVybiBbMCxhWzBdXTtcbiAgICB9IGVsc2UgaWYoZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpe1xuICAgICAgLy8gTm9kZWpzXG4gICAgICB2YXIgYnVmZiA9IGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbUJ5dGVzKDQpO1xuICAgICAgdmFyIGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50MzJBcnJheShidWZmKTtcbiAgICAgIHJldHVybiBbMCxhWzBdXTtcbiAgICB9XG4gIH1cbiAgdmFyIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gIHZhciB4ID0gbm93XjB4ZmZmZmZmZmYqTWF0aC5yYW5kb20oKTtcbiAgcmV0dXJuIFswLHhdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuICgpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUgKCkgeyByZXR1cm4gMzI7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfaW50X3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2ludF9zaXplICgpIHsgcmV0dXJuIDMyOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgY29uc3Rcbi8vIG1heF9pbnQgLyA0IHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkb2VzIG5vdCBvdmVyZmxvd1xuLy9sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDE7O1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSAoKSB7IHJldHVybiAoMHg3RkZGRkZGRi80KSB8IDA7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXggKCkgeyByZXR1cm4gb3NfdHlwZSA9PSBcIlVuaXhcIiA/IDEgOiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIgY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV93aW4zMiAoKSB7IHJldHVybiBvc190eXBlID09IFwiV2luMzJcIiA/IDEgOiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfY3lnd2luIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfY3lnd2luICgpIHsgcmV0dXJuIG9zX3R5cGUgPT0gXCJDeWd3aW5cIiA/IDEgOiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlICgpIHtcbiAgcmV0dXJuIFswLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwianNfb2Zfb2NhbWxcIildO1xufVxuXG4vL1Byb3ZpZGVzOiBvc190eXBlXG52YXIgb3NfdHlwZSA9IChnbG9iYWxUaGlzLnByb2Nlc3MgJiZcbiAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSAmJlxuICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikgPyBcIkN5Z3dpblwiIDogXCJVbml4XCI7XG5cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0X2NvbmZpZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0X2NvbmZpZyAoKSB7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhvc190eXBlKSwgMzIsIDBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfc3lzX2lzYXR0eShfY2hhbikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3ZhcmlhbnRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV92YXJpYW50KF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3BhcmFtZXRlcnNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW5zdGFsbF9zaWduYWxfaGFuZGxlcigpe3JldHVybiAwfVxuXG4vL1Byb3ZpZGVzOiB1bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbmZ1bmN0aW9uIHVuaXhfaW5ldF9hZGRyX29mX3N0cmluZyAoKSB7cmV0dXJuIDA7fVxuXG5cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG52YXIgY2FtbF9ydW50aW1lX3dhcm5pbmdzID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1xuLy9SZXF1aXJlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG5mdW5jdGlvbiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzIChib29sKSB7XG4gIGNhbWxfcnVudGltZV93YXJuaW5ncyA9IGJvb2w7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZFxuLy9SZXF1aXJlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG5mdW5jdGlvbiBjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZCAoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfcnVudGltZV93YXJuaW5ncztcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NwYWNldGltZV9lbmFibGVkIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfc3BhY2V0aW1lX2VuYWJsZWQoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X25ha2VkX3BvaW50ZXJzX2NoZWNrZWQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZChfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9jaGFubmVsX2Zvcl9zcGFjZXRpbWUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9jaGFubmVsX2Zvcl9zcGFjZXRpbWUoX2NoYW5uZWwpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3BhY2V0aW1lX29ubHlfd29ya3NfZm9yX25hdGl2ZV9jb2RlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3NwYWNldGltZV9vbmx5X3dvcmtzX2Zvcl9uYXRpdmVfY29kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcIlNwYWNldGltZSBwcm9maWxpbmcgb25seSB3b3JrcyBmb3IgbmF0aXZlIGNvZGVcIik7XG59XG5cbi8vQWx3YXlzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9zZXR1cF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlcigpIHtcbiAgdmFyIGcgPSBnbG9iYWxUaGlzO1xuICBpZihnLnByb2Nlc3MgJiYgZy5wcm9jZXNzLm9uKSB7XG4gICAgZy5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGZ1bmN0aW9uIChlcnIsIG9yaWdpbikge1xuICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKTtcbiAgICAgIGcucHJvY2Vzcy5leGl0ICgyKTtcbiAgICB9KVxuICB9XG4gIGVsc2UgaWYoZy5hZGRFdmVudExpc3RlbmVyKXtcbiAgICBnLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgaWYoZXZlbnQuZXJyb3Ipe1xuICAgICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihldmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IE1sRmFrZURldmljZVxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXksIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3JhaXNlX3dpdGhfYXJncywgY2FtbF9uYW1lZF92YWx1ZXNcbi8vUmVxdWlyZXM6IG1ha2VfdW5peF9lcnJfYXJnc1xuZnVuY3Rpb24gTWxGYWtlRGV2aWNlIChyb290LCBmKSB7XG4gIHRoaXMuY29udGVudD17fTtcbiAgdGhpcy5yb290ID0gcm9vdDtcbiAgdGhpcy5sb29rdXBGdW4gPSBmO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5ubSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuICh0aGlzLnJvb3QgKyBuYW1lKTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuY3JlYXRlX2Rpcl9pZl9uZWVkZWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjb21wID0gbmFtZS5zcGxpdChcIi9cIik7XG4gIHZhciByZXMgPSBcIlwiO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgY29tcC5sZW5ndGggLSAxOyBpKyspe1xuICAgIHJlcyArPSBjb21wW2ldICsgXCIvXCI7XG4gICAgaWYodGhpcy5jb250ZW50W3Jlc10pIGNvbnRpbnVlO1xuICAgIHRoaXMuY29udGVudFtyZXNdID0gU3ltYm9sKFwiZGlyZWN0b3J5XCIpO1xuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnNsYXNoID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiAvXFwvJC8udGVzdChuYW1lKT9uYW1lOihuYW1lICsgXCIvXCIpO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGlmKCF0aGlzLmNvbnRlbnRbbmFtZV0gJiYgdGhpcy5sb29rdXBGdW4pIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb29rdXBGdW4oY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh0aGlzLnJvb3QpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKG5hbWUpKTtcbiAgICBpZihyZXMgIT09IDApIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV09bmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9zdHJpbmcocmVzWzFdKSk7XG4gICAgfVxuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmV4aXN0cyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgLy8gVGhlIHJvb3Qgb2YgdGhlIGRldmljZSBleGlzdHNcbiAgaWYobmFtZSA9PSBcIlwiKSByZXR1cm4gMTtcbiAgLy8gQ2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzXG4gIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgaWYodGhpcy5jb250ZW50W25hbWVfc2xhc2hdKSByZXR1cm4gMTtcbiAgLy8gQ2hlY2sgaWYgYSBmaWxlIGV4aXN0c1xuICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lXT8xOjA7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm1rZGlyID0gZnVuY3Rpb24obmFtZSxtb2RlLCByYWlzZV91bml4KSB7XG4gIHZhciB1bml4X2Vycm9yID0gcmFpc2VfdW5peCAmJiBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcbiAgaWYodGhpcy5leGlzdHMobmFtZSkpIHtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUVYSVNUXCIsIFwibWtkaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogRmlsZSBleGlzdHNcIik7XG4gICAgfVxuICB9XG4gIHZhciBwYXJlbnQgPSAvXiguKilcXC9bXi9dKy8uZXhlYyhuYW1lKTtcbiAgcGFyZW50ID0gKHBhcmVudCAmJiBwYXJlbnRbMV0pIHx8ICcnO1xuICBpZighdGhpcy5leGlzdHMocGFyZW50KSl7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT0VOVFwiLCBcIm1rZGlyXCIsIHRoaXMubm0ocGFyZW50KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHBhcmVudCArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICBpZighdGhpcy5pc19kaXIocGFyZW50KSl7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT1RESVJcIiwgXCJta2RpclwiLCB0aGlzLm5tKHBhcmVudCkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihwYXJlbnQgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKHRoaXMuc2xhc2gobmFtZSkpO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5ybWRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSByYWlzZV91bml4ICYmIGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuICB2YXIgbmFtZV9zbGFzaCA9IChuYW1lID09IFwiXCIpP1wiXCI6KHRoaXMuc2xhc2gobmFtZSkpO1xuICB2YXIgciA9IG5ldyBSZWdFeHAoXCJeXCIgKyBuYW1lX3NsYXNoICsgXCIoW14vXSspXCIpO1xuICBpZighdGhpcy5leGlzdHMobmFtZSkpIHtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PRU5UXCIsIFwicm1kaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cbiAgaWYoIXRoaXMuaXNfZGlyKG5hbWUpKSB7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT1RESVJcIiwgXCJybWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG4gICAgfVxuICB9XG4gIGZvcih2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICBpZihuLm1hdGNoKHIpKSB7XG4gICAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9URU1QVFlcIiwgXCJybWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCI6IERpcmVjdG9yeSBub3QgZW1wdHlcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF07XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnJlYWRkaXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBuYW1lX3NsYXNoID0gKG5hbWUgPT0gXCJcIik/XCJcIjoodGhpcy5zbGFzaChuYW1lKSk7XG4gIGlmKCF0aGlzLmV4aXN0cyhuYW1lKSkge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbiAgfVxuICBpZighdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vdCBhIGRpcmVjdG9yeVwiKTtcbiAgfVxuICB2YXIgciA9IG5ldyBSZWdFeHAoXCJeXCIgKyBuYW1lX3NsYXNoICsgXCIoW14vXSspXCIpO1xuICB2YXIgc2VlbiA9IHt9XG4gIHZhciBhID0gW107XG4gIGZvcih2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICB2YXIgbSA9IG4ubWF0Y2gocik7XG4gICAgaWYobSAmJiAhc2VlblttWzFdXSkge3NlZW5bbVsxXV0gPSB0cnVlOyBhLnB1c2gobVsxXSl9XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmlzX2RpciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYobmFtZSA9PSBcIlwiKSAgcmV0dXJuIHRydWU7XG4gIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXT8xOjA7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIG9rID0gdGhpcy5jb250ZW50W25hbWVdP3RydWU6ZmFsc2U7XG4gIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gIHJldHVybiBvaztcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG5hbWUsIGYpIHtcbiAgaWYoZi5yZG9ubHkgJiYgZi53cm9ubHkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl9yZG9ubHkgYW5kIE9wZW5fd3Jvbmx5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgaWYoZi50ZXh0ICYmIGYuYmluYXJ5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fdGV4dCBhbmQgT3Blbl9iaW5hcnkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgaWYgKHRoaXMuY29udGVudFtuYW1lXSkge1xuICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogaXMgYSBkaXJlY3RvcnlcIik7XG4gICAgaWYgKGYuY3JlYXRlICYmIGYuZXhjbCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgICB2YXIgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICBpZihmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKCk7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgIHRoaXMuY29udGVudFtuYW1lXSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfY3JlYXRlX2J5dGVzKDApKTtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVdO1xuICB9IGVsc2Uge1xuICAgIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlICh0aGlzLm5tKG5hbWUpKTtcbiAgfVxufVxuXG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnJlZ2lzdGVyPSBmdW5jdGlvbiAobmFtZSxjb250ZW50KXtcbiAgdmFyIGZpbGU7XG4gIGlmKHRoaXMuY29udGVudFtuYW1lXSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgaWYoY2FtbF9pc19tbF9ieXRlcyhjb250ZW50KSlcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY29udGVudCk7XG4gIGlmKGNhbWxfaXNfbWxfc3RyaW5nKGNvbnRlbnQpKVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhjb250ZW50KSk7XG4gIGVsc2UgaWYoY29udGVudCBpbnN0YW5jZW9mIEFycmF5KVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX2FycmF5KGNvbnRlbnQpKTtcbiAgZWxzZSBpZih0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIilcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9qc2J5dGVzKGNvbnRlbnQpKTtcbiAgZWxzZSBpZihjb250ZW50LnRvU3RyaW5nKSB7XG4gICAgdmFyIGJ5dGVzID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoY29udGVudC50b1N0cmluZygpKSk7XG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGJ5dGVzKTtcbiAgfVxuICBpZihmaWxlKXtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgIHRoaXMuY29udGVudFtuYW1lXSA9IGZpbGU7XG4gIH1cbiAgZWxzZSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiByZWdpc3RlcmluZyBmaWxlIHdpdGggaW52YWxpZCBjb250ZW50IHR5cGVcIik7XG59XG5cbk1sRmFrZURldmljZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNbEZha2VEZXZpY2VcblxuLy9Qcm92aWRlczogTWxGYWtlRmlsZVxuLy9SZXF1aXJlczogTWxGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9ieXRlc19sZW5ndGgsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19nZXRcbmZ1bmN0aW9uIE1sRmFrZUZpbGUoY29udGVudCl7XG4gIHRoaXMuZGF0YSA9IGNvbnRlbnQ7XG59XG5NbEZha2VGaWxlLnByb3RvdHlwZSA9IG5ldyBNbEZpbGUgKCk7XG5NbEZha2VGaWxlLnByb3RvdHlwZS50cnVuY2F0ZSA9IGZ1bmN0aW9uKGxlbil7XG4gIHZhciBvbGQgPSB0aGlzLmRhdGE7XG4gIHRoaXMuZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbnwwKTtcbiAgY2FtbF9ibGl0X2J5dGVzKG9sZCwgMCwgdGhpcy5kYXRhLCAwLCBsZW4pO1xufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgodGhpcy5kYXRhKTtcbn1cbk1sRmFrZUZpbGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob2Zmc2V0LGJ1Zixwb3MsbGVuKXtcbiAgdmFyIGNsZW4gPSB0aGlzLmxlbmd0aCgpO1xuICBpZihvZmZzZXQgKyBsZW4gPj0gY2xlbikge1xuICAgIHZhciBuZXdfc3RyID0gY2FtbF9jcmVhdGVfYnl0ZXMob2Zmc2V0ICsgbGVuKTtcbiAgICB2YXIgb2xkX2RhdGEgPSB0aGlzLmRhdGE7XG4gICAgdGhpcy5kYXRhID0gbmV3X3N0cjtcbiAgICBjYW1sX2JsaXRfYnl0ZXMob2xkX2RhdGEsIDAsIHRoaXMuZGF0YSwgMCwgY2xlbik7XG4gIH1cbiAgY2FtbF9ibGl0X3N0cmluZyhidWYsIHBvcywgdGhpcy5kYXRhLCBvZmZzZXQsIGxlbik7XG4gIHJldHVybiAwXG59XG5NbEZha2VGaWxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24ob2Zmc2V0LGJ1Zixwb3MsbGVuKXtcbiAgdmFyIGNsZW4gPSB0aGlzLmxlbmd0aCgpO1xuICBjYW1sX2JsaXRfYnl0ZXModGhpcy5kYXRhLCBvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pO1xuICByZXR1cm4gMFxufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUucmVhZF9vbmUgPSBmdW5jdGlvbihvZmZzZXQpe1xuICByZXR1cm4gY2FtbF9ieXRlc19nZXQodGhpcy5kYXRhLCBvZmZzZXQpO1xufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpe1xuXG59XG5NbEZha2VGaWxlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sRmFrZUZpbGVcbiIsIi8vUHJvdmlkZXM6IGluaXRpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IHNlcmlhbGl6ZV9uYXQsIGRlc2VyaWFsaXplX25hdCwgY2FtbF9oYXNoX25hdFxuZnVuY3Rpb24gaW5pdGlhbGl6ZV9uYXQoKSB7XG4gIGNhbWxfY3VzdG9tX29wc1tcIl9uYXRcIl0gPVxuICAgIHsgZGVzZXJpYWxpemUgOiBkZXNlcmlhbGl6ZV9uYXQsXG4gICAgICBzZXJpYWxpemUgOiBzZXJpYWxpemVfbmF0LFxuICAgICAgaGFzaCA6IGNhbWxfaGFzaF9uYXRcbiAgICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sTmF0XG5mdW5jdGlvbiBNbE5hdCh4KXtcbiAgdGhpcy5kYXRhID0gbmV3IGdsb2JhbFRoaXMuSW50MzJBcnJheSh4KTtcbiAgLy8gbGVuZ3RoX25hdCBpc24ndCBleHRlcm5hbCwgc28gd2UgaGF2ZSB0byBtYWtlIHRoZSBPYmouc2l6ZVxuICAvLyB3b3JrIG91dCByaWdodC4gVGhlICsyIHRvIGFycmF5IGxlbmd0aCBzZWVtcyB0byB3b3JrLlxuICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGggKyAyXG59XG5cbk1sTmF0LnByb3RvdHlwZS5jYW1sX2N1c3RvbSA9IFwiX25hdFwiO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbmF0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludCwgbnVtX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9uYXQoeCkge1xuICB2YXIgbGVuID0gbnVtX2RpZ2l0c19uYXQoeCwgMCwgeC5kYXRhLmxlbmd0aCk7XG4gIHZhciBoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB4LmRhdGFbaV0pO1xuICB9XG4gIHJldHVybiBoO1xufVxuXG5cbi8vUHJvdmlkZXM6IG5hdF9vZl9hcnJheVxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIG5hdF9vZl9hcnJheShsKXtcbiAgcmV0dXJuIG5ldyBNbE5hdChsKTtcbn1cblxuLy9Qcm92aWRlczogY3JlYXRlX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGNyZWF0ZV9uYXQoc2l6ZSkge1xuICB2YXIgYXJyID0gbmV3IE1sTmF0KHNpemUpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgYXJyLmRhdGFbaV0gPSAtMTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXRfdG9femVyb19uYXRcbmZ1bmN0aW9uIHNldF90b196ZXJvX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcytpXSA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGJsaXRfbmF0XG5mdW5jdGlvbiBibGl0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyLCBsZW4pIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSBuYXQyLmRhdGFbb2ZzMitpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdFxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdChuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdFxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdChuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBudW1fZGlnaXRzX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvcih2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYobmF0LmRhdGFbb2ZzK2ldICE9IDApIHJldHVybiBpKzE7XG4gIH1cbiAgcmV0dXJuIDE7IC8vIDAgY291bnRzIGFzIDEgZGlnaXRcbn1cblxuLy9Qcm92aWRlczogbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0XG5mdW5jdGlvbiBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0LCBvZnMpIHtcbiAgdmFyIGEgPSBuYXQuZGF0YVtvZnNdO1xuICB2YXIgYiA9IDA7XG4gIGlmKGEgJiAweEZGRkYwMDAwKSB7IGIgKz0xNjsgYSA+Pj49MTY7IH1cbiAgaWYoYSAmIDB4RkYwMCkgICAgIHsgYiArPSA4OyBhID4+Pj0gODsgfVxuICBpZihhICYgMHhGMCkgICAgICAgeyBiICs9IDQ7IGEgPj4+PSA0OyB9XG4gIGlmKGEgJiAxMikgICAgICAgICB7IGIgKz0gMjsgYSA+Pj49IDI7IH1cbiAgaWYoYSAmIDIpICAgICAgICAgIHsgYiArPSAxOyBhID4+Pj0gMTsgfVxuICBpZihhICYgMSkgICAgICAgICAgeyBiICs9IDE7IH1cbiAgcmV0dXJuIDMyIC0gYjtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfaW50XG5mdW5jdGlvbiBpc19kaWdpdF9pbnQobmF0LCBvZnMpIHtcbiAgaWYgKG5hdC5kYXRhW29mc10gPj0gMCkgcmV0dXJuIDFcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X3plcm9cbmZ1bmN0aW9uIGlzX2RpZ2l0X3plcm8obmF0LCBvZnMpIHtcbiAgaWYobmF0LmRhdGFbb2ZzXSA9PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X29kZFxuZnVuY3Rpb24gaXNfZGlnaXRfb2RkKG5hdCwgb2ZzKSB7XG4gIGlmKG5hdC5kYXRhW29mc10gJiAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGluY3JfbmF0XG5mdW5jdGlvbiBpbmNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgY2FycnkgPSBjYXJyeV9pbjtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0LmRhdGFbb2ZzK2ldID4+PiAwKSArIGNhcnJ5O1xuICAgIG5hdC5kYXRhW29mcytpXSA9ICh4IHwgMCk7XG4gICAgaWYoeCA9PSAoeCA+Pj4gMCkpIHtcbiAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBjYXJyeTtcbn1cblxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBhZGRfbmF0XG4vL1JlcXVpcmVzOiBpbmNyX25hdFxuZnVuY3Rpb24gYWRkX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBjYXJyeV9pbikge1xuICB2YXIgY2FycnkgPSBjYXJyeV9pbjtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSArIChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHhcbiAgICBpZih4ID09ICh4ID4+PiAwKSkge1xuICAgICAgY2FycnkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmNyX25hdChuYXQxLCBvZnMxK2xlbjIsIGxlbjEtbGVuMiwgY2FycnkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wbGVtZW50X25hdFxuZnVuY3Rpb24gY29tcGxlbWVudF9uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQuZGF0YVtvZnMraV0gPSAoLTEgPj4+IDApIC0gKG5hdC5kYXRhW29mcytpXSA+Pj4gMCk7XG4gIH1cbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vUHJvdmlkZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBkZWNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gKGNhcnJ5X2luID09IDEpID8gMCA6IDE7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcytpXSA+Pj4wKSAtIGJvcnJvdztcbiAgICBuYXQuZGF0YVtvZnMraV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYm9ycm93ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChib3Jyb3cgPT0gMSkgPyAwIDogMTtcbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogc3ViX25hdFxuLy9SZXF1aXJlczogZGVjcl9uYXRcbmZ1bmN0aW9uIHN1Yl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGJvcnJvdyA9IChjYXJyeV9pbiA9PSAxKSA/IDAgOiAxO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApIC0gKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSAtIGJvcnJvdztcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9ycm93ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlY3JfbmF0KG5hdDEsIG9mczErbGVuMiwgbGVuMS1sZW4yLCAoYm9ycm93PT0xKT8wOjEpO1xufVxuXG4vLyBuYXQxICs9IG5hdDIgKiBuYXQzW29mczNdXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IG11bHRfZGlnaXRfbmF0XG4vL1JlcXVpcmVzOiBhZGRfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIG11bHRfZGlnaXRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGEgPSAobmF0My5kYXRhW29mczNdID4+PiAwKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4MSA9IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApICogKGEgJiAweDAwMDBGRkZGKSArIGNhcnJ5O1xuICAgIHZhciB4MiA9IChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgKiAoYSA+Pj4gMTYpO1xuICAgIGNhcnJ5ID0gTWF0aC5mbG9vcih4Mi82NTUzNik7XG4gICAgdmFyIHgzID0geDEgKyAoeDIgJSA2NTUzNikgKiA2NTUzNjtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHgzO1xuICAgIGNhcnJ5ICs9IE1hdGguZmxvb3IoeDMvNDI5NDk2NzI5Nik7XG4gIH1cblxuICBpZihsZW4yIDwgbGVuMSAmJiBjYXJyeSkge1xuICAgIHJldHVybiBhZGRfbmF0KG5hdDEsIG9mczErbGVuMiwgbGVuMS1sZW4yLCBuYXRfb2ZfYXJyYXkoW2NhcnJ5XSksIDAsIDEsIDApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYXJyeTtcbiAgfVxufVxuXG4vLyBuYXQxICs9IG5hdDIgKiBuYXQzXG4vLyBsZW4xID49IGxlbjIgKyBsZW4zLlxuLy9Qcm92aWRlczogbXVsdF9uYXRcbi8vUmVxdWlyZXM6IG11bHRfZGlnaXRfbmF0XG5mdW5jdGlvbiBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzLCBsZW4zKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4zOyBpKyspIHtcbiAgICBjYXJyeSArPSBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxK2ksIGxlbjEtaSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0Mywgb2ZzMytpKTtcbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIG5hdDEgPSAyICogbmF0MSArIG5hdDIgKiBuYXQyXG4vLyBsZW4xID49IDIgKiBsZW4yXG4vL1Byb3ZpZGVzOiBzcXVhcmVfbmF0XG4vL1JlcXVpcmVzOiBtdWx0X25hdCwgYWRkX25hdFxuZnVuY3Rpb24gc3F1YXJlX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIGNhcnJ5ICs9IGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0MSwgb2ZzMSwgbGVuMSwgMCk7XG4gIGNhcnJ5ICs9IG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDIsIG9mczIsIGxlbjIpO1xuICByZXR1cm4gY2Fycnk7XG59XG5cblxuLy8gMCA8PSBzaGlmdCA8IDMyXG4vL1Byb3ZpZGVzOiBzaGlmdF9sZWZ0X25hdFxuZnVuY3Rpb24gc2hpZnRfbGVmdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbmJpdHMpIHtcbiAgaWYobmJpdHMgPT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMTsgaSsrKSB7XG4gICAgdmFyIGEgPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApO1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gKGEgPDwgbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA+Pj4gKDMyIC0gbmJpdHMpO1xuICB9XG4gIG5hdDIuZGF0YVtvZnMyXSA9IHdyYXA7XG4gIHJldHVybiAwO1xufVxuXG4vLyBBc3N1bWluZyBjID4gYSwgcmV0dXJucyBbcXVvdGllbnQsIHJlbWFpbmRlcl0gb2YgKGE8PDMyICsgYikvY1xuLy9Qcm92aWRlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2hlbHBlcihhLCBiLCBjKSB7XG4gIHZhciB4ID0gYSAqIDY1NTM2ICsgKGI+Pj4xNik7XG4gIHZhciB5ID0gTWF0aC5mbG9vcih4L2MpICogNjU1MzY7XG4gIHZhciB6ID0gKHggJSBjKSAqIDY1NTM2O1xuICB2YXIgdyA9IHogKyAoYiAmIDB4MDAwMEZGRkYpO1xuICByZXR1cm4gW3kgKyBNYXRoLmZsb29yKHcvYyksIHcgJSBjXTtcbn1cblxuLy8gbmF0MVtvZnMxK2xlbl0gPCBuYXQyW29mczJdXG4vL1Byb3ZpZGVzOiBkaXZfZGlnaXRfbmF0XG4vL1JlcXVpcmVzOiBkaXZfaGVscGVyXG5mdW5jdGlvbiBkaXZfZGlnaXRfbmF0KG5hdHEsIG9mc3EsIG5hdHIsIG9mc3IsIG5hdDEsIG9mczEsIGxlbiwgbmF0Miwgb2ZzMikge1xuICB2YXIgcmVtID0gKG5hdDEuZGF0YVtvZnMxK2xlbi0xXSA+Pj4wKTtcbiAgLy8gbmF0cVtvZnNxK2xlbi0xXSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gKGR1ZSB0byB0aGUgTVNEIHJlcXVpcmVtZW50KSxcbiAgLy8gYW5kIHNob3VsZCBub3QgYmUgd3JpdHRlbiB0by5cbiAgZm9yKHZhciBpID0gbGVuLTI7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHggPSBkaXZfaGVscGVyKHJlbSwgKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSwgKG5hdDIuZGF0YVtvZnMyXSA+Pj4gMCkpO1xuICAgIG5hdHEuZGF0YVtvZnNxK2ldID0geFswXTtcbiAgICByZW0gPSB4WzFdO1xuICB9XG4gIG5hdHIuZGF0YVtvZnNyXSA9IHJlbTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vIG5hdDFbbmF0MjpdIDo9IG5hdDEgLyBuYXQyXG4vLyBuYXQxWzpuYXQyXSA6PSBuYXQxICUgbmF0MlxuLy8gbGVuMSA+IGxlbjIsIG5hdDJbb2ZzMitsZW4yLTFdID4gbmF0MVtvZnMxK2xlbjEtMV1cbi8vUHJvdmlkZXM6IGRpdl9uYXRcbi8vUmVxdWlyZXM6IGRpdl9kaWdpdF9uYXQsIGRpdl9oZWxwZXIsIG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdCwgc2hpZnRfbGVmdF9uYXQsIHNoaWZ0X3JpZ2h0X25hdCwgY3JlYXRlX25hdCwgc2V0X3RvX3plcm9fbmF0LCBtdWx0X2RpZ2l0X25hdCwgc3ViX25hdCwgY29tcGFyZV9uYXQsIG5hdF9vZl9hcnJheVxuZnVuY3Rpb24gZGl2X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIGlmKGxlbjIgPT0gMSkge1xuICAgIGRpdl9kaWdpdF9uYXQobmF0MSwgb2ZzMSsxLCBuYXQxLCBvZnMxLCBuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBzID0gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdDIsIG9mczIrbGVuMi0xKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG5cbiAgdmFyIGQgPSAobmF0Mi5kYXRhW29mczIrbGVuMi0xXSA+Pj4gMCkgKyAxO1xuICB2YXIgYSA9IGNyZWF0ZV9uYXQobGVuMisxKTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IGxlbjI7IGktLSkge1xuICAgIC8vIERlY2VudCBsb3dlciBib3VuZCBvbiBxdW9cbiAgICB2YXIgcXVvID0gZCA9PSA0Mjk0OTY3Mjk2ID8gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSA6IGRpdl9oZWxwZXIoKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSwgKG5hdDEuZGF0YVtvZnMxK2ktMV0gPj4+MCksIGQpWzBdO1xuICAgIHNldF90b196ZXJvX25hdChhLCAwLCBsZW4yKzEpO1xuICAgIG11bHRfZGlnaXRfbmF0KGEsIDAsIGxlbjIrMSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFtxdW9dKSwgMCk7XG4gICAgc3ViX25hdChuYXQxLCBvZnMxK2ktbGVuMiwgbGVuMisxLCBhLCAwLCBsZW4yKzEsIDEpO1xuXG4gICAgd2hpbGUgKG5hdDEuZGF0YVtvZnMxK2ldICE9IDAgfHwgY29tcGFyZV9uYXQobmF0MSwgb2ZzMStpLWxlbjIsIGxlbjIsIG5hdDIsIG9mczIsIGxlbjIpID49IDApIHtcbiAgICAgIHF1byA9IHF1byArIDE7XG4gICAgICBzdWJfbmF0KG5hdDEsIG9mczEraS1sZW4yLCBsZW4yKzEsIG5hdDIsIG9mczIsIGxlbjIsIDEpO1xuICAgIH1cblxuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gcXVvO1xuICB9XG5cbiAgc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjIsIG5hdF9vZl9hcnJheShbMF0pLCAwLCBzKTsgLy8gc2hpZnQgcmVtYWluZGVyXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHJlc3RvcmVcbiAgcmV0dXJuIDA7XG59XG5cblxuLy8gMCA8PSBzaGlmdCA8IDMyXG4vL1Byb3ZpZGVzOiBzaGlmdF9yaWdodF9uYXRcbmZ1bmN0aW9uIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZihuYml0cyA9PSAwKSB7XG4gICAgbmF0Mi5kYXRhW29mczJdID0gMDtcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgd3JhcCA9IDA7XG4gIGZvcih2YXIgaSA9IGxlbjEtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgYSA9IG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwO1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gKGEgPj4+IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPDwgKDMyIC0gbmJpdHMpO1xuICB9XG4gIG5hdDIuZGF0YVtvZnMyXSA9IHdyYXA7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wYXJlX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIGNvbXBhcmVfZGlnaXRzX25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIGlmKG5hdDEuZGF0YVtvZnMxXSA+IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIDE7XG4gIGlmKG5hdDEuZGF0YVtvZnMxXSA8IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY29tcGFyZV9uYXRcbi8vUmVxdWlyZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBjb21wYXJlX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIHZhciBhID0gbnVtX2RpZ2l0c19uYXQobmF0MSwgb2ZzMSwgbGVuMSk7XG4gIHZhciBiID0gbnVtX2RpZ2l0c19uYXQobmF0Miwgb2ZzMiwgbGVuMik7XG4gIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgaWYoYSA8IGIpIHJldHVybiAtMTtcbiAgZm9yKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgPiAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApKSByZXR1cm4gMTtcbiAgICBpZiAoKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSA8IChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkpIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY29tcGFyZV9uYXRfcmVhbFxuLy9SZXF1aXJlczogY29tcGFyZV9uYXRcbmZ1bmN0aW9uIGNvbXBhcmVfbmF0X3JlYWwobmF0MSxuYXQyKXtcbiAgcmV0dXJuIGNvbXBhcmVfbmF0KG5hdDEsMCxuYXQxLmRhdGEubGVuZ3RoLG5hdDIsMCxuYXQyLmRhdGEubGVuZ3RoKTtcbn1cblxuLy9Qcm92aWRlczogbGFuZF9kaWdpdF9uYXRcbmZ1bmN0aW9uIGxhbmRfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdICY9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGxvcl9kaWdpdF9uYXRcbmZ1bmN0aW9uIGxvcl9kaWdpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMikge1xuICBuYXQxLmRhdGFbb2ZzMV0gfD0gbmF0Mi5kYXRhW29mczJdO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbHhvcl9kaWdpdF9uYXRcbmZ1bmN0aW9uIGx4b3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIF49IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogc2VyaWFsaXplX25hdFxuZnVuY3Rpb24gc2VyaWFsaXplX25hdCh3cml0ZXIsIG5hdCwgc3ope1xuICB2YXIgbGVuID0gbmF0LmRhdGEubGVuZ3RoO1xuICB3cml0ZXIud3JpdGUoMzIsIGxlbik7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgd3JpdGVyLndyaXRlKDMyLCBuYXQuZGF0YVtpXSk7XG4gIH1cbiAgc3pbMF0gPSBsZW4gKiA0O1xuICBzelsxXSA9IGxlbiAqIDg7XG59XG5cbi8vUHJvdmlkZXM6IGRlc2VyaWFsaXplX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGRlc2VyaWFsaXplX25hdChyZWFkZXIsIHN6KXtcbiAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBuYXQgPSBuZXcgTWxOYXQobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKXtcbiAgICBuYXQuZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIH1cbiAgc3pbMF0gPSBsZW4gKiA0O1xuICByZXR1cm4gbmF0O1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IEh1Z28gSGV1emFyZFxuXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZVxudmFyIGNhbWxfZ3Jfc3RhdGU7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2dldCgpIHtcbiAgaWYoY2FtbF9ncl9zdGF0ZSkge1xuICAgIHJldHVybiBjYW1sX2dyX3N0YXRlO1xuICB9XG4gIHRocm93IFswLGNhbWxfbmFtZWRfdmFsdWUoXCJHcmFwaGljcy5HcmFwaGljX2ZhaWx1cmVcIiksIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJOb3QgaW5pdGlhbGl6ZWRcIildXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX3NldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZSxjYW1sX2dyX3N0YXRlX2luaXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCkge1xuICBjYW1sX2dyX3N0YXRlPWN0eDtcbiAgY2FtbF9ncl9zdGF0ZV9pbml0KClcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfb3Blbl9ncmFwaFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9vcGVuX2dyYXBoKGluZm8pe1xuICB2YXIgZyA9IGdsb2JhbFRoaXM7XG4gIHZhciBpbmZvID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoaW5mbyk7XG4gIGZ1bmN0aW9uIGdldChuYW1lKXtcbiAgICB2YXIgcmVzID0gaW5mby5tYXRjaChcIihefCwpICpcIituYW1lK1wiICo9ICooW2EtekEtWjAtOV9dKykgKigsfCQpXCIpO1xuICAgIGlmKHJlcykgcmV0dXJuIHJlc1syXTtcbiAgfVxuICB2YXIgc3BlY3MgPSBbXTtcbiAgaWYoIShpbmZvPT1cIlwiKSkgc3BlY3MucHVzaChpbmZvKTtcbiAgdmFyIHRhcmdldCA9IGdldChcInRhcmdldFwiKTtcbiAgaWYoIXRhcmdldCkgdGFyZ2V0PVwiXCI7XG4gIHZhciBzdGF0dXMgPSBnZXQoXCJzdGF0dXNcIik7XG4gIGlmKCFzdGF0dXMpIHNwZWNzLnB1c2goXCJzdGF0dXM9MVwiKVxuXG4gIHZhciB3ID0gZ2V0KFwid2lkdGhcIik7XG4gIHcgPSB3P3BhcnNlSW50KHcpOjIwMDtcbiAgc3BlY3MucHVzaChcIndpZHRoPVwiK3cpO1xuXG4gIHZhciBoID0gZ2V0KFwiaGVpZ2h0XCIpO1xuICBoID0gaD9wYXJzZUludChoKToyMDA7XG4gIHNwZWNzLnB1c2goXCJoZWlnaHQ9XCIraCk7XG5cbiAgdmFyIHdpbiA9IGcub3BlbihcImFib3V0OmJsYW5rXCIsdGFyZ2V0LHNwZWNzLmpvaW4oXCIsXCIpKTtcbiAgaWYoIXdpbikge2NhbWxfZmFpbHdpdGgoXCJHcmFwaGljcy5vcGVuX2dyYXBoOiBjYW5ub3Qgb3BlbiB0aGUgd2luZG93XCIpfVxuICB2YXIgZG9jID0gd2luLmRvY3VtZW50O1xuICB2YXIgY2FudmFzID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNhbnZhcy53aWR0aCA9IHc7XG4gIGNhbnZhcy5oZWlnaHQgPSBoO1xuICB2YXIgY3R4ID0gY2FtbF9ncl9zdGF0ZV9jcmVhdGUoY2FudmFzLHcsaCk7XG4gIGN0eC5zZXRfdGl0bGUgPSBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICBkb2MudGl0bGUgPSB0aXRsZTtcbiAgfTtcbiAgY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KTtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgYm9keS5zdHlsZS5tYXJnaW4gPSBcIjBweFwiO1xuICBib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2luaXRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2NvbG9yLGNhbWxfZ3JfbW92ZXRvLGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zZXRfbGluZV93aWR0aCxjYW1sX2dyX3NldF90ZXh0X3NpemUsY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2luaXQoKXtcbiAgY2FtbF9ncl9tb3ZldG8oY2FtbF9ncl9zdGF0ZS54LGNhbWxfZ3Jfc3RhdGUueSk7XG4gIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyhjYW1sX2dyX3N0YXRlLndpZHRoLGNhbWxfZ3Jfc3RhdGUuaGVpZ2h0KTtcbiAgY2FtbF9ncl9zZXRfbGluZV93aWR0aChjYW1sX2dyX3N0YXRlLmxpbmVfd2lkdGgpO1xuICBjYW1sX2dyX3NldF90ZXh0X3NpemUoY2FtbF9ncl9zdGF0ZS50ZXh0X3NpemUpO1xuICBjYW1sX2dyX3NldF9mb250KGNhbWxfZ3Jfc3RhdGUuZm9udCk7XG4gIGNhbWxfZ3Jfc2V0X2NvbG9yKGNhbWxfZ3Jfc3RhdGUuY29sb3IpO1xuICBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUoY2FtbF9ncl9zdGF0ZS50aXRsZSk7XG4gIC8vY2FtbF9ncl9yZXNpemVfd2luZG93IG1pZ2h0IHJlc2V0IHNvbWUgY2FudmFzJyBwcm9wZXJ0aWVzXG4gIGNhbWxfZ3Jfc3RhdGUuY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcyx3LGgpe1xuICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjYW52YXMgOiBjYW52YXMsXG4gICAgeCA6IDAsXG4gICAgeSA6IDAsXG4gICAgd2lkdGggOiB3LFxuICAgIGhlaWdodCA6IGgsXG4gICAgbGluZV93aWR0aCA6IDEsXG4gICAgZm9udCA6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJmaXhlZFwiKSxcbiAgICB0ZXh0X3NpemUgOiAyNixcbiAgICBjb2xvciA6IDB4MDAwMDAwLFxuICAgIHRpdGxlIDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKVxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RvY19vZl9zdGF0ZVxuZnVuY3Rpb24gY2FtbF9ncl9kb2Nfb2Zfc3RhdGUoc3RhdGUpIHtcbiAgaWYoc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQpXG4gICAgcmV0dXJuIHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Nsb3NlX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbG9zZV9ncmFwaCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gMDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUobmFtZSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy50aXRsZSA9IG5hbWU7XG4gIHZhciBqc25hbWUgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lKTtcbiAgaWYocy5zZXRfdGl0bGUpIHMuc2V0X3RpdGxlKGpzbmFtZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3Jlc2l6ZV93aW5kb3codyxoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpXG4gIHMud2lkdGggPSB3O1xuICBzLmhlaWdodCA9IGg7XG4gIHMuY2FudmFzLndpZHRoID0gdztcbiAgcy5jYW52YXMuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xlYXJfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2NsZWFyX2dyYXBoKCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jYW52YXMud2lkdGggPSBzLndpZHRoO1xuICBzLmNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgLy8gIHMuY29udGV4dC5zdHJva2VSZWN0ICgwLiwgMC4sIHMud2lkdGgsIHMuaGVpZ2h0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3goKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy53aWR0aDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3koKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy5oZWlnaHQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfY29sb3Jcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9jb2xvcihjb2xvcil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgZnVuY3Rpb24gY29udmVydChudW1iZXIpIHtcbiAgICB2YXIgc3RyID0gJycgKyBudW1iZXIudG9TdHJpbmcoMTYpO1xuICAgIHdoaWxlIChzdHIubGVuZ3RoIDwgMikgc3RyID0gJzAnICsgc3RyO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgdmFyXG4gIHIgPSAoY29sb3IgPj4gMTYpICYgMHhmZixcbiAgZyA9IChjb2xvciA+PiA4KSAgJiAweGZmLFxuICBiID0gKGNvbG9yID4+IDApICAmIDB4ZmY7XG4gIHMuY29sb3I9Y29sb3I7XG4gIHZhciBjX3N0ciA9ICcjJyArIGNvbnZlcnQocikgKyBjb252ZXJ0KGcpICsgY29udmVydChiKTtcbiAgcy5jb250ZXh0LmZpbGxTdHlsZSA9ICAgY19zdHI7XG4gIHMuY29udGV4dC5zdHJva2VTdHlsZSA9IGNfc3RyO1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcGxvdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcGxvdCh4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbT1zLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKDEsMSk7XG4gIHZhciBkID0gaW0uZGF0YTtcbiAgdmFyIGNvbG9yID0gcy5jb2xvcjtcbiAgZFswXSA9IChjb2xvciA+PiAxNikgJiAweGZmOyAvL3JcbiAgZFsxXSA9IChjb2xvciA+PiA4KSAgJiAweGZmLCAvL2dcbiAgZFsyXSA9IChjb2xvciA+PiAwKSAgJiAweGZmOyAvL2JcbiAgZFszXSA9IDB4RkY7IC8vYVxuICBzLng9eDtcbiAgcy55PXk7XG4gIHMuY29udGV4dC5wdXRJbWFnZURhdGEoaW0seCxzLmhlaWdodCAtIHkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9wb2ludF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcG9pbnRfY29sb3IoeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW09cy5jb250ZXh0LmdldEltYWdlRGF0YSh4LHMuaGVpZ2h0IC0geSwxLDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHJldHVybiAoZFswXSA8PCAxNikgKyAoZFsxXSA8PCA4KSArIGRbMl07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX21vdmV0b1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfbW92ZXRvKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy54PXg7XG4gIHMueT15O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jdXJyZW50X3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2N1cnJlbnRfeCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLnhcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3koKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy55XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2xpbmV0b1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfbGluZXRvKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKHMueCxzLmhlaWdodCAtIHMueSk7XG4gIHMuY29udGV4dC5saW5lVG8oeCxzLmhlaWdodCAtIHkpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHMueD14O1xuICBzLnk9eTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfcmVjdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19yZWN0KHgseSx3LGgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5zdHJva2VSZWN0KHgscy5oZWlnaHQgLSB5LHcsLWgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2FyY19hdXgoY3R4LGN4LGN5LHJ5LHJ4LGExLGEyKXtcbiAgd2hpbGUoYTE+YTIpIGEyKz0zNjA7XG4gIGExIC89IDE4MDtcbiAgYTIgLz0gMTgwO1xuICB2YXIgcm90ID0gMCx4UG9zLHlQb3MseFBvc19wcmV2LHlQb3NfcHJldjtcbiAgdmFyIHNwYWNlID0gMjtcbiAgdmFyIG51bSA9ICgoKGEyIC0gYTEpICogTWF0aC5QSSAqICgocngrcnkpLzIpKSAvIHNwYWNlKSB8IDA7XG4gIHZhciBkZWx0YSA9IChhMiAtIGExKSAqIE1hdGguUEkgLyBudW07XG4gIHZhciBpID0gYTEgKiBNYXRoLlBJO1xuICBmb3IgKHZhciBqPTA7ajw9bnVtO2orKyl7XG4gICAgeFBvcyA9IGN4IC0gKHJ4ICogTWF0aC5zaW4oaSkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgKyAocnkgKiBNYXRoLmNvcyhpKSkgKiBNYXRoLmNvcyhyb3QgKiBNYXRoLlBJKTtcbiAgICB4UG9zID0geFBvcy50b0ZpeGVkKDIpO1xuICAgIHlQb3MgPSBjeSArIChyeSAqIE1hdGguY29zKGkpKSAqIE1hdGguc2luKHJvdCAqIE1hdGguUEkpICsgKHJ4ICogTWF0aC5zaW4oaSkpICogTWF0aC5jb3Mocm90ICogTWF0aC5QSSk7XG4gICAgeVBvcyA9IHlQb3MudG9GaXhlZCgyKTtcbiAgICBpZiAoaj09MCkge1xuICAgICAgY3R4Lm1vdmVUbyh4UG9zLCB5UG9zKTtcbiAgICB9IGVsc2UgaWYgKHhQb3NfcHJldiE9eFBvcyB8fCB5UG9zX3ByZXYhPXlQb3Mpe1xuICAgICAgY3R4LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICB9XG4gICAgeFBvc19wcmV2PXhQb3M7XG4gICAgeVBvc19wcmV2PXlQb3M7XG4gICAgaS09IGRlbHRhOy8vY2N3XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2FyYyh4LHkscngscnksYTEsYTIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCx4LHMuaGVpZ2h0IC0geSxyeCxyeSxhMSxhMik7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9saW5lX3dpZHRoKHcpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMubGluZV93aWR0aCA9IHc7XG4gIHMuY29udGV4dC5saW5lV2lkdGggPSB3XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcmVjdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9yZWN0KHgseSx3LGgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5maWxsUmVjdCh4LHMuaGVpZ2h0IC0geSx3LC1oKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcG9seVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9wb2x5KGFyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIHMuY29udGV4dC5tb3ZlVG8oYXJbMV1bMV0scy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIGZvcih2YXIgaSA9IDI7IGkgPCBhci5sZW5ndGg7IGkrKylcbiAgICBzLmNvbnRleHQubGluZVRvKGFyW2ldWzFdLHMuaGVpZ2h0IC0gYXJbaV1bMl0pO1xuICBzLmNvbnRleHQubGluZVRvKGFyWzFdWzFdLHMuaGVpZ2h0IC0gYXJbMV1bMl0pO1xuICBzLmNvbnRleHQuZmlsbCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9maWxsX2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX2FyYyh4LHkscngscnksYTEsYTIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCx4LHMuaGVpZ2h0IC0geSxyeCxyeSxhMSxhMik7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfc3RyXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X3N0cihzdHIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBtID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cik7XG4gIHZhciBkeCA9IG0ud2lkdGg7XG4gIHMuY29udGV4dC5maWxsVGV4dChzdHIscy54LHMuaGVpZ2h0IC0gcy55KTtcbiAgcy54ICs9IGR4IHwgMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19jaGFyXG4vL1JlcXVpcmVzOiBjYW1sX2dyX2RyYXdfc3RyXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfY2hhcihjKXtcbiAgY2FtbF9ncl9kcmF3X3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyaW5nKHN0cil7XG4gIGNhbWxfZ3JfZHJhd19zdHIoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoc3RyKSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9mb250XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2ZvbnQoZil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5mb250ID0gZjtcbiAgcy5jb250ZXh0LmZvbnQgPSBzLnRleHRfc2l6ZSArIFwicHggXCIgKyBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzLmZvbnQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X3RleHRfc2l6ZShzaXplKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRleHRfc2l6ZSA9IHNpemU7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfdGV4dF9zaXplKHR4dCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIHcgPSBzLmNvbnRleHQubWVhc3VyZVRleHQoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcodHh0KSkud2lkdGg7XG4gIHJldHVybiBbMCx3LHMudGV4dF9zaXplXTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX21ha2VfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21ha2VfaW1hZ2UoYXJyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaCA9IGFyci5sZW5ndGggLSAxIDtcbiAgdmFyIHcgPSBhcnJbMV0ubGVuZ3RoIC0gMTtcbiAgdmFyIGltID0gcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh3LGgpO1xuICBmb3IodmFyIGk9MDtpPGg7aSsrKXtcbiAgICBmb3IodmFyIGo9MDtqPHc7aisrKXtcbiAgICAgIHZhciBjID0gYXJyW2krMV1baisxXTtcbiAgICAgIHZhciBvID0gaSoodyo0KSArIChqICogNCk7XG4gICAgICBpZihjID09IC0xKSB7XG4gICAgICAgIGltLmRhdGFbbyArIDBdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgMV0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAyXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltLmRhdGFbbyArIDBdID0gYyA+PiAxNiAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDFdID0gYyA+PiAgOCAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gYyA+PiAgMCAmIDBYZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2R1bXBfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2R1bXBfaW1hZ2UoaW0pe1xuICB2YXIgZGF0YSA9IFswXVxuICBmb3IodmFyIGk9MDsgaTxpbS5oZWlnaHQ7aSsrKXtcbiAgICBkYXRhW2krMV0gPSBbMF1cbiAgICBmb3IodmFyIGo9MDsgajxpbS53aWR0aDtqKyspe1xuICAgICAgdmFyIG8gPSBpKihpbS53aWR0aCo0KSArIChqICogNCksXG4gICAgICAgICAgciA9IGltLmRhdGFbbyswXSxcbiAgICAgICAgICBnID0gaW0uZGF0YVtvKzFdLFxuICAgICAgICAgIGIgPSBpbS5kYXRhW28rMl07XG4gICAgICBkYXRhW2krMV1baisxXSA9IChyIDw8IDE2KSArIChnIDw8IDgpICsgYlxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YVxufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2ltYWdlKGltLHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgaWYoIWltLmltYWdlKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gcy53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gcy5oZWlnaHQ7XG4gICAgY2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5wdXRJbWFnZURhdGEoaW0sMCwwKTtcbiAgICB2YXIgaW1hZ2UgPSBuZXcgZ2xvYmFsVGhpcy5JbWFnZSgpO1xuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHMuY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UseCxzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICAgICAgaW0uaW1hZ2UgPSBpbWFnZTtcbiAgICB9XG4gICAgaW1hZ2Uuc3JjID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKTtcbiAgfSBlbHNlIHtcbiAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltLmltYWdlLHgscy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3JlYXRlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jcmVhdGVfaW1hZ2UoeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh4LHkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9ibGl0X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9ibGl0X2ltYWdlKGltLHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltMiA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoeCxzLmhlaWdodCAtIGltLmhlaWdodCAtIHksaW0ud2lkdGgsaW0uaGVpZ2h0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbTIuZGF0YS5sZW5ndGg7IGkrPTQpe1xuICAgIGltLmRhdGFbaV0gPSBpbTIuZGF0YVtpXTtcbiAgICBpbS5kYXRhW2krMV0gPSBpbTIuZGF0YVtpKzFdO1xuICAgIGltLmRhdGFbaSsyXSA9IGltMi5kYXRhW2krMl07XG4gICAgaW0uZGF0YVtpKzNdID0gaW0yLmRhdGFbaSszXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2lnaW9faGFuZGxlclxuZnVuY3Rpb24gY2FtbF9ncl9zaWdpb19oYW5kbGVyKCl7cmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NpZ2lvX3NpZ25hbFxuZnVuY3Rpb24gY2FtbF9ncl9zaWdpb19zaWduYWwoKXtyZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2FpdF9ldmVudFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93YWl0X2V2ZW50KF9ldmwpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93YWl0X2V2ZW50IG5vdCBJbXBsZW1lbnRlZDogdXNlIEdyYXBoaWNzX2pzIGluc3RlYWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3luY2hyb25pemVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3luY2hyb25pemUgKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9zeW5jaHJvbml6ZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3JlbWVtYmVyX21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVtZW1iZXJfbW9kZSAoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX3JlbWVtYmVyX21vZGUgbm90IEltcGxlbWVudGVkXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kaXNwbGF5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfZGlzcGxheV9tb2RlKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9kaXNwbGF5X21vZGUgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3dpbmRvd19pZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93aW5kb3dfaWQoYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93aW5kb3dfaWQgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fc3Vid2luZG93KGEsYixjLGQpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfb3Blbl9zdWJ3aW5kb3cgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Nsb3NlX3N1YndpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3coYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3cgbm90IEltcGxlbWVudGVkXCIpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFyc2hhbF9jb25zdGFudHNcbnZhciBjYW1sX21hcnNoYWxfY29uc3RhbnRzID0ge1xuICBQUkVGSVhfU01BTExfQkxPQ0s6ICAgICAgICAgMHg4MCxcbiAgUFJFRklYX1NNQUxMX0lOVDogICAgICAgICAgIDB4NDAsXG4gIFBSRUZJWF9TTUFMTF9TVFJJTkc6ICAgICAgICAweDIwLFxuICBDT0RFX0lOVDg6ICAgICAgICAgICAgICAgICAgMHgwMCxcbiAgQ09ERV9JTlQxNjogICAgICAgICAgICAgICAgIDB4MDEsXG4gIENPREVfSU5UMzI6ICAgICAgICAgICAgICAgICAweDAyLFxuICBDT0RFX0lOVDY0OiAgICAgICAgICAgICAgICAgMHgwMyxcbiAgQ09ERV9TSEFSRUQ4OiAgICAgICAgICAgICAgIDB4MDQsXG4gIENPREVfU0hBUkVEMTY6ICAgICAgICAgICAgICAweDA1LFxuICBDT0RFX1NIQVJFRDMyOiAgICAgICAgICAgICAgMHgwNixcbiAgQ09ERV9CTE9DSzMyOiAgICAgICAgICAgICAgIDB4MDgsXG4gIENPREVfQkxPQ0s2NDogICAgICAgICAgICAgICAweDEzLFxuICBDT0RFX1NUUklORzg6ICAgICAgICAgICAgICAgMHgwOSxcbiAgQ09ERV9TVFJJTkczMjogICAgICAgICAgICAgIDB4MEEsXG4gIENPREVfRE9VQkxFX0JJRzogICAgICAgICAgICAweDBCLFxuICBDT0RFX0RPVUJMRV9MSVRUTEU6ICAgICAgICAgMHgwQyxcbiAgQ09ERV9ET1VCTEVfQVJSQVk4X0JJRzogICAgIDB4MEQsXG4gIENPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6ICAweDBFLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzogICAgMHgwRixcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6IDB4MDcsXG4gIENPREVfQ09ERVBPSU5URVI6ICAgICAgICAgICAweDEwLFxuICBDT0RFX0lORklYUE9JTlRFUjogICAgICAgICAgMHgxMSxcbiAgQ09ERV9DVVNUT006ICAgICAgICAgICAgICAgIDB4MTIsXG4gIENPREVfQ1VTVE9NX0xFTjogICAgICAgICAgICAweDE4LFxuICBDT0RFX0NVU1RPTV9GSVhFRDogICAgICAgICAgMHgxOVxufVxuXG5cbi8vUHJvdmlkZXM6IE1sU3RyaW5nUmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBNbFN0cmluZ1JlYWRlciAocywgaSkgeyB0aGlzLnMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpOyB0aGlzLmkgPSBpOyB9XG5NbFN0cmluZ1JlYWRlci5wcm90b3R5cGUgPSB7XG4gIHJlYWQ4dTpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnMuY2hhckNvZGVBdCh0aGlzLmkrKyk7IH0sXG4gIHJlYWQ4czpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnMuY2hhckNvZGVBdCh0aGlzLmkrKykgPDwgMjQgPj4gMjQ7IH0sXG4gIHJlYWQxNnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKVxuICB9LFxuICByZWFkMTZzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKHMuY2hhckNvZGVBdChpKSA8PCAyNCA+PiAxNikgfCBzLmNoYXJDb2RlQXQoaSArIDEpO1xuICB9LFxuICByZWFkMzJ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKChzLmNoYXJDb2RlQXQoaSkgPDwgMjQpIHwgKHMuY2hhckNvZGVBdChpKzEpIDw8IDE2KSB8XG4gICAgICAgICAgICAocy5jaGFyQ29kZUF0KGkrMikgPDwgOCkgfCBzLmNoYXJDb2RlQXQoaSszKSkgPj4+IDA7XG4gIH0sXG4gIHJlYWQzMnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDI0KSB8IChzLmNoYXJDb2RlQXQoaSsxKSA8PCAxNikgfFxuICAgICAgKHMuY2hhckNvZGVBdChpKzIpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkrMyk7XG4gIH0sXG4gIHJlYWRzdHI6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXModGhpcy5zLnN1YnN0cmluZyhpLCBpICsgbGVuKSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogQmlnU3RyaW5nUmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheSwgY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gQmlnU3RyaW5nUmVhZGVyIChicywgaSkgeyB0aGlzLnMgPSBiczsgdGhpcy5pID0gaTsgfVxuQmlnU3RyaW5nUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgcmVhZDh1OmZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbWxfYmFfZ2V0XzEodGhpcy5zLHRoaXMuaSsrKTsgfSxcbiAgcmVhZDhzOmZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbWxfYmFfZ2V0XzEodGhpcy5zLHRoaXMuaSsrKSA8PCAyNCA+PiAyNDsgfSxcbiAgcmVhZDE2dTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChjYW1sX2JhX2dldF8xKHMsaSkgPDwgOCkgfCBjYW1sX2JhX2dldF8xKHMsaSArIDEpXG4gIH0sXG4gIHJlYWQxNnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoY2FtbF9iYV9nZXRfMShzLGkpIDw8IDI0ID4+IDE2KSB8IGNhbWxfYmFfZ2V0XzEocyxpICsgMSk7XG4gIH0sXG4gIHJlYWQzMnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKGNhbWxfYmFfZ2V0XzEocyxpKSAgIDw8IDI0KSB8IChjYW1sX2JhX2dldF8xKHMsaSsxKSA8PCAxNikgfFxuICAgICAgICAgICAgKGNhbWxfYmFfZ2V0XzEocyxpKzIpIDw8IDgpICB8IGNhbWxfYmFfZ2V0XzEocyxpKzMpICAgICAgICAgKSA+Pj4gMDtcbiAgfSxcbiAgcmVhZDMyczpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuIChjYW1sX2JhX2dldF8xKHMsaSkgICA8PCAyNCkgfCAoY2FtbF9iYV9nZXRfMShzLGkrMSkgPDwgMTYpIHxcbiAgICAgIChjYW1sX2JhX2dldF8xKHMsaSsyKSA8PCA4KSAgfCBjYW1sX2JhX2dldF8xKHMsaSszKTtcbiAgfSxcbiAgcmVhZHN0cjpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdmFyIGFyciA9IG5ldyBBcnJheShsZW4pXG4gICAgZm9yKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKXtcbiAgICAgIGFycltqXSA9IGNhbWxfYmFfZ2V0XzEodGhpcy5zLCBpK2opO1xuICAgIH1cbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShhcnIpO1xuICB9XG59XG5cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMsIGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKGEpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyAoY2FtbF9pbnQ2NF9vZl9ieXRlcyAoYSkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IE1sU3RyaW5nUmVhZGVyLCBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fc3RyaW5nKHMsb2ZzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgTWxTdHJpbmdSZWFkZXIgKHMsIHR5cGVvZiBvZnM9PVwibnVtYmVyXCI/b2ZzOm9mc1swXSk7XG4gIHJldHVybiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyKHJlYWRlciwgb2ZzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMgbXV0YWJsZVxuLy9SZXF1aXJlczogTWxTdHJpbmdSZWFkZXIsIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIsIGNhbWxfc3RyaW5nX29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMocyxvZnMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBNbFN0cmluZ1JlYWRlciAoY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocyksIHR5cGVvZiBvZnM9PVwibnVtYmVyXCI/b2ZzOm9mc1swXSk7XG4gIHJldHVybiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyKHJlYWRlciwgb2ZzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gIHNpemVbMF0gPSA4O1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyAodCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9tYXJzaGFsKHdyaXRlciwgdiwgc2l6ZXMpIHtcbiAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzICh2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlci53cml0ZSAoOCwgYltpXSk7XG4gIHNpemVzWzBdID0gODsgc2l6ZXNbMV0gPSA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX3VubWFyc2hhbFxuZnVuY3Rpb24gY2FtbF9pbnQzMl91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgc2l6ZVswXSA9IDQ7XG4gIHJldHVybiByZWFkZXIucmVhZDMycyAoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgc3dpdGNoIChyZWFkZXIucmVhZDh1ICgpKSB7XG4gIGNhc2UgMTpcbiAgICBzaXplWzBdID0gNDtcbiAgICByZXR1cm4gcmVhZGVyLnJlYWQzMnMgKCk7XG4gIGNhc2UgMjpcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IG5hdGl2ZSBpbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZVwiKTtcbiAgZGVmYXVsdDogY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbGwtZm9ybWVkIG5hdGl2ZSBpbnRlZ2VyXCIpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF91bm1hcnNoYWwsIGNhbWxfaW50NjRfbWFyc2hhbCwgY2FtbF9pbnQ2NF9jb21wYXJlLCBjYW1sX2ludDY0X2hhc2hcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsLCBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfYmFfc2VyaWFsaXplLCBjYW1sX2JhX2Rlc2VyaWFsaXplLCBjYW1sX2JhX2NvbXBhcmUsIGNhbWxfYmFfaGFzaFxudmFyIGNhbWxfY3VzdG9tX29wcyA9XG4gICAge1wiX2pcIjoge1xuICAgICAgZGVzZXJpYWxpemUgOiBjYW1sX2ludDY0X3VubWFyc2hhbCxcbiAgICAgIHNlcmlhbGl6ZSAgOiBjYW1sX2ludDY0X21hcnNoYWwsXG4gICAgICBmaXhlZF9sZW5ndGggOiA4LFxuICAgICAgY29tcGFyZSA6IGNhbWxfaW50NjRfY29tcGFyZSxcbiAgICAgIGhhc2ggOiBjYW1sX2ludDY0X2hhc2hcbiAgICB9LFxuICAgICBcIl9pXCI6IHtcbiAgICAgICBkZXNlcmlhbGl6ZSA6IGNhbWxfaW50MzJfdW5tYXJzaGFsLFxuICAgICAgIGZpeGVkX2xlbmd0aCA6IDQsXG4gICAgIH0sXG4gICAgIFwiX25cIjoge1xuICAgICAgIGRlc2VyaWFsaXplIDogY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsLFxuICAgICAgIGZpeGVkX2xlbmd0aCA6IDQsXG4gICAgIH0sXG4gICAgIFwiX2JpZ2FycmF5XCI6e1xuICAgICAgIGRlc2VyaWFsaXplIDogKGZ1bmN0aW9uIChyZWFkZXIsIHN6KSB7cmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUgKHJlYWRlcixzeixcIl9iaWdhcnJheVwiKX0pLFxuICAgICAgIHNlcmlhbGl6ZSA6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgICAgIGNvbXBhcmUgOiBjYW1sX2JhX2NvbXBhcmUsXG4gICAgICAgaGFzaDogY2FtbF9iYV9oYXNoLFxuICAgICB9LFxuICAgICBcIl9iaWdhcnIwMlwiOntcbiAgICAgICBkZXNlcmlhbGl6ZSA6IChmdW5jdGlvbiAocmVhZGVyLCBzeikge3JldHVybiBjYW1sX2JhX2Rlc2VyaWFsaXplIChyZWFkZXIsc3osXCJfYmlnYXJyMDJcIil9KSxcbiAgICAgICBzZXJpYWxpemUgOiBjYW1sX2JhX3NlcmlhbGl6ZSxcbiAgICAgICBjb21wYXJlIDogY2FtbF9iYV9jb21wYXJlLFxuICAgICAgIGhhc2g6IGNhbWxfYmFfaGFzaCxcbiAgICAgfVxuICAgIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2Zsb2F0X29mX2J5dGVzLCBjYW1sX2N1c3RvbV9vcHNcblxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIsIG9mcykge1xuICB2YXIgX21hZ2ljID0gcmVhZGVyLnJlYWQzMnUgKClcbiAgdmFyIF9ibG9ja19sZW4gPSByZWFkZXIucmVhZDMydSAoKTtcbiAgdmFyIG51bV9vYmplY3RzID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gIHZhciBfc2l6ZV8zMiA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICB2YXIgX3NpemVfNjQgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gKG51bV9vYmplY3RzID4gMCk/W106bnVsbDtcbiAgdmFyIG9ial9jb3VudGVyID0gMDtcbiAgZnVuY3Rpb24gaW50ZXJuX3JlYyAoKSB7XG4gICAgdmFyIGNvZGUgPSByZWFkZXIucmVhZDh1ICgpO1xuICAgIGlmIChjb2RlID49IDB4NDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovKSB7XG4gICAgICBpZiAoY29kZSA+PSAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovKSB7XG4gICAgICAgIHZhciB0YWcgPSBjb2RlICYgMHhGO1xuICAgICAgICB2YXIgc2l6ZSA9IChjb2RlID4+IDQpICYgMHg3O1xuICAgICAgICB2YXIgdiA9IFt0YWddO1xuICAgICAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gdjtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gKGNvZGUgJiAweDNGKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvZGUgPj0gMHgyMC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcgKi8pIHtcbiAgICAgICAgdmFyIGxlbiA9IGNvZGUgJiAweDFGO1xuICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyIChsZW4pO1xuICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKGNvZGUpIHtcbiAgICAgICAgY2FzZSAweDAwOiAvL2NzdC5DT0RFX0lOVDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkOHMgKCk7XG4gICAgICAgIGNhc2UgMHgwMTogLy9jc3QuQ09ERV9JTlQxNjpcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQxNnMgKCk7XG4gICAgICAgIGNhc2UgMHgwMjogLy9jc3QuQ09ERV9JTlQzMjpcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQzMnMgKCk7XG4gICAgICAgIGNhc2UgMHgwMzogLy9jc3QuQ09ERV9JTlQ2NDpcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGludGVnZXIgdG9vIGxhcmdlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MDQ6IC8vY3N0LkNPREVfU0hBUkVEODpcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlciAtIG9mZnNldF07XG4gICAgICAgIGNhc2UgMHgwNTogLy9jc3QuQ09ERV9TSEFSRUQxNjpcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZGVyLnJlYWQxNnUgKCk7XG4gICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIgLSBvZmZzZXRdO1xuICAgICAgICBjYXNlIDB4MDY6IC8vY3N0LkNPREVfU0hBUkVEMzI6XG4gICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyIC0gb2Zmc2V0XTtcbiAgICAgICAgY2FzZSAweDA4OiAvL2NzdC5DT0RFX0JMT0NLMzI6XG4gICAgICAgICAgdmFyIGhlYWRlciA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgICAgICAgIHZhciB0YWcgPSBoZWFkZXIgJiAweEZGO1xuICAgICAgICAgIHZhciBzaXplID0gaGVhZGVyID4+IDEwO1xuICAgICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIHY7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgxMzogLy9jc3QuQ09ERV9CTE9DSzY0OlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGRhdGEgYmxvY2sgdG9vIGxhcmdlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MDk6IC8vY3N0LkNPREVfU1RSSU5HODpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIgKGxlbik7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEE6IC8vY3N0LkNPREVfU1RSSU5HMzI6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgICAgdmFyIHYgPSByZWFkZXIucmVhZHN0ciAobGVuKTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwQzogLy9jc3QuQ09ERV9ET1VCTEVfTElUVExFOlxuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgODtpKyspIHRbNyAtIGldID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBCOiAvL2NzdC5DT0RFX0RPVUJMRV9CSUc6XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCA4O2krKykgdFtpXSA9IHJlYWRlci5yZWFkOHUgKCk7XG4gICAgICAgICAgdmFyIHYgPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwRTogLy9jc3QuQ09ERV9ET1VCTEVfQVJSQVk4X0xJVFRMRTpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbNyAtIGpdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBEOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfQklHOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuKzEpO1xuICAgICAgICAgIHZbMF0gPSAyNTQ7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTtpIDw9IGxlbjtpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHYgW2ldID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MDc6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZMzJfTElUVExFOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbNyAtIGpdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBGOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICB2YXIgdiA9IG5ldyBBcnJheShsZW4rMSk7XG4gICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2IFtpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDEwOiAvL2NzdC5DT0RFX0NPREVQT0lOVEVSOlxuICAgICAgICBjYXNlIDB4MTE6IC8vY3N0LkNPREVfSU5GSVhQT0lOVEVSOlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGNvZGUgcG9pbnRlclwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDEyOiAvL2NzdC5DT0RFX0NVU1RPTTpcbiAgICAgICAgY2FzZSAweDE4OiAvL2NzdC5DT0RFX0NVU1RPTV9MRU46XG4gICAgICAgIGNhc2UgMHgxOTogLy9jc3QuQ09ERV9DVVNUT01fRklYRUQ6XG4gICAgICAgICAgdmFyIGMsIHMgPSBcIlwiO1xuICAgICAgICAgIHdoaWxlICgoYyA9IHJlYWRlci5yZWFkOHUgKCkpICE9IDApIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSAoYyk7XG4gICAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tzXTtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRfc2l6ZTtcbiAgICAgICAgICBpZighb3BzKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB1bmtub3duIGN1c3RvbSBibG9jayBpZGVudGlmaWVyXCIpO1xuICAgICAgICAgIHN3aXRjaChjb2RlKXtcbiAgICAgICAgICBjYXNlIDB4MTI6IC8vIGNzdC5DT0RFX0NVU1RPTSAoZGVwcmVjYXRlZClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgxOTogLy8gY3N0LkNPREVfQ1VTVE9NX0ZJWEVEXG4gICAgICAgICAgICBpZighb3BzLmZpeGVkX2xlbmd0aClcbiAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBleHBlY3RlZCBhIGZpeGVkLXNpemUgY3VzdG9tIGJsb2NrXCIpO1xuICAgICAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IG9wcy5maXhlZF9sZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MTg6IC8vIGNzdC5DT0RFX0NVU1RPTV9MRU5cbiAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICAgICAgICAgIC8vIFNraXAgc2l6ZTY0XG4gICAgICAgICAgICByZWFkZXIucmVhZDMycygpOyByZWFkZXIucmVhZDMycygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvbGRfcG9zID0gcmVhZGVyLmk7XG4gICAgICAgICAgdmFyIHNpemUgPSBbMF07XG4gICAgICAgICAgdmFyIHYgPSBvcHMuZGVzZXJpYWxpemUocmVhZGVyLCBzaXplKTtcbiAgICAgICAgICBpZihleHBlY3RlZF9zaXplICE9IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICBpZihleHBlY3RlZF9zaXplICE9IHNpemVbMF0pXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaW5jb3JyZWN0IGxlbmd0aCBvZiBzZXJpYWxpemVkIGN1c3RvbSBibG9ja1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGlsbC1mb3JtZWQgbWVzc2FnZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgcmVzID0gaW50ZXJuX3JlYyAoKTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgc2l6ZSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB2ID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGQgPSB2Lmxlbmd0aDtcbiAgICBpZiAoZCA8IHNpemUpIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgdltkXSA9IGludGVybl9yZWMgKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBvZnMhPVwibnVtYmVyXCIpIG9mc1swXSA9IHJlYWRlci5pO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfZGF0YV9zaXplIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSAocywgb2ZzKSB7XG4gIGZ1bmN0aW9uIGdldDMyKHMsaSkge1xuICAgIHJldHVybiAoY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpIDw8IDI0KSB8XG4gICAgICAoY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkgKyAxKSA8PCAxNikgfFxuICAgICAgKGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMikgPDwgOCkgfFxuICAgICAgY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkgKyAzKTtcbiAgfVxuICBpZiAoZ2V0MzIocywgb2ZzKSAhPSAoMHg4NDk1QTZCRXwwKSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IGJhZCBvYmplY3RcIik7XG4gIHJldHVybiAoZ2V0MzIocywgb2ZzICsgNCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE9iamVjdFRhYmxlXG52YXIgTWxPYmplY3RUYWJsZTtcbmlmICh0eXBlb2YgZ2xvYmFsVGhpcy5XZWFrTWFwID09PSAndW5kZWZpbmVkJykge1xuICBNbE9iamVjdFRhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgLyogcG9seWZpbGwgKHVzaW5nIGxpbmVhciBzZWFyY2gpICovXG4gICAgZnVuY3Rpb24gTmFpdmVMb29rdXAob2JqcykgeyB0aGlzLm9ianMgPSBvYmpzOyB9XG4gICAgTmFpdmVMb29rdXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9ianNbaV0gPT09IHYpIHJldHVybiBpO1xuICAgICAgfVxuICAgIH07XG4gICAgTmFpdmVMb29rdXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gRG8gbm90aGluZyBoZXJlLiBbTWxPYmplY3RUYWJsZS5zdG9yZV0gd2lsbCBwdXNoIHRvIFt0aGlzLm9ianNdIGRpcmVjdGx5LlxuICAgIH07XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gTWxPYmplY3RUYWJsZSgpIHtcbiAgICAgIHRoaXMub2JqcyA9IFtdOyB0aGlzLmxvb2t1cCA9IG5ldyBOYWl2ZUxvb2t1cCh0aGlzLm9ianMpO1xuICAgIH07XG4gIH0oKTtcbn1cbmVsc2Uge1xuICBNbE9iamVjdFRhYmxlID0gZnVuY3Rpb24gTWxPYmplY3RUYWJsZSgpIHtcbiAgICB0aGlzLm9ianMgPSBbXTsgdGhpcy5sb29rdXAgPSBuZXcgZ2xvYmFsVGhpcy5XZWFrTWFwKCk7XG4gIH07XG59XG5cbk1sT2JqZWN0VGFibGUucHJvdG90eXBlLnN0b3JlID0gZnVuY3Rpb24odikge1xuICB0aGlzLmxvb2t1cC5zZXQodiwgdGhpcy5vYmpzLmxlbmd0aCk7XG4gIHRoaXMub2Jqcy5wdXNoKHYpO1xufVxuXG5NbE9iamVjdFRhYmxlLnByb3RvdHlwZS5yZWNhbGwgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBpID0gdGhpcy5sb29rdXAuZ2V0KHYpO1xuICByZXR1cm4gKGkgPT09IHVuZGVmaW5lZClcbiAgICA/IHVuZGVmaW5lZCA6IHRoaXMub2Jqcy5sZW5ndGggLSBpOyAgIC8qIGluZGV4IGlzIHJlbGF0aXZlICovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGVnYWN5X2N1c3RvbV9jb2RlXG4vL1ZlcnNpb246ID49IDQuMDhcbnZhciBjYW1sX2xlZ2FjeV9jdXN0b21fY29kZSA9IGZhbHNlXG5cbi8vUHJvdmlkZXM6IGNhbWxfbGVnYWN5X2N1c3RvbV9jb2RlXG4vL1ZlcnNpb246IDwgNC4wOFxudmFyIGNhbWxfbGVnYWN5X2N1c3RvbV9jb2RlID0gdHJ1ZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9tbF9ieXRlc19sZW5ndGgsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogTWxPYmplY3RUYWJsZSwgY2FtbF9saXN0X3RvX2pzX2FycmF5LCBjYW1sX2xlZ2FjeV9jdXN0b21fY29kZSwgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xudmFyIGNhbWxfb3V0cHV0X3ZhbCA9IGZ1bmN0aW9uICgpe1xuICBmdW5jdGlvbiBXcml0ZXIgKCkgeyB0aGlzLmNodW5rID0gW107IH1cbiAgV3JpdGVyLnByb3RvdHlwZSA9IHtcbiAgICBjaHVua19pZHg6MjAsIGJsb2NrX2xlbjowLCBvYmpfY291bnRlcjowLCBzaXplXzMyOjAsIHNpemVfNjQ6MCxcbiAgICB3cml0ZTpmdW5jdGlvbiAoc2l6ZSwgdmFsdWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODtpID49IDA7aSAtPSA4KVxuICAgICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX2F0OmZ1bmN0aW9uIChwb3MsIHNpemUsIHZhbHVlKSB7XG4gICAgICB2YXIgcG9zID0gcG9zO1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4O2kgPj0gMDtpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbcG9zKytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX2NvZGU6ZnVuY3Rpb24gKHNpemUsIGNvZGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gY29kZTtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODtpID49IDA7aSAtPSA4KVxuICAgICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX3NoYXJlZDpmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICBpZiAob2Zmc2V0IDwgKDEgPDwgOCkpIHRoaXMud3JpdGVfY29kZSg4LCAweDA0IC8qY3N0LkNPREVfU0hBUkVEOCovLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAob2Zmc2V0IDwgKDEgPDwgMTYpKSB0aGlzLndyaXRlX2NvZGUoMTYsIDB4MDUgLypjc3QuQ09ERV9TSEFSRUQxNiovLCBvZmZzZXQpO1xuICAgICAgZWxzZSB0aGlzLndyaXRlX2NvZGUoMzIsIDB4MDYgLypjc3QuQ09ERV9TSEFSRUQzMiovLCBvZmZzZXQpO1xuICAgIH0sXG4gICAgcG9zOmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2h1bmtfaWR4IH0sXG4gICAgZmluYWxpemU6ZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5ibG9ja19sZW4gPSB0aGlzLmNodW5rX2lkeCAtIDIwO1xuICAgICAgdGhpcy5jaHVua19pZHggPSAwO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIDB4ODQ5NUE2QkUpO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMuYmxvY2tfbGVuKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLm9ial9jb3VudGVyKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLnNpemVfMzIpO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMuc2l6ZV82NCk7XG4gICAgICByZXR1cm4gdGhpcy5jaHVuaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICh2LCBmbGFncykge1xuICAgIGZsYWdzID0gY2FtbF9saXN0X3RvX2pzX2FycmF5KGZsYWdzKTtcblxuICAgIHZhciBub19zaGFyaW5nID0gKGZsYWdzLmluZGV4T2YoMCAvKk1hcnNoYWwuTm9fc2hhcmluZyovKSAhPT0gLTEpLFxuICAgICAgICBjbG9zdXJlcyA9ICAoZmxhZ3MuaW5kZXhPZigxIC8qTWFyc2hhbC5DbG9zdXJlcyovKSAhPT0gLTEpO1xuICAgIC8qIE1hcnNoYWwuQ29tcGF0XzMyIGlzIHJlZHVuZGFudCBzaW5jZSBpbnRlZ2VycyBhcmUgMzItYml0IGFueXdheSAqL1xuXG4gICAgaWYgKGNsb3N1cmVzKVxuICAgICAgZ2xvYmFsVGhpcy5jb25zb2xlLndhcm4oXCJpbiBjYW1sX291dHB1dF92YWw6IGZsYWcgTWFyc2hhbC5DbG9zdXJlcyBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcblxuICAgIHZhciB3cml0ZXIgPSBuZXcgV3JpdGVyICgpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gbm9fc2hhcmluZyA/IG51bGwgOiBuZXcgTWxPYmplY3RUYWJsZSgpO1xuXG4gICAgZnVuY3Rpb24gbWVtbyh2KSB7XG4gICAgICBpZiAobm9fc2hhcmluZykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV4aXN0aW5nX29mZnNldCA9IGludGVybl9vYmpfdGFibGUucmVjYWxsKHYpO1xuICAgICAgaWYgKGV4aXN0aW5nX29mZnNldCkgeyB3cml0ZXIud3JpdGVfc2hhcmVkKGV4aXN0aW5nX29mZnNldCk7IHJldHVybiB0cnVlOyB9XG4gICAgICBlbHNlIHsgaW50ZXJuX29ial90YWJsZS5zdG9yZSh2KTsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZXJuX3JlYyAodikge1xuICAgICAgaWYgKHYuY2FtbF9jdXN0b20pIHtcbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIG5hbWUgPSB2LmNhbWxfY3VzdG9tO1xuICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW25hbWVdO1xuICAgICAgICB2YXIgc3pfMzJfNjQgPSBbMCwwXTtcbiAgICAgICAgaWYoIW9wcy5zZXJpYWxpemUpXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwib3V0cHV0X3ZhbHVlOiBhYnN0cmFjdCB2YWx1ZSAoQ3VzdG9tKVwiKTtcbiAgICAgICAgaWYoY2FtbF9sZWdhY3lfY3VzdG9tX2NvZGUpIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MTIgLypjc3QuQ09ERV9DVVNUT00qLyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICBvcHMuc2VyaWFsaXplKHdyaXRlciwgdiwgc3pfMzJfNjQpO1xuICAgICAgICB9IGVsc2UgaWYob3BzLmZpeGVkX2xlbmd0aCA9PSB1bmRlZmluZWQpe1xuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgxOCAvKmNzdC5DT0RFX0NVU1RPTV9MRU4qLyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgaGVhZGVyX3BvcyA9IHdyaXRlci5wb3MgKCk7XG4gICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcywgMzIsIHN6XzMyXzY0WzBdKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDQsIDMyLCAwKTsgLy8gemVyb1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgOCwgMzIsIHN6XzMyXzY0WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MTkgLypjc3QuQ09ERV9DVVNUT01fRklYRUQqLyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgb2xkX3BvcyA9IHdyaXRlci5wb3MoKTtcbiAgICAgICAgICBvcHMuc2VyaWFsaXplKHdyaXRlciwgdiwgc3pfMzJfNjQpO1xuICAgICAgICAgIGlmIChvcHMuZml4ZWRfbGVuZ3RoICE9IHdyaXRlci5wb3MoKSAtIG9sZF9wb3MpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBpbmNvcnJlY3QgZml4ZWQgc2l6ZXMgc3BlY2lmaWVkIGJ5IFwiICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnNpemVfMzIgKz0gMiArICgoc3pfMzJfNjRbMF0gKyAzKSA+PiAyKTtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gMiArICgoc3pfMzJfNjRbMV0gKyA3KSA+PiAzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBBcnJheSAmJiB2WzBdID09PSAodlswXXwwKSkge1xuICAgICAgICBpZiAodlswXSA9PSAyNTEpIHtcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBhYnN0cmFjdCB2YWx1ZSAoQWJzdHJhY3QpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEgJiYgbWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICBpZiAodlswXSA8IDE2ICYmIHYubGVuZ3RoIC0gMSA8IDgpXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovICsgdlswXSArICgodi5sZW5ndGggLSAxKTw8NCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDggLypjc3QuQ09ERV9CTE9DSzMyKi8sICgodi5sZW5ndGgtMSkgPDwgMTApIHwgdlswXSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IHYubGVuZ3RoO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSB2Lmxlbmd0aDtcbiAgICAgICAgaWYgKHYubGVuZ3RoID4gMSkgc3RhY2sucHVzaCAodiwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgICAgaWYoIShjYW1sX2lzX21sX2J5dGVzKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIikpKSkge1xuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IFtCeXRlcy50XSBjYW5ub3Qgc2FmZWx5IGJlIG1hcnNoYWxlZCB3aXRoIFstLWVuYWJsZSB1c2UtanMtc3RyaW5nXVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9ieXRlc19sZW5ndGgodik7XG4gICAgICAgIGlmIChsZW4gPCAweDIwKVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgyMCAvKmNzdC5QUkVGSVhfU01BTExfU1RSSU5HKi8gKyBsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPCAweDEwMClcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoOCwgMHgwOS8qY3N0LkNPREVfU1RSSU5HOCovLCBsZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUgKDMyLCAweDBBIC8qY3N0LkNPREVfU1RSSU5HMzIqLywgbGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGxlbjtpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQodixpKSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDEgKyAoKChsZW4gKyA0KSAvIDQpfDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KXwwKTtcbiAgICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcodikpIHtcbiAgICAgICAgdmFyIGxlbiA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlICg4LCAweDA5Lypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoMzIsIDB4MEEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuO2krKylcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQodixpKSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDEgKyAoKChsZW4gKyA0KSAvIDQpfDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KXwwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2ICE9ICh2fDApKXtcbiAgICAgICAgICB2YXIgdHlwZV9vZl92ID0gdHlwZW9mIHY7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZiBhIGZsb2F0IGhhcHBlbnMgdG8gYmUgYW4gaW50ZWdlciBpdCBpcyBzZXJpYWxpemVkIGFzIGFuIGludGVnZXJcbiAgICAgICAgICAvLyAoSnNfb2Zfb2NhbWwgY2Fubm90IHRlbGwgd2hldGhlciB0aGUgdHlwZSBvZiBhbiBpbnRlZ2VyIG51bWJlciBpc1xuICAgICAgICAgIC8vIGZsb2F0IG9yIGludGVnZXIuKSBUaGlzIGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBjcmFzaGVzIHdoZW5cbiAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIHVzaW5nIHRoZSBzdGFuZGFyZCBydW50aW1lLiBJdCBzZWVtcyBiZXR0ZXIgdG9cbiAgICAgICAgICAvLyBzeXN0ZW1hdGljYWxseSBmYWlsIG9uIG1hcnNoYWxsaW5nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICAgICAgICAgaWYodHlwZV9vZl92ICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKFwiK3R5cGVfb2ZfditcIilcIik7XG4gICAgICAgICAgLy8gICAgICAgICAgdmFyIHQgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh2KSk7XG4gICAgICAgICAgLy8gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDBCIC8qY3N0LkNPREVfRE9VQkxFX0JJRyovKTtcbiAgICAgICAgICAvLyAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpPDg7IGkrKyl7d3JpdGVyLndyaXRlKDgsdFtpXSl9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA+PSAwICYmIHYgPCAweDQwKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAwWDQwIC8qY3N0LlBSRUZJWF9TTUFMTF9JTlQqLyArIHYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2ID49IC0oMSA8PCA3KSAmJiB2IDwgKDEgPDwgNykpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSg4LCAweDAwIC8qY3N0LkNPREVfSU5UOCovLCB2KTtcbiAgICAgICAgICBlbHNlIGlmICh2ID49IC0oMSA8PCAxNSkgJiYgdiA8ICgxIDw8IDE1KSlcbiAgICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDE2LCAweDAxIC8qY3N0LkNPREVfSU5UMTYqLywgdik7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDIgLypjc3QuQ09ERV9JTlQzMiovLCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5fcmVjICh2KTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGkgPSBzdGFjay5wb3AgKCk7XG4gICAgICB2YXIgdiA9IHN0YWNrLnBvcCAoKTtcbiAgICAgIGlmIChpICsgMSA8IHYubGVuZ3RoKSBzdGFjay5wdXNoICh2LCBpICsgMSk7XG4gICAgICBleHRlcm5fcmVjICh2W2ldKTtcbiAgICB9XG4gICAgaWYgKGludGVybl9vYmpfdGFibGUpIHdyaXRlci5vYmpfY291bnRlciA9IGludGVybl9vYmpfdGFibGUub2Jqcy5sZW5ndGg7XG4gICAgd3JpdGVyLmZpbmFsaXplKCk7XG4gICAgcmV0dXJuIHdyaXRlci5jaHVuaztcbiAgfVxufSAoKTtcblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyAodiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5IChjYW1sX291dHB1dF92YWwgKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9ieXRlc19vZl9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXMgKHYsIGZsYWdzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX2FycmF5IChjYW1sX291dHB1dF92YWwgKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2JsaXRfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlciAocywgb2ZzLCBsZW4sIHYsIGZsYWdzKSB7XG4gIHZhciB0ID0gY2FtbF9vdXRwdXRfdmFsICh2LCBmbGFncyk7XG4gIGlmICh0Lmxlbmd0aCA+IGxlbikgY2FtbF9mYWlsd2l0aCAoXCJNYXJzaGFsLnRvX2J1ZmZlcjogYnVmZmVyIG92ZXJmbG93XCIpO1xuICBjYW1sX2JsaXRfYnl0ZXModCwgMCwgcywgb2ZzLCB0Lmxlbmd0aCk7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBJb1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jbG9zZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9zeXNfY2xvc2UoZmQpIHtcbiAgZGVsZXRlIGNhbWxfZ2xvYmFsX2RhdGEuZmRzW2ZkXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RkX291dHB1dFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX3N0ZF9vdXRwdXQoY2hhbmlkLHMpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIHN0ciA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG4gIHZhciBzbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHN0cik7XG4gIGNoYW4uZmlsZS53cml0ZShjaGFuLm9mZnNldCwgc3RyLCAwLCBzbGVuKTtcbiAgY2hhbi5vZmZzZXQgKz0gc2xlbjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX2dsb2JhbF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9ieXRlcyxNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBqc19wcmludF9zdGRlcnIsIGpzX3ByaW50X3N0ZG91dFxuLy9SZXF1aXJlczogY2FtbF9zdGRfb3V0cHV0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChpZHgsb3V0cHV0LGZpbGUsZmxhZ3MpIHtcbiAgaWYoY2FtbF9nbG9iYWxfZGF0YS5mZHMgPT09IHVuZGVmaW5lZCkgY2FtbF9nbG9iYWxfZGF0YS5mZHMgPSBuZXcgQXJyYXkoKTtcbiAgZmxhZ3M9ZmxhZ3M/ZmxhZ3M6e307XG4gIHZhciBpbmZvID0ge307XG4gIGluZm8uZmlsZSA9IGZpbGU7XG4gIGluZm8ub2Zmc2V0ID0gZmxhZ3MuYXBwZW5kP2ZpbGUubGVuZ3RoKCk6MDtcbiAgaW5mby5mbGFncyA9IGZsYWdzO1xuICBpbmZvLm91dHB1dCA9IG91dHB1dDtcbiAgY2FtbF9nbG9iYWxfZGF0YS5mZHNbaWR4XSA9IGluZm87XG4gIGlmKCFjYW1sX2dsb2JhbF9kYXRhLmZkX2xhc3RfaWR4IHx8IGlkeCA+IGNhbWxfZ2xvYmFsX2RhdGEuZmRfbGFzdF9pZHgpXG4gICAgY2FtbF9nbG9iYWxfZGF0YS5mZF9sYXN0X2lkeCA9IGlkeDtcbiAgcmV0dXJuIGlkeDtcbn1cbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW4gKG5hbWUsIGZsYWdzLCBfcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUoZmxhZ3Mpe1xuICAgIHN3aXRjaChmbGFnc1sxXSl7XG4gICAgY2FzZSAwOiBmLnJkb25seSA9IDE7YnJlYWs7XG4gICAgY2FzZSAxOiBmLndyb25seSA9IDE7YnJlYWs7XG4gICAgY2FzZSAyOiBmLmFwcGVuZCA9IDE7YnJlYWs7XG4gICAgY2FzZSAzOiBmLmNyZWF0ZSA9IDE7YnJlYWs7XG4gICAgY2FzZSA0OiBmLnRydW5jYXRlID0gMTticmVhaztcbiAgICBjYXNlIDU6IGYuZXhjbCA9IDE7IGJyZWFrO1xuICAgIGNhc2UgNjogZi5iaW5hcnkgPSAxO2JyZWFrO1xuICAgIGNhc2UgNzogZi50ZXh0ID0gMTticmVhaztcbiAgICBjYXNlIDg6IGYubm9uYmxvY2sgPSAxO2JyZWFrO1xuICAgIH1cbiAgICBmbGFncz1mbGFnc1syXTtcbiAgfVxuICBpZihmLnJkb25seSAmJiBmLndyb25seSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3Jkb25seSBhbmQgT3Blbl93cm9ubHkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICBpZihmLnRleHQgJiYgZi5iaW5hcnkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl90ZXh0IGFuZCBPcGVuX2JpbmFyeSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBmaWxlID0gcm9vdC5kZXZpY2Uub3Blbihyb290LnJlc3QsZik7XG4gIHZhciBpZHggPSBjYW1sX2dsb2JhbF9kYXRhLmZkX2xhc3RfaWR4P2NhbWxfZ2xvYmFsX2RhdGEuZmRfbGFzdF9pZHg6MDtcbiAgcmV0dXJuIGNhbWxfc3lzX29wZW5faW50ZXJuYWwgKGlkeCsxLGNhbWxfc3RkX291dHB1dCxmaWxlLGYpO1xufVxuY2FtbF9zeXNfb3Blbl9pbnRlcm5hbCgwLGNhbWxfc3RkX291dHB1dCwgbmV3IE1sRmFrZUZpbGUoY2FtbF9jcmVhdGVfYnl0ZXMoMCkpKTsgLy9zdGRpblxuY2FtbF9zeXNfb3Blbl9pbnRlcm5hbCgxLGpzX3ByaW50X3N0ZG91dCwgbmV3IE1sRmFrZUZpbGUoY2FtbF9jcmVhdGVfYnl0ZXMoMCkpKTsgLy9zdGRvdXRcbmNhbWxfc3lzX29wZW5faW50ZXJuYWwoMixqc19wcmludF9zdGRlcnIsIG5ldyBNbEZha2VGaWxlKGNhbWxfY3JlYXRlX2J5dGVzKDApKSk7IC8vc3RkZXJyXG5cblxuLy8gb2NhbWwgQ2hhbm5lbHNcblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX25hbWUoKSB7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbHNcbnZhciBjYW1sX21sX2NoYW5uZWxzID0gbmV3IEFycmF5KCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3QgKCkge1xuICB2YXIgbCA9IDA7XG4gIGZvcih2YXIgYyA9IDA7IGMgPCBjYW1sX21sX2NoYW5uZWxzLmxlbmd0aDsgYysrKXtcbiAgICBpZihjYW1sX21sX2NoYW5uZWxzW2NdICYmIGNhbWxfbWxfY2hhbm5lbHNbY10ub3BlbmVkICYmIGNhbWxfbWxfY2hhbm5lbHNbY10ub3V0KVxuICAgICAgbD1bMCxjYW1sX21sX2NoYW5uZWxzW2NdLmZkLGxdO1xuICB9XG4gIHJldHVybiBsO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9nbG9iYWxfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCAoZmQpIHtcbiAgdmFyIGRhdGEgPSBjYW1sX2dsb2JhbF9kYXRhLmZkc1tmZF07XG4gIGlmKGRhdGEuZmxhZ3MucmRvbmx5KSBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiKyBmZCArIFwiIGlzIHJlYWRvbmx5XCIpO1xuICB2YXIgY2hhbm5lbCA9IHtcbiAgICBmaWxlOmRhdGEuZmlsZSxcbiAgICBvZmZzZXQ6ZGF0YS5vZmZzZXQsXG4gICAgZmQ6ZmQsXG4gICAgb3BlbmVkOnRydWUsXG4gICAgb3V0OnRydWUsXG4gICAgYnVmZmVyOlwiXCJcbiAgfTtcbiAgY2FtbF9tbF9jaGFubmVsc1tjaGFubmVsLmZkXT1jaGFubmVsO1xuICByZXR1cm4gY2hhbm5lbC5mZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5cbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsY2FtbF9zeXNfb3BlbixjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWQsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiAoZmQpICB7XG4gIHZhciBkYXRhID0gY2FtbF9nbG9iYWxfZGF0YS5mZHNbZmRdO1xuICBpZihkYXRhLmZsYWdzLndyb25seSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIisgZmQgKyBcIiBpcyB3cml0ZW9ubHlcIik7XG4gIHZhciByZWZpbGwgPSBudWxsO1xuICBpZihmZCA9PSAwICYmIGZzX25vZGVfc3VwcG9ydGVkKCkpe1xuICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgcmVmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGZzLnJlYWRGaWxlU3luYygwLCAndXRmOCcpKX07XG4gIH1cbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTpkYXRhLmZpbGUsXG4gICAgb2Zmc2V0OmRhdGEub2Zmc2V0LFxuICAgIGZkOmZkLFxuICAgIG9wZW5lZDp0cnVlLFxuICAgIG91dDogZmFsc2UsXG4gICAgcmVmaWxsOnJlZmlsbFxuICB9O1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5uZWwuZmRdPWNoYW5uZWw7XG4gIHJldHVybiBjaGFubmVsLmZkO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY2hhbm5lbF9kZXNjcmlwdG9yXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhLCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvcihjaGFuaWQpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNoYW4uZmQ7XG59XG5cbi8vUHJvdmlkZXM6IHdpbl9maWxlZGVzY3Jfb2ZfY2hhbm5lbFxuLy9SZXF1aXJlczogY2FtbF9jaGFubmVsX2Rlc2NyaXB0b3JcbnZhciB3aW5fZmlsZWRlc2NyX29mX2NoYW5uZWwgPSBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvclxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUoY2hhbmlkLG1vZGUpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIGRhdGEgPSBjYW1sX2dsb2JhbF9kYXRhLmZkc1tjaGFuLmZkXTtcbiAgZGF0YS5mbGFncy50ZXh0ID0gIW1vZGVcbiAgZGF0YS5mbGFncy5iaW5hcnkgPSBtb2RlXG4gIHJldHVybiAwO1xufVxuXG4vL0lucHV0IGZyb20gaW5fY2hhbm5lbFxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2Nsb3NlX2NoYW5uZWxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsIGNhbWxfbWxfY2hhbm5lbHNcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Nsb3NlXG5mdW5jdGlvbiBjYW1sX21sX2Nsb3NlX2NoYW5uZWwgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICBjaGFuLm9wZW5lZCA9IGZhbHNlO1xuICBjaGFuLmZpbGUuY2xvc2UoKTtcbiAgY2FtbF9zeXNfY2xvc2UoY2hhbi5mZClcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjaGFuLmZpbGUubGVuZ3RoKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2Zsb2F0LGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9zaXplXzY0KGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2hhbi5maWxlLmxlbmd0aCAoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dChjaGFuaWQsZikge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2FtbF9nbG9iYWxfZGF0YS5mZHNbY2hhbi5mZF0ub3V0cHV0ID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbChjaGFuaWQsZikge1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF0ucmVmaWxsID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcmVmaWxsX2lucHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfbWxfcmVmaWxsX2lucHV0IChjaGFuKSB7XG4gIHZhciBzdHIgPSBjaGFuLnJlZmlsbCgpO1xuICB2YXIgc3RyX2xlbiA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzdHIpO1xuICBpZiAoc3RyX2xlbiA9PSAwKSBjaGFuLnJlZmlsbCA9IG51bGw7XG4gIGNoYW4uZmlsZS53cml0ZShjaGFuLmZpbGUubGVuZ3RoKCksIHN0ciwgMCwgc3RyX2xlbik7XG4gIHJldHVybiBzdHJfbGVuO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX21heV9yZWZpbGxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfcmVmaWxsX2lucHV0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX21heV9yZWZpbGxfaW5wdXQgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYgKGNoYW4ucmVmaWxsID09IG51bGwpIHJldHVybjtcbiAgaWYgKGNoYW4uZmlsZS5sZW5ndGgoKSAhPSBjaGFuLm9mZnNldCkgcmV0dXJuO1xuICBjYW1sX21sX3JlZmlsbF9pbnB1dCAoY2hhbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfcmVmaWxsX2lucHV0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0IChjaGFuaWQsIHMsIGksIGwpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHZhciBsMiA9IGNoYW4uZmlsZS5sZW5ndGgoKSAtIGNoYW4ub2Zmc2V0O1xuICBpZiAobDIgPT0gMCAmJiBjaGFuLnJlZmlsbCAhPSBudWxsKSBsMiA9IGNhbWxfbWxfcmVmaWxsX2lucHV0KGNoYW4pO1xuICBpZiAobDIgPCBsKSBsID0gbDI7XG4gIGNoYW4uZmlsZS5yZWFkKGNoYW4ub2Zmc2V0LCBzLCBpLCBsKTtcbiAgY2hhbi5vZmZzZXQgKz0gbDtcbiAgcmV0dXJuIGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUsIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcywgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWUgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcblxuICB2YXIgYnVmID0gY2FtbF9jcmVhdGVfYnl0ZXMoOCk7XG4gIGNoYW4uZmlsZS5yZWFkKGNoYW4ub2Zmc2V0LGJ1ZiwwLDgpO1xuXG4gIC8vIEhlYWRlciBpcyAyMCBieXRlc1xuICB2YXIgbGVuID0gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSAoYnVmLCAwKSArIDIwO1xuXG4gIHZhciBidWYgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICBjaGFuLmZpbGUucmVhZChjaGFuLm9mZnNldCxidWYsMCxsZW4pO1xuXG4gIHZhciBvZmZzZXQgPSBbMF07XG4gIHZhciByZXMgPSBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMoYnVmLCBvZmZzZXQpO1xuICBjaGFuLm9mZnNldCA9IGNoYW4ub2Zmc2V0ICsgb2Zmc2V0WzBdO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfbWF5X3JlZmlsbF9pbnB1dCwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9jaGFyIChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNhbWxfbWxfbWF5X3JlZmlsbF9pbnB1dChjaGFuaWQpO1xuICBpZiAoY2hhbi5vZmZzZXQgPj0gY2hhbi5maWxlLmxlbmd0aCgpKVxuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgdmFyIHJlcyA9IGNoYW4uZmlsZS5yZWFkX29uZShjaGFuLm9mZnNldCk7XG4gIGNoYW4ub2Zmc2V0Kys7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX21sX3JlZmlsbF9pbnB1dCwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9pbnQgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIGZpbGUgPSBjaGFuLmZpbGU7XG4gIHdoaWxlICgoY2hhbi5vZmZzZXQgKyAzKSA+PSBmaWxlLmxlbmd0aCgpKSB7XG4gICAgdmFyIGwgPSBjYW1sX21sX3JlZmlsbF9pbnB1dChjaGFuKTtcbiAgICBpZiAobCA9PSAwKSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIH1cbiAgdmFyIG8gPSBjaGFuLm9mZnNldDtcbiAgdmFyIHIgPShmaWxlLnJlYWRfb25lKG8gICkgPDwgMjQpXG4gICAgICB8ICAoZmlsZS5yZWFkX29uZShvKzEpIDw8IDE2KVxuICAgICAgfCAgKGZpbGUucmVhZF9vbmUobysyKSA8PCA4KVxuICAgICAgfCAgKGZpbGUucmVhZF9vbmUobyszKSk7XG4gIGNoYW4ub2Zmc2V0Kz00O1xuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZWVrX2luXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luKGNoYW5pZCxwb3Mpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYgKGNoYW4ucmVmaWxsICE9IG51bGwpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiSWxsZWdhbCBzZWVrXCIpO1xuICBjaGFuLm9mZnNldCA9IHBvcztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19pbl82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19mbG9hdCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19pbl82NChjaGFuaWQscG9zKXtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGlmIChjaGFuLnJlZmlsbCAhPSBudWxsKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIklsbGVnYWwgc2Vla1wiKTtcbiAgY2hhbi5vZmZzZXQgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW4oY2hhbmlkKSB7cmV0dXJuIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5vZmZzZXR9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2Zsb2F0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbl82NChjaGFuaWQpIHtyZXR1cm4gY2FtbF9pbnQ2NF9vZl9mbG9hdChjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF0ub2Zmc2V0KX1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfbWF5X3JlZmlsbF9pbnB1dCwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUoY2hhbmlkKXtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNhbWxfbWxfbWF5X3JlZmlsbF9pbnB1dChjaGFuaWQpO1xuICB2YXIgcCA9IGNoYW4ub2Zmc2V0O1xuICB2YXIgbGVuID0gY2hhbi5maWxlLmxlbmd0aCgpO1xuICBpZihwID49IGxlbikgeyByZXR1cm4gMDt9XG4gIHdoaWxlKHRydWUpIHtcbiAgICBpZihwID49IGxlbikgcmV0dXJuIC0gKHAgLSBjaGFuLm9mZnNldCk7XG4gICAgaWYoY2hhbi5maWxlLnJlYWRfb25lKHApID09IDEwKSByZXR1cm4gcCAtIGNoYW4ub2Zmc2V0ICsgMTtcbiAgICBwKys7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9mbHVzaFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYoISBjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgaWYoIWNoYW4uYnVmZmVyIHx8IGNoYW4uYnVmZmVyID09IFwiXCIpIHJldHVybiAwO1xuICBpZihjaGFuLmZkXG4gICAgICYmIGNhbWxfZ2xvYmFsX2RhdGEuZmRzW2NoYW4uZmRdXG4gICAgICYmIGNhbWxfZ2xvYmFsX2RhdGEuZmRzW2NoYW4uZmRdLm91dHB1dCkge1xuICAgIHZhciBvdXRwdXQgPSBjYW1sX2dsb2JhbF9kYXRhLmZkc1tjaGFuLmZkXS5vdXRwdXQ7XG4gICAgc3dpdGNoKG91dHB1dC5sZW5ndGgpe1xuICAgIGNhc2UgMjogb3V0cHV0KGNoYW5pZCxjaGFuLmJ1ZmZlcik7YnJlYWs7XG4gICAgZGVmYXVsdDogb3V0cHV0KGNoYW4uYnVmZmVyKVxuICAgIH07XG4gIH1cbiAgY2hhbi5idWZmZXIgPSBcIlwiO1xuICByZXR1cm4gMDtcbn1cblxuLy9vdXRwdXQgdG8gb3V0X2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N0cmluZ19vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLGJ1ZmZlcixvZmZzZXQsbGVuKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBpZighIGNoYW4ub3BlbmVkKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIkNhbm5vdCBvdXRwdXQgdG8gYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgdmFyIGJ5dGVzO1xuICBpZihvZmZzZXQgPT0gMCAmJiBjYW1sX21sX2J5dGVzX2xlbmd0aChidWZmZXIpID09IGxlbilcbiAgICBieXRlcyA9IGJ1ZmZlcjtcbiAgZWxzZSB7XG4gICAgYnl0ZXMgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhidWZmZXIsb2Zmc2V0LGJ5dGVzLDAsbGVuKTtcbiAgfVxuICB2YXIgc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfYnl0ZXMoYnl0ZXMpO1xuICB2YXIganNzdHJpbmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHN0cmluZyk7XG4gIHZhciBpZCA9IGpzc3RyaW5nLmxhc3RJbmRleE9mKFwiXFxuXCIpO1xuICBpZihpZCA8IDApXG4gICAgY2hhbi5idWZmZXIrPWpzc3RyaW5nO1xuICBlbHNlIHtcbiAgICBjaGFuLmJ1ZmZlcis9anNzdHJpbmcuc3Vic3RyKDAsaWQrMSk7XG4gICAgY2FtbF9tbF9mbHVzaCAoY2hhbmlkKTtcbiAgICBjaGFuLmJ1ZmZlciArPSBqc3N0cmluZy5zdWJzdHIoaWQrMSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxidWZmZXIsb2Zmc2V0LGxlbil7XG4gIHJldHVybiBjYW1sX21sX291dHB1dF9ieXRlcyhjaGFuaWQsY2FtbF9ieXRlc19vZl9zdHJpbmcoYnVmZmVyKSxvZmZzZXQsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2NoYXIgKGNoYW5pZCxjKSB7XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLHMsMCwxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcsIGNhbWxfbWxfb3V0cHV0LGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWUgKGNoYW5pZCx2LGZsYWdzKSB7XG4gIHZhciBzID0gY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nKHYsIGZsYWdzKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLHMsMCxjYW1sX21sX3N0cmluZ19sZW5ndGgocykpO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX21sX2ZsdXNoXG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0KGNoYW5pZCxwb3Mpe1xuICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5vZmZzZXQgPSBwb3M7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2Zsb2F0LCBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX21sX2ZsdXNoXG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0XzY0KGNoYW5pZCxwb3Mpe1xuICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5vZmZzZXQgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX291dChjaGFuaWQpIHtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdLm9mZnNldFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX291dF82NChjaGFuaWQpIHtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9mbG9hdCAoY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdLm9mZnNldCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9pbnQgKGNoYW5pZCxpKSB7XG4gIHZhciBhcnIgPSBbKGk+PjI0KSAmIDB4RkYsKGk+PjE2KSAmIDB4RkYsKGk+PjgpICYgMHhGRixpICYgMHhGRiBdO1xuICB2YXIgcyA9IGNhbWxfc3RyaW5nX29mX2FycmF5KGFycik7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxzLDAsNCk7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaXNfYnVmZmVyZWRcbmZ1bmN0aW9uIGNhbWxfbWxfaXNfYnVmZmVyZWQoYykgeyByZXR1cm4gMSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2J1ZmZlcmVkXG5mdW5jdGlvbiBjYW1sX21sX3NldF9idWZmZXJlZChjLHYpIHsgcmV0dXJuIDAgfVxuIiwiXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWlub3JcbmZ1bmN0aW9uIGNhbWxfZ2NfbWlub3IoKXsgcmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX21ham9yKCl7IHJldHVybiAwfVxuLy9Qcm92aWRlczogY2FtbF9nY19mdWxsX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX2Z1bGxfbWFqb3IoKXsgcmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvbXBhY3Rpb25cbmZ1bmN0aW9uIGNhbWxfZ2NfY29tcGFjdGlvbigpeyByZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY291bnRlcnNcbmZ1bmN0aW9uIGNhbWxfZ2NfY291bnRlcnMoKSB7IHJldHVybiBbMjU0LDAsMCwwXSB9XG4vL1Byb3ZpZGVzOiBjYW1sX2djX3F1aWNrX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2NfcXVpY2tfc3RhdCgpe1xuICByZXR1cm4gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc3RhdFxuZnVuY3Rpb24gY2FtbF9nY19zdGF0KCkge1xuICByZXR1cm4gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19zZXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc2V0KF9jb250cm9sKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX2dldFxuZnVuY3Rpb24gY2FtbF9nY19nZXQoKXtcbiAgcmV0dXJuIFswLDAsMCwwLDAsMCwwLDAsMF1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3NldFxuZnVuY3Rpb24gY2FtbF9tZW1wcm9mX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maW5hbF9yZWdpc3RlciBjb25zdFxuZnVuY3Rpb24gY2FtbF9maW5hbF9yZWdpc3RlciAoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlICgpIHsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVsZWFzZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9maW5hbF9yZWxlYXNlICgpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RhcnQocmF0ZSxzdGFja19zaXplLHRyYWNrZXIpe1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0b3BcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdG9wKHVuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcmVzdW1lXG5mdW5jdGlvbiBjYW1sX2V2ZW50bG9nX3Jlc3VtZSh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcGF1c2VcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcGF1c2UodW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX2h1Z2VfZmFsbGJhY2tfY291bnRcbmZ1bmN0aW9uIGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudCh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWFqb3Jfc2xpY2VcbmZ1bmN0aW9uIGNhbWxfZ2NfbWFqb3Jfc2xpY2Uod29yaykgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yX3dvcmRzXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yX3dvcmRzKHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWlub3JfZnJlZVxuZnVuY3Rpb24gY2FtbF9nZXRfbWlub3JfZnJlZSh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X21ham9yX2J1Y2tldFxuZnVuY3Rpb24gY2FtbF9nZXRfbWFqb3JfYnVja2V0KG4pIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfY3JlZGl0XG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9jcmVkaXQobikgeyByZXR1cm4gMDsgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmQsIEFuZHkgUmF5XG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4vL1xuLy8gQmlnYXJyYXkuXG4vL1xuLy8gLSBhbGwgYmlnYXJyYXkgdHlwZXMgaW5jbHVkaW5nIEludDY0IGFuZCBDb21wbGV4LlxuLy8gLSBmb3J0cmFuICsgYyBsYXlvdXRzXG4vLyAtIHN1Yi9zbGljZS9yZXNoYXBlXG4vLyAtIHJldGFpbiBmYXN0IHBhdGggZm9yIDFkIGFycmF5IGFjY2Vzc1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2luaXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfYmFfaW5pdCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSB7XG4gIHZhciBuX2RpbXMgPSBkaW1zLmxlbmd0aDtcbiAgdmFyIHNpemUgPSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5fZGltczsgaSsrKSB7XG4gICAgaWYgKGRpbXNbaV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiBuZWdhdGl2ZSBkaW1lbnNpb25cIik7XG4gICAgc2l6ZSA9IHNpemUgKiBkaW1zW2ldO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpe1xuICBzd2l0Y2goa2luZCl7XG4gIGNhc2UgNzogY2FzZSAxMDogY2FzZSAxMTogcmV0dXJuIDI7XG4gIGRlZmF1bHQ6IHJldHVybiAxO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgc2l6ZSl7XG4gIHZhciBnID0gZ2xvYmFsVGhpcztcbiAgdmFyIHZpZXc7XG4gIHN3aXRjaChraW5kKXtcbiAgY2FzZSAwOiAgdmlldyA9IGcuRmxvYXQzMkFycmF5OyBicmVhaztcbiAgY2FzZSAxOiAgdmlldyA9IGcuRmxvYXQ2NEFycmF5OyBicmVhaztcbiAgY2FzZSAyOiAgdmlldyA9IGcuSW50OEFycmF5OyBicmVhaztcbiAgY2FzZSAzOiAgdmlldyA9IGcuVWludDhBcnJheTsgYnJlYWs7XG4gIGNhc2UgNDogIHZpZXcgPSBnLkludDE2QXJyYXk7IGJyZWFrO1xuICBjYXNlIDU6ICB2aWV3ID0gZy5VaW50MTZBcnJheTsgYnJlYWs7XG4gIGNhc2UgNjogIHZpZXcgPSBnLkludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDc6ICB2aWV3ID0gZy5JbnQzMkFycmF5OyBicmVhaztcbiAgY2FzZSA4OiAgdmlldyA9IGcuSW50MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgOTogIHZpZXcgPSBnLkludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDEwOiB2aWV3ID0gZy5GbG9hdDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDExOiB2aWV3ID0gZy5GbG9hdDY0QXJyYXk7IGJyZWFrO1xuICBjYXNlIDEyOiB2aWV3ID0gZy5VaW50OEFycmF5OyBicmVhaztcbiAgfVxuICBpZiAoIXZpZXcpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmNyZWF0ZTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgdmFyIGRhdGEgPSBuZXcgdmlldyhzaXplICogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2N1c3RvbV9uYW1lXG4vL1ZlcnNpb246IDwgNC4xMVxudmFyIGNhbWxfYmFfY3VzdG9tX25hbWUgPSBcIl9iaWdhcnJheVwiXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbi8vVmVyc2lvbjogPj0gNC4xMVxudmFyIGNhbWxfYmFfY3VzdG9tX25hbWUgPSBcIl9iaWdhcnIwMlwiXG5cbi8vUHJvdmlkZXM6IE1sX0JpZ2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfY3VzdG9tX25hbWVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpLCBjYW1sX2ludDY0X2hpMzIsIGNhbWxfaW50NjRfbG8zMlxuZnVuY3Rpb24gTWxfQmlnYXJyYXkgKGtpbmQsIGxheW91dCwgZGltcywgYnVmZmVyKSB7XG5cbiAgdGhpcy5raW5kICAgPSBraW5kIDtcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMuZGltcyAgID0gZGltcztcbiAgdGhpcy5kYXRhID0gYnVmZmVyO1xufVxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuY2FtbF9jdXN0b20gPSBjYW1sX2JhX2N1c3RvbV9uYW1lO1xuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKGFyZykge1xuICB2YXIgb2ZzID0gMDtcbiAgaWYodHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIikgYXJnID0gW2FyZ107XG4gIGlmICghIChhcmcgaW5zdGFuY2VvZiBBcnJheSkpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImJpZ2FycmF5LmpzOiBpbnZhbGlkIG9mZnNldFwiKTtcbiAgaWYgKHRoaXMuZGltcy5sZW5ndGggIT0gYXJnLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5nZXQvc2V0OiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIGlmKHRoaXMubGF5b3V0ID09IDAgLyogY19sYXlvdXQgKi8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFyZ1tpXSA8IDAgfHwgYXJnW2ldID49IHRoaXMuZGltc1tpXSlcbiAgICAgICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICAgICAgb2ZzID0gKG9mcyAqIHRoaXMuZGltc1tpXSkgKyBhcmdbaV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmRpbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChhcmdbaV0gPCAxIHx8IGFyZ1tpXSA+IHRoaXMuZGltc1tpXSl7XG4gICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIG9mcyA9IChvZnMgKiB0aGlzLmRpbXNbaV0pICsgKGFyZ1tpXSAtIDEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2ZzO1xufVxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9mcykge1xuICBzd2l0Y2godGhpcy5raW5kKXtcbiAgY2FzZSA3OlxuICAgIC8vIEludDY0XG4gICAgdmFyIGwgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgIHZhciBoID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkobCxoKTtcbiAgY2FzZSAxMDogY2FzZSAxMTpcbiAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgIHZhciByID0gdGhpcy5kYXRhW29mcyAqIDIgKyAwXTtcbiAgICB2YXIgaSA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgcmV0dXJuIFsyNTQsIHIsIGldO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiB0aGlzLmRhdGFbb2ZzXVxuICB9XG59XG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob2ZzLHYpIHtcbiAgc3dpdGNoKHRoaXMua2luZCl7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgdGhpcy5kYXRhW29mcyAqIDIgKyAxXSA9IGNhbWxfaW50NjRfaGkzMih2KTtcbiAgICBicmVhaztcbiAgY2FzZSAxMDogY2FzZSAxMTpcbiAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSB2WzFdO1xuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSB2WzJdO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRoaXMuZGF0YVtvZnNdID0gdjtcbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gMFxufVxuXG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKHYpIHtcbiAgc3dpdGNoKHRoaXMua2luZCl7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIHZhciBhID0gY2FtbF9pbnQ2NF9sbzMyKHYpO1xuICAgIHZhciBiID0gY2FtbF9pbnQ2NF9oaTMyKHYpO1xuICAgIGlmKGEgPT0gYil7XG4gICAgICB0aGlzLmRhdGEuZmlsbChhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHRoaXMuZGF0YVtpXSA9IChpJTIgPT0gMCkgPyBhIDogYjtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IGNhc2UgMTE6XG4gICAgLy8gQ29tcGxleDMyLCBDb21wbGV4NjRcbiAgICB2YXIgaW0gPSB2WzFdO1xuICAgIHZhciByZSA9IHZbMl07XG4gICAgaWYoaW0gPT0gcmUpe1xuICAgICAgdGhpcy5kYXRhLmZpbGwoaW0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGk8dGhpcy5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdGhpcy5kYXRhW2ldID0gKGklMiA9PSAwKSA/IGltIDogcmU7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRoaXMuZGF0YS5maWxsKHYpO1xuICAgIGJyZWFrO1xuICB9XG59XG5cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAoYiwgdG90YWwpIHtcbiAgaWYgKHRoaXMubGF5b3V0ICE9IGIubGF5b3V0IHx8IHRoaXMua2luZCAhPSBiLmtpbmQpIHtcbiAgICB2YXIgazEgPSB0aGlzLmtpbmQgfCAodGhpcy5sYXlvdXQgPDwgOCk7XG4gICAgdmFyIGsyID0gICAgYi5raW5kIHwgKGIubGF5b3V0IDw8IDgpO1xuICAgIHJldHVybiBrMiAtIGsxO1xuICB9XG4gIGlmICh0aGlzLmRpbXMubGVuZ3RoICE9IGIuZGltcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYi5kaW1zLmxlbmd0aCAtIHRoaXMuZGltcy5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgaWYgKHRoaXMuZGltc1tpXSAhPSBiLmRpbXNbaV0pXG4gICAgICByZXR1cm4gKHRoaXMuZGltc1tpXSA8IGIuZGltc1tpXSkgPyAtMSA6IDE7XG4gIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICBjYXNlIDEwOlxuICBjYXNlIDExOlxuICAgIC8vIEZsb2F0c1xuICAgIHZhciB4LCB5O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB4ID0gdGhpcy5kYXRhW2ldO1xuICAgICAgeSA9IGIuZGF0YVtpXTtcbiAgICAgIGlmICh4IDwgeSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHggPiB5KVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmICh4ICE9IHkpIHtcbiAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgaWYgKHggPT0geCkgcmV0dXJuIDE7XG4gICAgICAgIGlmICh5ID09IHkpIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSs9Mikge1xuICAgICAgLy8gQ2hlY2sgaGlnaGVzdCBiaXRzIGZpcnN0XG4gICAgICBpZiAodGhpcy5kYXRhW2krMV0gPCBiLmRhdGFbaSsxXSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuZGF0YVtpKzFdID4gYi5kYXRhW2krMV0pXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgaWYgKCh0aGlzLmRhdGFbaV0gPj4+IDApIDwgKGIuZGF0YVtpXSA+Pj4gMCkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICgodGhpcy5kYXRhW2ldID4+PiAwKSA+IChiLmRhdGFbaV0gPj4+IDApKVxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMjpcbiAgY2FzZSAzOlxuICBjYXNlIDQ6XG4gIGNhc2UgNTpcbiAgY2FzZSA2OlxuICBjYXNlIDg6XG4gIGNhc2UgOTpcbiAgY2FzZSAxMjpcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZGF0YVtpXSA8IGIuZGF0YVtpXSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuZGF0YVtpXSA+IGIuZGF0YVtpXSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBNbF9CaWdhcnJheV9jXzFfMVxuLy9SZXF1aXJlczogTWxfQmlnYXJyYXksIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gTWxfQmlnYXJyYXlfY18xXzEoa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcbiAgdGhpcy5raW5kICAgPSBraW5kIDtcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMuZGltcyAgID0gZGltcztcbiAgdGhpcy5kYXRhICAgPSBidWZmZXI7XG59XG5cbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZSA9IG5ldyBNbF9CaWdhcnJheSgpXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKGFyZykge1xuICBpZih0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKXtcbiAgICBpZigoYXJnIGluc3RhbmNlb2YgQXJyYXkpICYmIGFyZy5sZW5ndGggPT0gMSlcbiAgICAgIGFyZyA9IGFyZ1swXTtcbiAgICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIk1sX0JpZ2FycmF5X2NfMV8xLm9mZnNldFwiKTtcbiAgfVxuICBpZiAoYXJnIDwgMCB8fCBhcmcgPj0gdGhpcy5kaW1zWzBdKVxuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFyZztcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChvZnMpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YVtvZnNdO1xufVxuXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG9mcyx2KSB7XG4gIHRoaXMuZGF0YVtvZnNdID0gdjtcbiAgcmV0dXJuIDBcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAodikge1xuICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jb21wYXJlXG5mdW5jdGlvbiBjYW1sX2JhX2NvbXBhcmUoYSxiLHRvdGFsKXtcbiAgcmV0dXJuIGEuY29tcGFyZShiLHRvdGFsKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBNbF9CaWdhcnJheV9jXzFfMSwgY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKXtcbiAgdmFyIHNpemVfcGVyX2VsZW1lbnQgPSBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpO1xuICBpZihjYW1sX2JhX2dldF9zaXplKGRpbXMpICogc2l6ZV9wZXJfZWxlbWVudCAhPSBkYXRhLmxlbmd0aCkge1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImxlbmd0aCBkb2Vzbid0IG1hdGNoIGRpbXNcIik7XG4gIH1cbiAgaWYobGF5b3V0ID09IDAgJiYgLy8gY19sYXlvdXRcbiAgICAgZGltcy5sZW5ndGggPT0gMSAmJiAvLyBBcnJheTFcbiAgICAgc2l6ZV9wZXJfZWxlbWVudCA9PSAxKSAvLyAxLXRvLTEgbWFwcGluZ1xuICAgIHJldHVybiBuZXcgTWxfQmlnYXJyYXlfY18xXzEoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgcmV0dXJuIG5ldyBNbF9CaWdhcnJheShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xuXG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlKGtpbmQsIGxheW91dCwgZGltc19tbCkge1xuICB2YXIgZGltcyA9IGNhbWxfanNfZnJvbV9hcnJheShkaW1zX21sKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfY2hhbmdlX2xheW91dChiYSwgbGF5b3V0KSB7XG4gIGlmKGJhLmxheW91dCA9PSBsYXlvdXQpIHJldHVybiBiYTtcbiAgdmFyIG5ld19kaW1zID0gW11cbiAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspIG5ld19kaW1zW2ldID0gYmEuZGltc1tiYS5kaW1zLmxlbmd0aCAtIGkgLSAxXTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBsYXlvdXQsIG5ld19kaW1zLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kXG5mdW5jdGlvbiBjYW1sX2JhX2tpbmQoYmEpIHtcbiAgcmV0dXJuIGJhLmtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbGF5b3V0XG5mdW5jdGlvbiBjYW1sX2JhX2xheW91dChiYSkge1xuICByZXR1cm4gYmEubGF5b3V0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX251bV9kaW1zXG5mdW5jdGlvbiBjYW1sX2JhX251bV9kaW1zKGJhKSB7XG4gIHJldHVybiBiYS5kaW1zLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1cbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9kaW0oYmEsIGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuZGltXCIpO1xuICByZXR1cm4gYmEuZGltc1tpXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fMVxuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzEoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAwKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fMlxuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzIoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fM1xuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzMoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfZ2VuZXJpY1xuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9nZW5lcmljKGJhLCBpKSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoY2FtbF9qc19mcm9tX2FycmF5KGkpKTtcbiAgcmV0dXJuIGJhLmdldChvZnMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDE2KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMSA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBiYS5nZXQob2ZzKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcyArIDEpO1xuICByZXR1cm4gKGIxIHwgKGIyIDw8IDgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQzMihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDMgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyswKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcysxKTtcbiAgdmFyIGIzID0gYmEuZ2V0KG9mcysyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyszKTtcbiAgcmV0dXJuICggKGIxIDw8IDApICB8XG4gICAgICAgICAgIChiMiA8PCA4KSAgfFxuICAgICAgICAgICAoYjMgPDwgMTYpIHxcbiAgICAgICAgICAgKGI0IDw8IDI0KSApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDY0KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgNyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBiYS5nZXQob2ZzKzApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzKzEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzKzIpO1xuICB2YXIgYjQgPSBiYS5nZXQob2ZzKzMpO1xuICB2YXIgYjUgPSBiYS5nZXQob2ZzKzQpO1xuICB2YXIgYjYgPSBiYS5nZXQob2ZzKzUpO1xuICB2YXIgYjcgPSBiYS5nZXQob2ZzKzYpO1xuICB2YXIgYjggPSBiYS5nZXQob2ZzKzcpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbYjgsYjcsYjYsYjUsYjQsYjMsYjIsYjFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMShiYSwgaTApIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoaTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMihiYSwgaTAsIGkxKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCxpMV0pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfM1xuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMyhiYSwgaTAsIGkxLCBpMikge1xuICByZXR1cm4gYmEuZ2V0KGJhLm9mZnNldChbaTAsaTEsaTJdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfZ2VuZXJpYyhiYSwgaSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSksIHYpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDE2KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMSA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzKzAsICB2ICAgICAgICAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzEsICh2ID4+PiA4KSAmIDB4ZmYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQzMihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDMgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgYmEuc2V0KG9mcyswLCAgdiAgICAgICAgICYgMHhmZik7XG4gIGJhLnNldChvZnMrMSwgKHYgPj4+IDgpICAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzIsICh2ID4+PiAxNikgJiAweGZmKTtcbiAgYmEuc2V0KG9mcyszLCAodiA+Pj4gMjQpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDY0KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgNyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgdiA9IGNhbWxfaW50NjRfdG9fYnl0ZXModik7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA4OyBpKyspIGJhLnNldChvZnMraSwgdls3LWldKVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfMShiYSwgaTAsIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChpMCksIHYpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8yXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8yKGJhLCBpMCwgaTEsIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChbaTAsaTFdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8zXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8zKGJhLCBpMCwgaTEsIGkyLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLGkxLGkyXSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9maWxsXG5mdW5jdGlvbiBjYW1sX2JhX2ZpbGwoYmEsIHYpIHtcbiAgYmEuZmlsbCh2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2JsaXQoc3JjLCBkc3QpIHtcbiAgaWYgKGRzdC5kaW1zLmxlbmd0aCAhPSBzcmMuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRzdC5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkc3QuZGltc1tpXSAhPSBzcmMuZGltc1tpXSlcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmJsaXQ6IGRpbWVuc2lvbiBtaXNtYXRjaFwiKTtcbiAgZHN0LmRhdGEuc2V0KHNyYy5kYXRhKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc3ViXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9zdWIoYmEsIG9mcywgbGVuKSB7XG4gIHZhciBjaGFuZ2VkX2RpbTtcbiAgdmFyIG11bCA9IDE7XG4gIGlmIChiYS5sYXlvdXQgPT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIG11bCA9IG11bCAqIGJhLmRpbXNbaV07XG4gICAgY2hhbmdlZF9kaW0gPSAwO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKGJhLmRpbXMubGVuZ3RoIC0gMSk7IGkrKylcbiAgICAgIG11bCA9IG11bCAqIGJhLmRpbXNbaV07XG4gICAgY2hhbmdlZF9kaW0gPSBiYS5kaW1zLmxlbmd0aCAtIDE7XG4gICAgb2ZzID0gb2ZzIC0gMTtcbiAgfVxuICBpZiAob2ZzIDwgMCB8fCBsZW4gPCAwIHx8IChvZnMgKyBsZW4pID4gYmEuZGltc1tjaGFuZ2VkX2RpbV0pe1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnN1YjogYmFkIHN1Yi1hcnJheVwiKTtcbiAgfVxuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIG5ld19kaW1zW2ldID0gYmEuZGltc1tpXTtcbiAgbmV3X2RpbXNbY2hhbmdlZF9kaW1dID0gbGVuO1xuICBtdWwgKj0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShvZnMgKiBtdWwsIChvZnMgKyBsZW4pICogbXVsKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBiYS5sYXlvdXQsIG5ld19kaW1zLCBuZXdfZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2xpY2Vcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc2xpY2UoYmEsIHZpbmQpIHtcbiAgdmluZCA9IGNhbWxfanNfZnJvbV9hcnJheSh2aW5kKTtcbiAgdmFyIG51bV9pbmRzID0gdmluZC5sZW5ndGg7XG4gIHZhciBpbmRleCA9IFtdO1xuICB2YXIgc3ViX2RpbXMgPSBbXTtcbiAgdmFyIG9mcztcblxuICBpZiAobnVtX2luZHMgPiBiYS5kaW1zLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5zbGljZTogdG9vIG1hbnkgaW5kaWNlc1wiKTtcblxuICAvLyBDb21wdXRlIG9mZnNldCBhbmQgY2hlY2sgYm91bmRzXG4gIGlmIChiYS5sYXlvdXQgPT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2luZHM7IGkrKylcbiAgICAgIGluZGV4W2ldID0gdmluZFtpXTtcbiAgICBmb3IgKDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgICBpbmRleFtpXSA9IDA7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKG51bV9pbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzICsgaV0gPSB2aW5kW2ldO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kczsgaSsrKVxuICAgICAgaW5kZXhbaV0gPSAxO1xuICAgIHN1Yl9kaW1zID0gYmEuZGltcy5zbGljZSgwLCBiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzKTtcbiAgfVxuICBvZnMgPSBiYS5vZmZzZXQoaW5kZXgpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoc3ViX2RpbXMpO1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogc2l6ZV9wZXJfZWxlbWVudCwgKG9mcyArIHNpemUpICogc2l6ZV9wZXJfZWxlbWVudCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBzdWJfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3Jlc2hhcGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbmZ1bmN0aW9uIGNhbWxfYmFfcmVzaGFwZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbmV3X2RpbSA9IFtdO1xuICB2YXIgbnVtX2RpbXMgPSB2aW5kLmxlbmd0aDtcblxuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpe1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnJlc2hhcGU6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgfVxuICB2YXIgbnVtX2VsdHMgPSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9kaW1zOyBpKyspIHtcbiAgICBuZXdfZGltW2ldID0gdmluZFtpXTtcbiAgICBpZiAobmV3X2RpbVtpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBuZWdhdGl2ZSBkaW1lbnNpb25cIik7XG4gICAgbnVtX2VsdHMgPSBudW1fZWx0cyAqIG5ld19kaW1baV07XG4gIH1cblxuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIC8vIENoZWNrIHRoYXQgc2l6ZXMgYWdyZWVcbiAgaWYgKG51bV9lbHRzICE9IHNpemUpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogc2l6ZSBtaXNtYXRjaFwiKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBiYS5sYXlvdXQsIG5ld19kaW0sIGJhLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NlcmlhbGl6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2ludDY0X3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcbmZ1bmN0aW9uIGNhbWxfYmFfc2VyaWFsaXplKHdyaXRlciwgYmEsIHN6KSB7XG4gIHdyaXRlci53cml0ZSgzMiwgYmEuZGltcy5sZW5ndGgpO1xuICB3cml0ZXIud3JpdGUoMzIsIChiYS5raW5kIHwgKGJhLmxheW91dCA8PCA4KSkpO1xuICBpZihiYS5jYW1sX2N1c3RvbSA9PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihiYS5kaW1zW2ldIDwgMHhmZmZmKVxuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRpbXNbaV0pO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgMHhmZmZmKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKDMyLCAwKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIGVsc2VcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgd3JpdGVyLndyaXRlKDMyLGJhLmRpbXNbaV0pXG4gIHN3aXRjaChiYS5raW5kKXtcbiAgY2FzZSAyOiAgLy9JbnQ4QXJyYXlcbiAgY2FzZSAzOiAgLy9VaW50OEFycmF5XG4gIGNhc2UgMTI6IC8vVWludDhBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSg4LCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNDogIC8vIEludDE2QXJyYXlcbiAgY2FzZSA1OiAgLy8gVWludDE2QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA2OiAgLy8gSW50MzJBcnJheSAoaW50MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgODogIC8vIEludDMyQXJyYXkgKGludClcbiAgY2FzZSA5OiAgLy8gSW50MzJBcnJheSAobmF0aXZlaW50KVxuICAgIHdyaXRlci53cml0ZSg4LDApO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDc6ICAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspe1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGJhLmdldChpKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTogIC8vIEZsb2F0NjRBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMDogIC8vIEZsb2F0MzJBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGJhLmdldChpKSk7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGIpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKXtcbiAgICAgIHZhciBqID0gYmEuZ2V0KGkpO1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQoalsxXSkpO1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQoalsyXSkpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMTogLy8gRmxvYXQ2NEFycmF5IChjb21wbGV4NjQpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKXtcbiAgICAgIHZhciBjb21wbGV4ID0gYmEuZ2V0KGkpO1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzFdKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsyXSkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHdyaXRlci53cml0ZSAoOCwgYltqXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHN6WzBdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA0O1xuICBzelsxXSA9ICg0ICsgYmEuZGltcy5sZW5ndGgpICogODtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kZXNlcmlhbGl6ZVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzLCBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG5mdW5jdGlvbiBjYW1sX2JhX2Rlc2VyaWFsaXplKHJlYWRlciwgc3osIG5hbWUpe1xuICB2YXIgbnVtX2RpbXMgPSByZWFkZXIucmVhZDMycygpO1xuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpXG4gICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB3cm9uZyBudW1iZXIgb2YgYmlnYXJyYXkgZGltZW5zaW9uc1wiKTtcbiAgdmFyIHRhZyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBraW5kID0gdGFnICYgMHhmZlxuICB2YXIgbGF5b3V0ID0gKHRhZyA+PiA4KSAmIDE7XG4gIHZhciBkaW1zID0gW11cbiAgaWYobmFtZSA9PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgICAgdmFyIHNpemVfZGltID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICAgIGlmKHNpemVfZGltID09IDB4ZmZmZil7XG4gICAgICAgIHZhciBzaXplX2RpbV9oaSA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIHZhciBzaXplX2RpbV9sbyA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIGlmKHNpemVfZGltX2hpICE9IDApXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBiaWdhcnJheSBkaW1lbnNpb24gb3ZlcmZsb3cgaW4gMzJiaXRcIik7XG4gICAgICAgIHNpemVfZGltID0gc2l6ZV9kaW1fbG87XG4gICAgICB9XG4gICAgICBkaW1zLnB1c2goc2l6ZV9kaW0pO1xuICAgIH1cbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykgZGltcy5wdXNoKHJlYWRlci5yZWFkMzJ1KCkpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoZGltcyk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpO1xuICB2YXIgYmEgPSBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgc3dpdGNoKGtpbmQpe1xuICBjYXNlIDI6ICAvL0ludDhBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMzogIC8vVWludDhBcnJheVxuICBjYXNlIDEyOiAvL1VpbnQ4QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDQ6ICAvLyBJbnQxNkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNTogIC8vIFVpbnQxNkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNjogIC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDg6ICAvLyBJbnQzMkFycmF5IChpbnQpXG4gIGNhc2UgOTogIC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICB2YXIgc2l4dHkgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgaWYoc2l4dHkpIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogY2Fubm90IHJlYWQgYmlnYXJyYXkgd2l0aCA2NC1iaXQgT0NhbWwgaW50c1wiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA3OiAvLyAoaW50NjQpXG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIGludDY0ID0gY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KTtcbiAgICAgIGJhLnNldChpLGludDY0KTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTogIC8vIEZsb2F0NjRBcnJheVxuICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBmID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgYmEuc2V0KGksZik7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDA6ICAvLyBGbG9hdDMyQXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIHZhciBmID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgYmEuc2V0KGksZik7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiAvLyBGbG9hdDMyQXJyYXkgKGNvbXBsZXgzMilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIHZhciByZSA9IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyhyZWFkZXIucmVhZDMycygpKTtcbiAgICAgIHZhciBpbSA9IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyhyZWFkZXIucmVhZDMycygpKTtcbiAgICAgIGJhLnNldChpLFsyNTQscmUsaW1dKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciByZSA9IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKHQpKTtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBpbSA9IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKHQpKTtcbiAgICAgIGJhLnNldChpLFsyNTQscmUsaW1dKTtcbiAgICB9XG4gICAgYnJlYWtcbiAgfVxuICBzelswXSA9ICg0ICsgbnVtX2RpbXMpICogNDtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL0RlcHJlY2F0ZWRcbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlX2Zyb21cbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV9mcm9tKGRhdGExLCBkYXRhMiwganN0eXAsIGtpbmQsIGxheW91dCwgZGltcyl7XG4gIGlmKGRhdGEyIHx8IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCkgPT0gMil7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iYV9jcmVhdGVfZnJvbTogdXNlIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcIik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGExKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9oYXNoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9mbG9hdFxuZnVuY3Rpb24gY2FtbF9iYV9oYXNoKGJhKXtcbiAgdmFyIG51bV9lbHRzID0gY2FtbF9iYV9nZXRfc2l6ZShiYS5kaW1zKTtcbiAgdmFyIGggPSAwO1xuICBzd2l0Y2goYmEua2luZCl7XG4gIGNhc2UgMjogIC8vSW50OEFycmF5XG4gIGNhc2UgMzogIC8vVWludDhBcnJheVxuICBjYXNlIDEyOiAvL1VpbnQ4QXJyYXlcbiAgICBpZihudW1fZWx0cyA+IDI1NikgbnVtX2VsdHMgPSAyNTY7XG4gICAgdmFyIHcgPSAwLCBpID0wO1xuICAgIGZvcihpID0gMDsgaSArIDQgPD0gYmEuZGF0YS5sZW5ndGg7IGkrPTQpe1xuICAgICAgdyA9IGJhLmRhdGFbaSswXSB8IChiYS5kYXRhW2krMV0gPDwgOCkgfCAoYmEuZGF0YVtpKzJdIDw8IDE2KSB8IChiYS5kYXRhW2krM10gPDwgMjQpO1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsdyk7XG4gICAgfVxuICAgIHcgPSAwO1xuICAgIHN3aXRjaCAobnVtX2VsdHMgJiAzKSB7XG4gICAgY2FzZSAzOiB3ICA9IGJhLmRhdGFbaSsyXSA8PCAxNjsgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICBjYXNlIDI6IHcgfD0gYmEuZGF0YVtpKzFdIDw8IDg7ICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgIGNhc2UgMTogdyB8PSBiYS5kYXRhW2krMF07XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDQ6ICAvLyBJbnQxNkFycmF5XG4gIGNhc2UgNTogIC8vIFVpbnQxNkFycmF5XG4gICAgaWYobnVtX2VsdHMgPiAxMjgpIG51bV9lbHRzID0gMTI4O1xuICAgIHZhciB3ID0gMCwgaSA9MDtcbiAgICBmb3IoaSA9IDA7IGkgKyAyIDw9IGJhLmRhdGEubGVuZ3RoOyBpKz0yKXtcbiAgICAgIHcgPSBiYS5kYXRhW2krMF0gfCAoYmEuZGF0YVtpKzFdIDw8IDE2KTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLHcpO1xuICAgIH1cbiAgICBpZiAoKG51bV9lbHRzICYgMSkgIT0gMClcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgY2FzZSA2OiAgLy8gSW50MzJBcnJheSAoaW50MzIpXG4gICAgaWYgKG51bV9lbHRzID4gNjQpIG51bV9lbHRzID0gNjQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgODogIC8vIEludDMyQXJyYXkgKGludClcbiAgY2FzZSA5OiAgLy8gSW50MzJBcnJheSAobmF0aXZlaW50KVxuICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICBjYXNlIDc6ICAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICBudW1fZWx0cyAqPSAyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiAvLyBGbG9hdDMyQXJyYXkgKGNvbXBsZXgzMilcbiAgICBudW1fZWx0cyAqPTI7IC8qIGZhbGx0aHJvdWdoICovXG4gIGNhc2UgMDogIC8vIEZsb2F0MzJBcnJheVxuICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgIG51bV9lbHRzICo9MjsgLyogZmFsbHRocm91Z2ggKi9cbiAgY2FzZSAxOiAgLy8gRmxvYXQ2NEFycmF5XG4gICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV90b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJhKXtcbiAgcmV0dXJuIGJhLmRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSh0YSl7XG4gIHZhciBnID0gZ2xvYmFsVGhpcztcbiAgdmFyIGtpbmQ7XG4gIGlmICh0YSBpbnN0YW5jZW9mIGcuRmxvYXQzMkFycmF5KSBraW5kID0gMDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBnLkZsb2F0NjRBcnJheSkga2luZCA9IDE7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgZy5JbnQ4QXJyYXkpIGtpbmQgPSAyO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIGcuVWludDhBcnJheSkga2luZCA9IDM7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgZy5JbnQxNkFycmF5KSBraW5kID0gNDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBnLlVpbnQxNkFycmF5KSBraW5kID0gNTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBnLkludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIGcuVWludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5KHRhKXtcbiAgdmFyIGtpbmQgPSBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWJcblxuLy9Qcm92aWRlczogY2FtbF9qc19wdXJlX2V4cHIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfcHVyZV9leHByIChmKSB7IHJldHVybiBmKCk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19zZXQgKG11dGFibGUsIGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfc2V0KG8sZix2KSB7IG9bZl09djtyZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0IG11dGFibGUgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0KG8sZikgeyByZXR1cm4gb1tmXTsgfVxuLy9Qcm92aWRlczogY2FtbF9qc19kZWxldGUgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19kZWxldGUobyxmKSB7IGRlbGV0ZSBvW2ZdOyByZXR1cm4gMH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19pbnN0YW5jZW9mIChjb25zdCwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2luc3RhbmNlb2YobyxjKSB7IHJldHVybiAobyBpbnN0YW5jZW9mIGMpID8gMSA6IDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc190eXBlb2YgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190eXBlb2YobykgeyByZXR1cm4gdHlwZW9mIG87IH1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVcbmZ1bmN0aW9uIGNhbWxfdHJhbXBvbGluZShyZXMpIHtcbiAgdmFyIGMgPSAxO1xuICB3aGlsZShyZXMgJiYgcmVzLmpvb190cmFtcCl7XG4gICAgcmVzID0gcmVzLmpvb190cmFtcC5hcHBseShudWxsLCByZXMuam9vX2FyZ3MpO1xuICAgIGMrKztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbmZ1bmN0aW9uIGNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZixhcmdzKSB7XG4gIHJldHVybiB7am9vX3RyYW1wOmYsam9vX2FyZ3M6YXJnc307XG59XG5cbi8vUHJvdmlkZXM6IGpzX3ByaW50X3N0ZG91dCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3V0ZjE2X29mX3V0ZjhcbmZ1bmN0aW9uIGpzX3ByaW50X3N0ZG91dChzKSB7XG4gIHZhciBzID0gY2FtbF91dGYxNl9vZl91dGY4KHMpO1xuICB2YXIgZyA9IGdsb2JhbFRoaXM7XG4gIGlmIChnLnByb2Nlc3MgJiYgZy5wcm9jZXNzLnN0ZG91dCAmJiBnLnByb2Nlc3Muc3Rkb3V0LndyaXRlKSB7XG4gICAgZy5wcm9jZXNzLnN0ZG91dC53cml0ZShzKVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBvdXRwdXQgdGhlIGxhc3QgXFxuIGlmIHByZXNlbnRcbiAgICAvLyBhcyBjb25zb2xlIGxvZ2dpbmcgZGlzcGxheSBhIG5ld2xpbmUgYXQgdGhlIGVuZFxuICAgIGlmKHMuY2hhckNvZGVBdChzLmxlbmd0aCAtIDEpID09IDEwKVxuICAgICAgcyA9IHMuc3Vic3RyKDAscy5sZW5ndGggLSAxICk7XG4gICAgdmFyIHYgPSBnLmNvbnNvbGU7XG4gICAgdiAgJiYgdi5sb2cgJiYgdi5sb2cocyk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGpzX3ByaW50X3N0ZGVyciAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3V0ZjE2X29mX3V0ZjhcbmZ1bmN0aW9uIGpzX3ByaW50X3N0ZGVycihzKSB7XG4gIHZhciBzID0gY2FtbF91dGYxNl9vZl91dGY4KHMpO1xuICB2YXIgZyA9IGdsb2JhbFRoaXM7XG4gIGlmIChnLnByb2Nlc3MgJiYgZy5wcm9jZXNzLnN0ZG91dCAmJiBnLnByb2Nlc3Muc3Rkb3V0LndyaXRlKSB7XG4gICAgZy5wcm9jZXNzLnN0ZGVyci53cml0ZShzKVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBvdXRwdXQgdGhlIGxhc3QgXFxuIGlmIHByZXNlbnRcbiAgICAvLyBhcyBjb25zb2xlIGxvZ2dpbmcgZGlzcGxheSBhIG5ld2xpbmUgYXQgdGhlIGVuZFxuICAgIGlmKHMuY2hhckNvZGVBdChzLmxlbmd0aCAtIDEpID09IDEwKVxuICAgICAgcyA9IHMuc3Vic3RyKDAscy5sZW5ndGggLSAxICk7XG4gICAgdmFyIHYgPSBnLmNvbnNvbGU7XG4gICAgdiAmJiB2LmVycm9yICYmIHYuZXJyb3Iocyk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19qc1xuZnVuY3Rpb24gY2FtbF9pc19qcygpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd3JhcF9leGNlcHRpb24gY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyxjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX3JldHVybl9leG5fY29uc3RhbnRcbmZ1bmN0aW9uIGNhbWxfd3JhcF9leGNlcHRpb24oZSkge1xuICBpZihlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBlO1xuICAvL1N0YWNrX292ZXJmbG93OiBjaHJvbWUsIHNhZmFyaVxuICBpZihnbG9iYWxUaGlzLlJhbmdlRXJyb3JcbiAgICAgJiYgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuUmFuZ2VFcnJvclxuICAgICAmJiBlLm1lc3NhZ2VcbiAgICAgJiYgZS5tZXNzYWdlLm1hdGNoKC9tYXhpbXVtIGNhbGwgc3RhY2svaSkpXG4gICAgcmV0dXJuIGNhbWxfcmV0dXJuX2V4bl9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93KTtcbiAgLy9TdGFja19vdmVyZmxvdzogZmlyZWZveFxuICBpZihnbG9iYWxUaGlzLkludGVybmFsRXJyb3JcbiAgICAgJiYgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvclxuICAgICAmJiBlLm1lc3NhZ2VcbiAgICAgJiYgZS5tZXNzYWdlLm1hdGNoKC90b28gbXVjaCByZWN1cnNpb24vaSkpXG4gICAgcmV0dXJuIGNhbWxfcmV0dXJuX2V4bl9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93KTtcbiAgLy9XcmFwIEVycm9yIGluIEpzLkVycm9yIGV4Y2VwdGlvblxuICBpZihlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvciAmJiBjYW1sX25hbWVkX3ZhbHVlKFwianNFcnJvclwiKSlcbiAgICByZXR1cm4gWzAsY2FtbF9uYW1lZF92YWx1ZShcImpzRXJyb3JcIiksZV07XG4gIC8vZmFsbGJhY2s6IHdyYXBwZWQgaW4gRmFpbHVyZVxuICByZXR1cm4gWzAsY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChTdHJpbmcoZSkpXTtcbn1cblxuLy8gRXhwZXJpbWVudGFsXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICAvL25ldmVyIHJlcmFpc2UgZm9yIGNvbnN0YW50IGV4blxuICBpZighZXhuLmpzX2Vycm9yIHx8IGZvcmNlIHx8IGV4blswXSA9PSAyNDgpIGV4bi5qc19lcnJvciA9IG5ldyBnbG9iYWxUaGlzLkVycm9yKFwiSnMgZXhjZXB0aW9uIGNvbnRhaW5pbmcgYmFja3RyYWNlXCIpO1xuICByZXR1cm4gZXhuO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXJyb3Jfb3B0aW9uX29mX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZihleG4uanNfZXJyb3IpIHsgcmV0dXJuIFswLCBleG4uanNfZXJyb3JdOyB9XG4gIHJldHVybiAwO1xufVxuXG5cblxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Jvb2woeCkgeyByZXR1cm4gISF4OyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19ib29sKHgpIHsgcmV0dXJuICt4OyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fZmxvYXQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Zsb2F0KHgpIHsgcmV0dXJuIHg7IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fZmxvYXQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19mbG9hdCh4KSB7IHJldHVybiB4OyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEuc2xpY2UoMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2FycmF5KGEpIHtcbiAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4rMSk7XG4gIGJbMF0gPSAwO1xuICBmb3IodmFyIGk9MDtpPGxlbjtpKyspIGJbaSsxXSA9IGFbaV07XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9saXN0X29mX2pzX2FycmF5KGEpe1xuICB2YXIgbCA9IDA7XG4gIGZvcih2YXIgaT1hLmxlbmd0aCAtIDE7IGk+PTA7IGktLSl7XG4gICAgdmFyIGUgPSBhW2ldO1xuICAgIGwgPSBbMCxlLGxdO1xuICB9XG4gIHJldHVybiBsXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF90b19qc19hcnJheSBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2xpc3RfdG9fanNfYXJyYXkobCl7XG4gIHZhciBhID0gW107XG4gIGZvcig7IGwgIT09IDA7IGwgPSBsWzJdKSB7XG4gICAgYS5wdXNoKGxbMV0pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3ZhciBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGpzX3ByaW50X3N0ZGVyclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfdmFyKHgpIHtcbiAgdmFyIHggPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyh4KTtcbiAgLy9DaGVja3MgdGhhdCB4IGhhcyB0aGUgZm9ybSBpZGVudFsuaWRlbnRdKlxuICBpZigheC5tYXRjaCgvXlthLXpBLVpfJF1bYS16QS1aXyQwLTldKihcXC5bYS16QS1aXyRdW2EtekEtWl8kMC05XSopKiQvKSl7XG4gICAganNfcHJpbnRfc3RkZXJyKFwiY2FtbF9qc192YXI6IFxcXCJcIiArIHggKyBcIlxcXCIgaXMgbm90IGEgdmFsaWQgSmF2YVNjcmlwdCB2YXJpYWJsZS4gY29udGludWluZyAuLlwiKTtcbiAgICAvL2dsb2JhbFRoaXMuY29uc29sZS5lcnJvcihcIkpzLlVuc2FmZS5ldmFsX3N0cmluZ1wiKVxuICB9XG4gIHJldHVybiBldmFsKHgpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19jYWxsIChjb25zdCwgbXV0YWJsZSwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19jYWxsKGYsIG8sIGFyZ3MpIHsgcmV0dXJuIGYuYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTsgfVxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5fY2FsbCAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfZnVuX2NhbGwoZiwgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gIGNhc2UgMTogcmV0dXJuIGYoKTtcbiAgY2FzZSAyOiByZXR1cm4gZiAoYVsxXSk7XG4gIGNhc2UgMzogcmV0dXJuIGYgKGFbMV0sYVsyXSk7XG4gIGNhc2UgNDogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdKTtcbiAgY2FzZSA1OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSk7XG4gIGNhc2UgNjogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSk7XG4gIGNhc2UgNzogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdKTtcbiAgY2FzZSA4OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sYVs3XSk7XG4gIH1cbiAgcmV0dXJuIGYuYXBwbHkobnVsbCwgY2FtbF9qc19mcm9tX2FycmF5KGEpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbWV0aF9jYWxsIChtdXRhYmxlLCBjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfbWV0aF9jYWxsKG8sIGYsIGFyZ3MpIHtcbiAgcmV0dXJuIG9bY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoZildLmFwcGx5KG8sIGNhbWxfanNfZnJvbV9hcnJheShhcmdzKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX25ldyAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfbmV3KGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICBjYXNlIDE6IHJldHVybiBuZXcgYztcbiAgY2FzZSAyOiByZXR1cm4gbmV3IGMgKGFbMV0pO1xuICBjYXNlIDM6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdKTtcbiAgY2FzZSA0OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdKTtcbiAgY2FzZSA1OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0pO1xuICBjYXNlIDY6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKTtcbiAgY2FzZSA3OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdKTtcbiAgY2FzZSA4OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdLGFbN10pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7IHJldHVybiBjLmFwcGx5KHRoaXMsIGNhbWxfanNfZnJvbV9hcnJheShhKSk7IH1cbiAgRi5wcm90b3R5cGUgPSBjLnByb3RvdHlwZTtcbiAgcmV0dXJuIG5ldyBGO1xufVxuLy9Qcm92aWRlczogY2FtbF9vanNfbmV3X2FyciAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb2pzX25ld19hcnIoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gIGNhc2UgMDogcmV0dXJuIG5ldyBjO1xuICBjYXNlIDE6IHJldHVybiBuZXcgYyAoYVswXSk7XG4gIGNhc2UgMjogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0pO1xuICBjYXNlIDM6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0pO1xuICBjYXNlIDQ6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSk7XG4gIGNhc2UgNTogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0pO1xuICBjYXNlIDY6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pO1xuICBjYXNlIDc6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSk7XG4gIH1cbiAgZnVuY3Rpb24gRigpIHsgcmV0dXJuIGMuYXBwbHkodGhpcywgYSk7IH1cbiAgRi5wcm90b3R5cGUgPSBjLnByb3RvdHlwZTtcbiAgcmV0dXJuIG5ldyBGO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYobGVuID4gMCl7XG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihmLCBbdW5kZWZpbmVkXSk7XG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHMoZikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYsIFthcmdzXSk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3QoYXJpdHksIGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYobiA9PSBhcml0eSAmJiBmLmxlbmd0aCA9PSBhcml0eSkgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcml0eSk7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGgsIGFyaXR5KVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgYXJnc1swXSA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpKzFdID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYsYXJncyk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50cyBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihmLFt0aGlzLGFyZ3NdKTtcbiAgfVxufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3QoYXJpdHksIGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcml0eSArIDEpO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoLCBhcml0eSlcbiAgICBhcmdzWzBdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2krMV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmUgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgICBhcmdzWzBdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2krMV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyk7IH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXF1YWxzIG11dGFibGUgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZXF1YWxzICh4LCB5KSB7IHJldHVybiArKHggPT0geSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19ldmFsX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19ldmFsX3N0cmluZyAocykge3JldHVybiBldmFsKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpKTt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXhwciAoY29uc3QpXG4vL1JlcXVpcmVzOiBqc19wcmludF9zdGRlcnJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX2V4cHIocykge1xuICBqc19wcmludF9zdGRlcnIoXCJjYW1sX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgcmV0dXJuIGV2YWwoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO31cblxuLy9Qcm92aWRlczogY2FtbF9wdXJlX2pzX2V4cHIgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczoganNfcHJpbnRfc3RkZXJyXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9wdXJlX2pzX2V4cHIgKHMpe1xuICBqc19wcmludF9zdGRlcnIoXCJjYW1sX3B1cmVfanNfZXhwcjogZmFsbGJhY2sgdG8gcnVudGltZSBldmFsdWF0aW9uXFxuXCIpO1xuICByZXR1cm4gZXZhbChjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKSk7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29iamVjdCAob2JqZWN0X2xpdGVyYWwpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19vYmplY3QgKGEpIHtcbiAgdmFyIG8gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSBhW2ldO1xuICAgIG9bY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocFsxXSldID0gcFsyXTtcbiAgfVxuICByZXR1cm4gbztcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBwYXJzaW5nLmMgODk4MyAyMDA4LTA4LTA2IDA5OjM4OjI1WiB4bGVyb3kgJCAqL1xuXG4vKiBUaGUgUERBIGF1dG9tYXRvbiBmb3IgcGFyc2VycyBnZW5lcmF0ZWQgYnkgY2FtbHlhY2MgKi9cblxuLyogVGhlIHB1c2hkb3duIGF1dG9tYXRhICovXG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2xleF9hcnJheVxuZnVuY3Rpb24gY2FtbF9wYXJzZV9lbmdpbmUodGFibGVzLCBlbnYsIGNtZCwgYXJnKVxue1xuICB2YXIgRVJSQ09ERSA9IDI1NjtcblxuICAvL3ZhciBTVEFSVCA9IDA7XG4gIC8vdmFyIFRPS0VOX1JFQUQgPSAxO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMSA9IDI7XG4gIC8vdmFyIFNUQUNLU19HUk9XTl8yID0gMztcbiAgLy92YXIgU0VNQU5USUNfQUNUSU9OX0NPTVBVVEVEID0gNDtcbiAgLy92YXIgRVJST1JfREVURUNURUQgPSA1O1xuICB2YXIgbG9vcCA9IDY7XG4gIHZhciB0ZXN0c2hpZnQgPSA3O1xuICB2YXIgc2hpZnQgPSA4O1xuICB2YXIgc2hpZnRfcmVjb3ZlciA9IDk7XG4gIHZhciByZWR1Y2UgPSAxMDtcblxuICB2YXIgUkVBRF9UT0tFTiA9IDA7XG4gIHZhciBSQUlTRV9QQVJTRV9FUlJPUiA9IDE7XG4gIHZhciBHUk9XX1NUQUNLU18xID0gMjtcbiAgdmFyIEdST1dfU1RBQ0tTXzIgPSAzO1xuICB2YXIgQ09NUFVURV9TRU1BTlRJQ19BQ1RJT04gPSA0O1xuICB2YXIgQ0FMTF9FUlJPUl9GVU5DVElPTiA9IDU7XG5cbiAgdmFyIGVudl9zX3N0YWNrID0gMTtcbiAgdmFyIGVudl92X3N0YWNrID0gMjtcbiAgdmFyIGVudl9zeW1iX3N0YXJ0X3N0YWNrID0gMztcbiAgdmFyIGVudl9zeW1iX2VuZF9zdGFjayA9IDQ7XG4gIHZhciBlbnZfc3RhY2tzaXplID0gNTtcbiAgdmFyIGVudl9zdGFja2Jhc2UgPSA2O1xuICB2YXIgZW52X2N1cnJfY2hhciA9IDc7XG4gIHZhciBlbnZfbHZhbCA9IDg7XG4gIHZhciBlbnZfc3ltYl9zdGFydCA9IDk7XG4gIHZhciBlbnZfc3ltYl9lbmQgPSAxMDtcbiAgdmFyIGVudl9hc3AgPSAxMTtcbiAgdmFyIGVudl9ydWxlX2xlbiA9IDEyO1xuICB2YXIgZW52X3J1bGVfbnVtYmVyID0gMTM7XG4gIHZhciBlbnZfc3AgPSAxNDtcbiAgdmFyIGVudl9zdGF0ZSA9IDE1O1xuICB2YXIgZW52X2VycmZsYWcgPSAxNjtcblxuICAvLyB2YXIgX3RibF9hY3Rpb25zID0gMTtcbiAgdmFyIHRibF90cmFuc2xfY29uc3QgPSAyO1xuICB2YXIgdGJsX3RyYW5zbF9ibG9jayA9IDM7XG4gIHZhciB0YmxfbGhzID0gNDtcbiAgdmFyIHRibF9sZW4gPSA1O1xuICB2YXIgdGJsX2RlZnJlZCA9IDY7XG4gIHZhciB0YmxfZGdvdG8gPSA3O1xuICB2YXIgdGJsX3NpbmRleCA9IDg7XG4gIHZhciB0YmxfcmluZGV4ID0gOTtcbiAgdmFyIHRibF9naW5kZXggPSAxMDtcbiAgdmFyIHRibF90YWJsZXNpemUgPSAxMTtcbiAgdmFyIHRibF90YWJsZSA9IDEyO1xuICB2YXIgdGJsX2NoZWNrID0gMTM7XG4gIC8vIHZhciBfdGJsX2Vycm9yX2Z1bmN0aW9uID0gMTQ7XG4gIC8vIHZhciBfdGJsX25hbWVzX2NvbnN0ID0gMTU7XG4gIC8vIHZhciBfdGJsX25hbWVzX2Jsb2NrID0gMTY7XG5cbiAgaWYgKCF0YWJsZXMuZGdvdG8pIHtcbiAgICB0YWJsZXMuZGVmcmVkID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfZGVmcmVkXSk7XG4gICAgdGFibGVzLnNpbmRleCA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX3NpbmRleF0pO1xuICAgIHRhYmxlcy5jaGVjayAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9jaGVja10pO1xuICAgIHRhYmxlcy5yaW5kZXggPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9yaW5kZXhdKTtcbiAgICB0YWJsZXMudGFibGUgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfdGFibGVdKTtcbiAgICB0YWJsZXMubGVuICAgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfbGVuXSk7XG4gICAgdGFibGVzLmxocyAgICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2xoc10pO1xuICAgIHRhYmxlcy5naW5kZXggPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9naW5kZXhdKTtcbiAgICB0YWJsZXMuZGdvdG8gID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfZGdvdG9dKTtcbiAgfVxuXG4gIHZhciByZXMgPSAwLCBuLCBuMSwgbjIsIHN0YXRlMTtcblxuICAvLyBSRVNUT1JFXG4gIHZhciBzcCA9IGVudltlbnZfc3BdO1xuICB2YXIgc3RhdGUgPSBlbnZbZW52X3N0YXRlXTtcbiAgdmFyIGVycmZsYWcgPSBlbnZbZW52X2VycmZsYWddO1xuXG4gIGV4aXQ6Zm9yICg7Oykge1xuICAgIHN3aXRjaChjbWQpIHtcbiAgICBjYXNlIDA6Ly9TVEFSVDpcbiAgICAgIHN0YXRlID0gMDtcbiAgICAgIGVycmZsYWcgPSAwO1xuICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICBjYXNlIDY6Ly9sb29wOlxuICAgICAgbiA9IHRhYmxlcy5kZWZyZWRbc3RhdGVdO1xuICAgICAgaWYgKG4gIT0gMCkgeyBjbWQgPSByZWR1Y2U7IGJyZWFrOyB9XG4gICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID49IDApIHsgY21kID0gdGVzdHNoaWZ0OyBicmVhazsgfVxuICAgICAgcmVzID0gUkVBRF9UT0tFTjtcbiAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgbGV4ZXIgYW5kIHVwZGF0ZXMgKi9cbiAgICAgIC8qIHN5bWJfc3RhcnQgYW5kIHN5bWJfZW5kICovXG4gICAgY2FzZSAxOi8vVE9LRU5fUkVBRDpcbiAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSB0YWJsZXNbdGJsX3RyYW5zbF9ibG9ja11bYXJnWzBdICsgMV07XG4gICAgICAgIGVudltlbnZfbHZhbF0gPSBhcmdbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSB0YWJsZXNbdGJsX3RyYW5zbF9jb25zdF1bYXJnICsgMV07XG4gICAgICAgIGVudltlbnZfbHZhbF0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICBjYXNlIDc6Ly90ZXN0c2hpZnQ6XG4gICAgICBuMSA9IHRhYmxlcy5zaW5kZXhbc3RhdGVdO1xuICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBlbnZbZW52X2N1cnJfY2hhcl0pIHtcbiAgICAgICAgY21kID0gc2hpZnQ7IGJyZWFrO1xuICAgICAgfVxuICAgICAgbjEgPSB0YWJsZXMucmluZGV4W3N0YXRlXTtcbiAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT0gZW52W2Vudl9jdXJyX2NoYXJdKSB7XG4gICAgICAgIG4gPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgICBjbWQgPSByZWR1Y2U7IGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGVycmZsYWcgPD0gMCkge1xuICAgICAgICByZXMgPSBDQUxMX0VSUk9SX0ZVTkNUSU9OO1xuICAgICAgICBicmVhayBleGl0O1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgZXJyb3IgZnVuY3Rpb24gKi9cbiAgICBjYXNlIDU6Ly9FUlJPUl9ERVRFQ1RFRDpcbiAgICAgIGlmIChlcnJmbGFnIDwgMykge1xuICAgICAgICBlcnJmbGFnID0gMztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIHN0YXRlMSA9IGVudltlbnZfc19zdGFja11bc3AgKyAxXTtcbiAgICAgICAgICBuMSA9IHRhYmxlcy5zaW5kZXhbc3RhdGUxXTtcbiAgICAgICAgICBuMiA9IG4xICsgRVJSQ09ERTtcbiAgICAgICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09IEVSUkNPREUpIHtcbiAgICAgICAgICAgIGNtZCA9IHNoaWZ0X3JlY292ZXI7IGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3AgPD0gZW52W2Vudl9zdGFja2Jhc2VdKSByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgICAgICAgICAvKiBUaGUgTUwgY29kZSByYWlzZXMgUGFyc2VfZXJyb3IgKi9cbiAgICAgICAgICAgIHNwLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID09IDApIHJldHVybiBSQUlTRV9QQVJTRV9FUlJPUjtcbiAgICAgICAgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgIGVudltlbnZfY3Vycl9jaGFyXSA9IC0xO1xuICAgICAgICBjbWQgPSBsb29wOyBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgIGNhc2UgODovL3NoaWZ0OlxuICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICBpZiAoZXJyZmxhZyA+IDApIGVycmZsYWctLTtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgIGNhc2UgOTovL3NoaWZ0X3JlY292ZXI6XG4gICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICBzcCsrO1xuICAgICAgaWYgKHNwID49IGVudltlbnZfc3RhY2tzaXplXSkge1xuICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18xO1xuICAgICAgICBicmVhayBleGl0O1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSByZXNpemVzIHRoZSBzdGFja3MgKi9cbiAgICBjYXNlIDI6Ly9TVEFDS1NfR1JPV05fMTpcbiAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9sdmFsXTtcbiAgICAgIGVudltlbnZfc3ltYl9zdGFydF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9zdGFydF07XG4gICAgICBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX2VuZF07XG4gICAgICBjbWQgPSBsb29wO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDEwOi8vcmVkdWNlOlxuICAgICAgdmFyIG0gPSB0YWJsZXMubGVuW25dO1xuICAgICAgZW52W2Vudl9hc3BdID0gc3A7XG4gICAgICBlbnZbZW52X3J1bGVfbnVtYmVyXSA9IG47XG4gICAgICBlbnZbZW52X3J1bGVfbGVuXSA9IG07XG4gICAgICBzcCA9IHNwIC0gbSArIDE7XG4gICAgICBtID0gdGFibGVzLmxoc1tuXTtcbiAgICAgIHN0YXRlMSA9IGVudltlbnZfc19zdGFja11bc3BdO1xuICAgICAgbjEgPSB0YWJsZXMuZ2luZGV4W21dO1xuICAgICAgbjIgPSBuMSArIHN0YXRlMTtcbiAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBzdGF0ZTEpXG4gICAgICAgIHN0YXRlID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgIGVsc2VcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMuZGdvdG9bbV07XG4gICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgIHJlcyA9IEdST1dfU1RBQ0tTXzI7XG4gICAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgIGNhc2UgMzovL1NUQUNLU19HUk9XTl8yOlxuICAgICAgcmVzID0gQ09NUFVURV9TRU1BTlRJQ19BQ1RJT047XG4gICAgICBicmVhayBleGl0O1xuICAgICAgLyogVGhlIE1MIGNvZGUgY2FsbHMgdGhlIHNlbWFudGljIGFjdGlvbiAqL1xuICAgIGNhc2UgNDovL1NFTUFOVElDX0FDVElPTl9DT01QVVRFRDpcbiAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gYXJnO1xuICAgICAgdmFyIGFzcCA9IGVudltlbnZfYXNwXTtcbiAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgIGlmIChzcCA+IGFzcCkge1xuICAgICAgICAvKiBUaGlzIGlzIGFuIGVwc2lsb24gcHJvZHVjdGlvbi4gVGFrZSBzeW1iX3N0YXJ0IGVxdWFsIHRvIHN5bWJfZW5kLiAqL1xuICAgICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgIH1cbiAgICAgIGNtZCA9IGxvb3A7IGJyZWFrO1xuICAgICAgLyogU2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJBSVNFX1BBUlNFX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvLyBTQVZFXG4gIGVudltlbnZfc3BdID0gc3A7XG4gIGVudltlbnZfc3RhdGVdID0gc3RhdGU7XG4gIGVudltlbnZfZXJyZmxhZ10gPSBlcnJmbGFnO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NldF9wYXJzZXJfdHJhY2UgY29uc3Rcbi8vRHVtbXkgZnVuY3Rpb24hXG5mdW5jdGlvbiBjYW1sX3NldF9wYXJzZXJfdHJhY2UoKSB7IHJldHVybiAwOyB9XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zvcm1hdF9pbnQgY29uc3QgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nLCBjYW1sX3N0cl9yZXBlYXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZm9ybWF0X2ludChmbXQsIGkpIHtcbiAgaWYgKGNhbWxfanNieXRlc19vZl9zdHJpbmcoZm10KSA9PSBcIiVkXCIpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIraSk7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGkgPCAwKSB7IGlmIChmLnNpZ25lZGNvbnYpIHsgZi5zaWduID0gLTE7IGkgPSAtaTsgfSBlbHNlIGkgPj4+PSAwOyB9XG4gIHZhciBzID0gaS50b1N0cmluZyhmLmJhc2UpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9ICcgJztcbiAgICB2YXIgbiA9IGYucHJlYyAtIHMubGVuZ3RoO1xuICAgIGlmIChuID4gMCkgcyA9IGNhbWxfc3RyX3JlcGVhdCAobiwgJzAnKSArIHM7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UgKHMpIHtcbiAgdmFyIGkgPSAwLCBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyksIGJhc2UgPSAxMCwgc2lnbiA9IDE7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsaSkpIHtcbiAgICBjYXNlIDQ1OiBpKys7IHNpZ24gPSAtMTsgYnJlYWs7XG4gICAgY2FzZSA0MzogaSsrOyBzaWduID0gMTsgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChpICsgMSA8IGxlbiAmJiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpID09IDQ4KVxuICAgIHN3aXRjaCAoY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpICsgMSkpIHtcbiAgICBjYXNlIDEyMDogY2FzZSA4ODogYmFzZSA9IDE2OyBpICs9IDI7IGJyZWFrO1xuICAgIGNhc2UgMTExOiBjYXNlIDc5OiBiYXNlID0gIDg7IGkgKz0gMjsgYnJlYWs7XG4gICAgY2FzZSAgOTg6IGNhc2UgNjY6IGJhc2UgPSAgMjsgaSArPSAyOyBicmVhaztcbiAgICBjYXNlIDExNzogY2FzZSA4NTogaSArPSAyOyBicmVhaztcbiAgICB9XG4gIHJldHVybiBbaSwgc2lnbiwgYmFzZV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZGlnaXRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZGlnaXQoYykge1xuICBpZiAoYyA+PSA0OCAmJiBjIDw9IDU3KSAgcmV0dXJuIGMgLSA0ODtcbiAgaWYgKGMgPj0gNjUgJiYgYyA8PSA5MCkgIHJldHVybiBjIC0gNTU7XG4gIGlmIChjID49IDk3ICYmIGMgPD0gMTIyKSByZXR1cm4gYyAtIDg3O1xuICByZXR1cm4gLTE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSwgY2FtbF9wYXJzZV9kaWdpdCwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9pbnRfb2Zfc3RyaW5nIChzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIChzKTtcbiAgdmFyIGkgPSByWzBdLCBzaWduID0gclsxXSwgYmFzZSA9IHJbMl07XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciB0aHJlc2hvbGQgPSAtMSA+Pj4gMDtcbiAgdmFyIGMgPSAoaSA8IGxlbik/Y2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKTowO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB2YXIgcmVzID0gZDtcbiAgZm9yIChpKys7aTxsZW47aSsrKSB7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT0gOTUpIGNvbnRpbnVlO1xuICAgIGQgPSBjYW1sX3BhcnNlX2RpZ2l0KGMpO1xuICAgIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGJyZWFrO1xuICAgIHJlcyA9IGJhc2UgKiByZXMgKyBkO1xuICAgIGlmIChyZXMgPiB0aHJlc2hvbGQpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB9XG4gIGlmIChpICE9IGxlbikgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIC8vIEZvciBiYXNlIGRpZmZlcmVudCBmcm9tIDEwLCB3ZSBleHBlY3QgYW4gdW5zaWduZWQgcmVwcmVzZW50YXRpb24sXG4gIC8vIGhlbmNlIGFueSB2YWx1ZSBvZiAncmVzJyAobGVzcyB0aGFuICd0aHJlc2hvbGQnKSBpcyBhY2NlcHRhYmxlLlxuICAvLyBCdXQgd2UgaGF2ZSB0byBjb252ZXJ0IHRoZSByZXN1bHQgYmFjayB0byBhIHNpZ25lZCBpbnRlZ2VyLlxuICByZXMgPSBzaWduICogcmVzO1xuICBpZiAoKGJhc2UgPT0gMTApICYmICgocmVzIHwgMCkgIT0gcmVzKSlcbiAgICAvKiBTaWduZWQgcmVwcmVzZW50YXRpb24gZXhwZWN0ZWQsIGFsbG93IC0yXihuYml0cy0xKSB0byAyXihuYml0cy0xKSAtIDEgKi9cbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgcmV0dXJuIHJlcyB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbXVsIGNvbnN0XG5mdW5jdGlvbiBjYW1sX211bChhLGIpe1xuICByZXR1cm4gTWF0aC5pbXVsKGEsYik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGl2XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG5mdW5jdGlvbiBjYW1sX2Rpdih4LHkpIHtcbiAgaWYgKHkgPT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgcmV0dXJuICh4L3kpfDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW9kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG5mdW5jdGlvbiBjYW1sX21vZCh4LHkpIHtcbiAgaWYgKHkgPT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgcmV0dXJuIHgleTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ic3dhcDE2XG5mdW5jdGlvbiBjYW1sX2Jzd2FwMTYoeCkge1xuICByZXR1cm4gKCgoKHggJiAweDAwRkYpIDw8IDgpIHxcbiAgICAgICAgICAgKCh4ICYgMHhGRjAwKSA+PiA4KSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9ic3dhcFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9ic3dhcCh4KSB7XG4gIHJldHVybiAoKCh4ICYgMHgwMDAwMDBGRikgPDwgMjQpIHxcbiAgICAgICAgICAoKHggJiAweDAwMDBGRjAwKSA8PCA4KSB8XG4gICAgICAgICAgKCh4ICYgMHgwMEZGMDAwMCkgPj4+IDgpIHxcbiAgICAgICAgICAoKHggJiAweEZGMDAwMDAwKSA+Pj4gMjQpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYnN3YXBcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMsIGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfYnN3YXAoeCkge1xuICB2YXIgeSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoeCk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFt5WzddLCB5WzZdLCB5WzVdLCB5WzRdLCB5WzNdLCB5WzJdLCB5WzFdLCB5WzBdXSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEhhc2h0YmxcblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX3VuaXZfcGFyYW0gbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfY29udGVudFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2hhc2hfdW5pdl9wYXJhbSAoY291bnQsIGxpbWl0LCBvYmopIHtcbiAgdmFyIGhhc2hfYWNjdSA9IDA7XG4gIGZ1bmN0aW9uIGhhc2hfYXV4IChvYmopIHtcbiAgICBsaW1pdCAtLTtcbiAgICBpZiAoY291bnQgPCAwIHx8IGxpbWl0IDwgMCkgcmV0dXJuO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSAmJiBvYmpbMF0gPT09IChvYmpbMF18MCkpIHtcbiAgICAgIHN3aXRjaCAob2JqWzBdKSB7XG4gICAgICBjYXNlIDI0ODpcbiAgICAgICAgLy8gT2JqZWN0XG4gICAgICAgIGNvdW50IC0tO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogNjU1OTkgKyBvYmpbMl0pIHwgMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MDpcbiAgICAgICAgLy8gRm9yd2FyZFxuICAgICAgICBsaW1pdCsrOyBoYXNoX2F1eChvYmopOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvdW50IC0tO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBvYmpbMF0pIHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IG9iai5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSBoYXNoX2F1eCAob2JqW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMob2JqKSkge1xuICAgICAgY291bnQgLS07XG4gICAgICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudChvYmopO1xuICAgICAgaWYodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0Zm9yICh2YXIgYiA9IGNvbnRlbnQsIGwgPSBiLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYi5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gICAgICB9IGVsc2UgeyAvKiBBUlJBWSAqL1xuICAgICAgICBmb3IgKHZhciBhID0gY29udGVudCwgbCA9IGEubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBhW2ldKSB8IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhvYmopKSB7XG4gICAgICB2YXIganNieXRlcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob2JqKTtcbiAgICAgIGZvciAodmFyIGIgPSBqc2J5dGVzLCBsID0ganNieXRlcy5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBiLmNoYXJDb2RlQXQoaSkpIHwgMDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZvciAodmFyIGIgPSBvYmosIGwgPSBvYmoubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYi5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gICAgfSBlbHNlIGlmIChvYmogPT09IChvYmp8MCkpIHtcbiAgICAgIC8vIEludGVnZXJcbiAgICAgIGNvdW50IC0tO1xuICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDY1NTk5ICsgb2JqKSB8IDA7XG4gICAgfSBlbHNlIGlmIChvYmogPT09ICtvYmopIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBjb3VudC0tO1xuICAgICAgdmFyIHAgPSBjYW1sX2ludDY0X3RvX2J5dGVzIChjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKG9iaikpO1xuICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgaS0tKSBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBwW2ldKSB8IDA7XG4gICAgfSBlbHNlIGlmKG9iaiAmJiBvYmouY2FtbF9jdXN0b20pIHtcbiAgICAgIGlmKGNhbWxfY3VzdG9tX29wc1tvYmouY2FtbF9jdXN0b21dICYmIGNhbWxfY3VzdG9tX29wc1tvYmouY2FtbF9jdXN0b21dLmhhc2gpIHtcbiAgICAgICAgdmFyIGggPSBjYW1sX2N1c3RvbV9vcHNbb2JqLmNhbWxfY3VzdG9tXS5oYXNoKG9iaikgfCAwO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogNjU1OTkgKyBoKSB8IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGhhc2hfYXV4IChvYmopO1xuICByZXR1cm4gaGFzaF9hY2N1ICYgMHgzRkZGRkZGRjtcbn1cblxuLy9mdW5jdGlvbiBST1RMMzIoeCxuKSB7IHJldHVybiAoKHggPDwgbikgfCAoeCA+Pj4gKDMyLW4pKSk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX211bFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQoaCxkKSB7XG4gIGQgPSBjYW1sX211bChkLCAweGNjOWUyZDUxfDApO1xuICBkID0gKChkIDw8IDE1KSB8IChkID4+PiAoMzItMTUpKSk7IC8vIFJPVEwzMihkLCAxNSk7XG4gIGQgPSBjYW1sX211bChkLCAweDFiODczNTkzKTtcbiAgaCBePSBkO1xuICBoID0gKChoIDw8IDEzKSB8IChoID4+PiAoMzItMTMpKSk7ICAgLy9ST1RMMzIoaCwgMTMpO1xuICByZXR1cm4gKCgoaCArIChoIDw8IDIpKXwwKSArICgweGU2NTQ2YjY0fDApKXwwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX211bFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9maW5hbChoKSB7XG4gIGggXj0gaCA+Pj4gMTY7XG4gIGggPSBjYW1sX211bCAoaCwgMHg4NWViY2E2YnwwKTtcbiAgaCBePSBoID4+PiAxMztcbiAgaCA9IGNhbWxfbXVsIChoLCAweGMyYjJhZTM1fDApO1xuICBoIF49IGggPj4+IDE2O1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2hhc2hfbWl4X2ludDY0XG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2Zsb2F0IChoLCB2MCkge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9pbnQ2NChoLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKHYwKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9sbzMyLCBjYW1sX2ludDY0X2hpMzJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50NjQgKGgsIHYpIHtcbiAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGNhbWxfaW50NjRfbG8zMih2KSk7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2hpMzIodikpO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIHMpIHtcbiAgdmFyIGxlbiA9IHMubGVuZ3RoLCBpLCB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzLmNoYXJDb2RlQXQoaSlcbiAgICAgIHwgKHMuY2hhckNvZGVBdChpKzEpIDw8IDgpXG4gICAgICB8IChzLmNoYXJDb2RlQXQoaSsyKSA8PCAxNilcbiAgICAgIHwgKHMuY2hhckNvZGVBdChpKzMpIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICBjYXNlIDM6IHcgID0gcy5jaGFyQ29kZUF0KGkrMikgPDwgMTY7XG4gIGNhc2UgMjogdyB8PSBzLmNoYXJDb2RlQXQoaSsxKSA8PCA4O1xuICBjYXNlIDE6XG4gICAgdyB8PSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICBkZWZhdWx0OlxuICB9XG4gIGggXj0gbGVuO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCwgaSwgdztcbiAgZm9yIChpID0gMDsgaSArIDQgPD0gbGVuOyBpICs9IDQpIHtcbiAgICB3ID0gc1tpXVxuICAgICAgfCAoc1tpKzFdIDw8IDgpXG4gICAgICB8IChzW2krMl0gPDwgMTYpXG4gICAgICB8IChzW2krM10gPDwgMjQpO1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICB3ID0gMDtcbiAgc3dpdGNoIChsZW4gJiAzKSB7XG4gIGNhc2UgMzogdyAgPSBzW2krMl0gPDwgMTY7XG4gIGNhc2UgMjogdyB8PSBzW2krMV0gPDwgODtcbiAgY2FzZSAxOiB3IHw9IHNbaV07XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICBkZWZhdWx0OlxuICB9XG4gIGggXj0gbGVuO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2J5dGVzKGgsIHYpIHtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQodik7XG4gIGlmKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCwgY29udGVudClcbiAgZWxzZSAvKiBBUlJBWSAqL1xuICAgIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdikge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmcodikpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaCBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnQsIGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfZmxvYXQsIGNhbWxfaGFzaF9taXhfc3RyaW5nLCBjYW1sX2hhc2hfbWl4X2J5dGVzLCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9oYXNoIChjb3VudCwgbGltaXQsIHNlZWQsIG9iaikge1xuICB2YXIgcXVldWUsIHJkLCB3ciwgc3osIG51bSwgaCwgdiwgaSwgbGVuO1xuICBzeiA9IGxpbWl0O1xuICBpZiAoc3ogPCAwIHx8IHN6ID4gMjU2KSBzeiA9IDI1NjtcbiAgbnVtID0gY291bnQ7XG4gIGggPSBzZWVkO1xuICBxdWV1ZSA9IFtvYmpdOyByZCA9IDA7IHdyID0gMTtcbiAgd2hpbGUgKHJkIDwgd3IgJiYgbnVtID4gMCkge1xuICAgIHYgPSBxdWV1ZVtyZCsrXTtcbiAgICBpZiAodiAmJiB2LmNhbWxfY3VzdG9tKXtcbiAgICAgIGlmKGNhbWxfY3VzdG9tX29wc1t2LmNhbWxfY3VzdG9tXSAmJiBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCkge1xuICAgICAgICB2YXIgaGggPSBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCh2KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50IChoLCBoaCk7XG4gICAgICAgIG51bSAtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEFycmF5ICYmIHZbMF0gPT09ICh2WzBdfDApKSB7XG4gICAgICBzd2l0Y2ggKHZbMF0pIHtcbiAgICAgIGNhc2UgMjQ4OlxuICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHZbMl0pO1xuICAgICAgICBudW0tLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MDpcbiAgICAgICAgLy8gRm9yd2FyZFxuICAgICAgICBxdWV1ZVstLXJkXSA9IHZbMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIHRhZyA9ICgodi5sZW5ndGggLSAxKSA8PCAxMCkgfCB2WzBdO1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdGFnKTtcbiAgICAgICAgZm9yIChpID0gMSwgbGVuID0gdi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGlmICh3ciA+PSBzeikgYnJlYWs7XG4gICAgICAgICAgcXVldWVbd3IrK10gPSB2W2ldO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfYnl0ZXMoaCx2KVxuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsdilcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCx2KVxuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSAodnwwKSkge1xuICAgICAgLy8gSW50ZWdlclxuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHYrdisxKTtcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodiA9PT0gK3YpIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLHYpO1xuICAgICAgbnVtLS07XG4gICAgfVxuICB9XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpO1xuICByZXR1cm4gaCAmIDB4M0ZGRkZGRkY7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfdGFnKGEpe1xuICBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIpIHJldHVybiAxMDAwOyAvLyBpbnRfdGFnICh3ZSB1c2UgaXQgZm9yIGFsbCBudW1iZXJzKVxuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKGEpKSByZXR1cm4gMjUyOyAvLyBzdHJpbmdfdGFnXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKGEpKSByZXR1cm4gMTI1MjsgLy8gb2NhbWwgc3RyaW5nIChpZiBkaWZmZXJlbnQgZnJvbSBieXRlcylcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIEFycmF5ICYmIGFbMF0gPT09IChhWzBdPj4+MCkgJiYgYVswXSA8PSAyNTUpIHtcbiAgICAvLyBMb29rIGxpa2UgYW4gb2NhbWwgYmxvY2tcbiAgICB2YXIgdGFnID0gYVswXSB8IDA7XG4gICAgLy8gaWdub3JlIGRvdWJsZV9hcnJheV90YWcgYmVjYXVzZSB3ZSBjYW5ub3QgYWNjdXJhdGVseSBzZXRcbiAgICAvLyB0aGlzIHRhZyB3aGVuIHdlIGNyZWF0ZSBhbiBhcnJheSBvZiBmbG9hdC5cbiAgICByZXR1cm4gKHRhZyA9PSAyNTQpPzA6dGFnXG4gIH1cbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIFN0cmluZykgcmV0dXJuIDEyNTIwOyAvLyBqYXZhc2NyaXB0IHN0cmluZywgbGlrZSBzdHJpbmdfdGFnICgyNTIpXG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwic3RyaW5nXCIpIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmIChhIGluc3RhbmNlb2YgTnVtYmVyKSByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoYSAmJiBhLmNhbWxfY3VzdG9tKSByZXR1cm4gMTI1NTsgLy8gbGlrZSBjdXN0b21fdGFnICgyNTUpXG4gIGVsc2UgaWYgKGEgJiYgYS5jb21wYXJlKSByZXR1cm4gMTI1NjsgLy8gbGlrZSBjdXN0b21fdGFnICgyNTUpXG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIDEyNDc7IC8vIGxpa2UgY2xvc3VyZV90YWcgKDI0NylcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT0gXCJzeW1ib2xcIikgcmV0dXJuIDEyNTE7XG4gIHJldHVybiAxMDAxOyAvL291dF9vZl9oZWFwX3RhZ1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpe1xuICByZXR1cm4gY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dICYmIGNhbWxfY3VzdG9tX29wc1thLmNhbWxfY3VzdG9tXS5jb21wYXJlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbVxuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tKG51bSwgY3VzdG9tLCBzd2FwLCB0b3RhbCkge1xuICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShjdXN0b20pO1xuICBpZihjb21wKSB7XG4gICAgdmFyIHggPSAoc3dhcCA+IDApP2NvbXAoY3VzdG9tLG51bSx0b3RhbCk6Y29tcChudW0sY3VzdG9tLHRvdGFsKTtcbiAgICBpZih0b3RhbCAmJiB4ICE9IHgpIHJldHVybiBzd2FwOyAvLyB0b3RhbCAmJiBuYW5cbiAgICBpZigreCAhPSAreCkgcmV0dXJuICt4OyAvLyBuYW5cbiAgICBpZigoeCB8IDApICE9IDApIHJldHVybiAoeCB8IDApOyAvLyAhbmFuXG4gIH1cbiAgcmV0dXJuIHN3YXBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbCAoY29uc3QsIGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW50X2NvbXBhcmUsIGNhbWxfc3RyaW5nX2NvbXBhcmUsIGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20sIGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWwgKGEsIGIsIHRvdGFsKSB7XG4gIHZhciBzdGFjayA9IFtdO1xuICBmb3IoOzspIHtcbiAgICBpZiAoISh0b3RhbCAmJiBhID09PSBiKSkge1xuICAgICAgdmFyIHRhZ19hID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSk7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZih0YWdfYSA9PSAyNTApIHsgYSA9IGFbMV07IGNvbnRpbnVlIH1cblxuICAgICAgdmFyIHRhZ19iID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYik7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZih0YWdfYiA9PSAyNTApIHsgYiA9IGJbMV07IGNvbnRpbnVlIH1cblxuICAgICAgLy8gdGFncyBhcmUgZGlmZmVyZW50XG4gICAgICBpZih0YWdfYSAhPT0gdGFnX2IpIHtcbiAgICAgICAgaWYodGFnX2EgPT0gMTAwMCkge1xuICAgICAgICAgIGlmKHRhZ19iID09IDEyNTUpIHsgLy9pbW1lZGlhdGUgY2FuIGNvbXBhcmUgYWdhaW5zdCBjdXN0b21cbiAgICAgICAgICAgIHJldHVybiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20oYSwgYiwgLTEsIHRvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgaWYodGFnX2IgPT0gMTAwMCkge1xuICAgICAgICAgIGlmKHRhZ19hID09IDEyNTUpIHsgLy9pbW1lZGlhdGUgY2FuIGNvbXBhcmUgYWdhaW5zdCBjdXN0b21cbiAgICAgICAgICAgIHJldHVybiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20oYiwgYSwgMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGFnX2EgPCB0YWdfYik/LTE6MTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCh0YWdfYSl7XG4gICAgICAgIC8vIDI0NjogTGF6eV90YWcgaGFuZGxlZCBiZWxsb3dcbiAgICAgIGNhc2UgMjQ3OiAvLyBDbG9zdXJlX3RhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGZ1bmN0aW9uYWwgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDI0ODogLy8gT2JqZWN0XG4gICAgICAgIHZhciB4ID0gY2FtbF9pbnRfY29tcGFyZShhWzJdLCBiWzJdKTtcbiAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNDk6IC8vIEluZml4XG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjUwOiAvLyBGb3J3YXJkIHRhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgRm9yd2FyZF90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUxOiAvL0Fic3RyYWN0XG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBhYnN0cmFjdCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MjogLy8gT0NhbWwgYnl0ZXNcbiAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICB2YXIgeCA9IGNhbWxfYnl0ZXNfY29tcGFyZShhLCBiKTtcbiAgICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MzogLy8gRG91YmxlX3RhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgRG91YmxlX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheV90YWdcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlbiwgaGFuZGxlZCBhYm92ZVxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IERvdWJsZV9hcnJheV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyNTU6IC8vIEN1c3RvbV90YWdcbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBDdXN0b21fdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNDc6IC8vIEZ1bmN0aW9uXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGZ1bmN0aW9uYWwgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU1OiAvLyBDdXN0b21cbiAgICAgICAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oYSk7XG4gICAgICAgIGlmKGNvbXAgIT0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGIpKXtcbiAgICAgICAgICByZXR1cm4gKGEuY2FtbF9jdXN0b208Yi5jYW1sX2N1c3RvbSk/LTE6MTtcbiAgICAgICAgfVxuICAgICAgICBpZighY29tcClcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBhYnN0cmFjdCB2YWx1ZVwiKTtcbiAgICAgICAgdmFyIHggPSBjb21wKGEsYix0b3RhbCk7XG4gICAgICAgIGlmKHggIT0geCl7IC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIFVOT1JERVJFRFxuICAgICAgICAgIHJldHVybiB0b3RhbD8tMTp4O1xuICAgICAgICB9XG4gICAgICAgIGlmKHggIT09ICh4fDApKXsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU2OiAvLyBjb21wYXJlIGZ1bmN0aW9uXG4gICAgICAgIHZhciB4ID0gYS5jb21wYXJlKGIsdG90YWwpO1xuICAgICAgICBpZih4ICE9IHgpIHsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgcmV0dXJuIHRvdGFsPy0xOng7XG4gICAgICAgIH1cbiAgICAgICAgaWYoeCAhPT0gKHh8MCkpeyAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwMDA6IC8vIE51bWJlclxuICAgICAgICBhID0gK2E7XG4gICAgICAgIGIgPSArYjtcbiAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhICE9IGIpIHtcbiAgICAgICAgICBpZiAoIXRvdGFsKSByZXR1cm4gTmFOO1xuICAgICAgICAgIGlmIChhID09IGEpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChiID09IGIpIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTAwMTogLy8gVGhlIHJlc3RcbiAgICAgICAgLy8gSGVyZSB3ZSBjYW4gYmUgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgICAgICAgLy8gMS4gSmF2YVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy8gMi4gSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy8gMy4gSmF2YVNjcmlwdCBvYmplY3QgdGhhbiBjYW5ub3QgYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gKDMpIHdpbGwgcmFpc2UgYSBbVHlwZUVycm9yXVxuICAgICAgICAvLyAoMikgd2lsbCBjb2VyY2UgdG8gcHJpbWl0aXZlIHR5cGVzIHVzaW5nIFt2YWx1ZU9mXSBvciBbdG9TdHJpbmddXG4gICAgICAgIC8vICgyKSBhbmQgKDMpLCBhZnRlciBldmVudHVhbCBjb2VyY2lvblxuICAgICAgICAvLyAtIGlmIGEgYW5kIGIgYXJlIHN0cmluZ3MsIGFwcGx5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvblxuICAgICAgICAvLyAtIGlmIGEgb3IgYiBhcmUgbm90IHN0cmluZ3MsIGNvbnZlcnQgYSBhbmQgYiB0byBudW1iZXJcbiAgICAgICAgLy8gICBhbmQgYXBwbHkgc3RhbmRhcmQgY29tcGFyaXNvblxuICAgICAgICAvL1xuICAgICAgICAvLyBFeGNlcHRpb246IGAhPWAgd2lsbCBub3QgY29lcmNlL2NvbnZlcnQgaWYgYm90aCBhIGFuZCBiIGFyZSBvYmplY3RzXG4gICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICBpZiAoYSAhPSBiKSB7XG4gICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgICBpZiAoYSA9PSBhKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYiA9PSBiKSByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTE6IC8vIEphdmFTY3JpcHQgU3ltYm9sLCBubyBvcmRlcmluZy5cbiAgICAgICAgaWYoYSAhPT0gYikge1xuICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOYU47XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTI6IC8vIG9jYW1sIHN0cmluZ3NcbiAgICAgICAgdmFyIGEgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGEpO1xuICAgICAgICB2YXIgYiA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYik7XG4gICAgICAgIGlmKGEgIT09IGIpIHtcbiAgICAgICAgICBpZihhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1MjA6IC8vIGphdmFzY3JpcHQgc3RyaW5nc1xuICAgICAgICB2YXIgYSA9IGEudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIGIgPSBiLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmKGEgIT09IGIpIHtcbiAgICAgICAgICBpZihhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjQ2OiAvLyBMYXp5X3RhZ1xuICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheVxuICAgICAgZGVmYXVsdDogLy8gQmxvY2sgd2l0aCBvdGhlciB0YWdcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gKGEubGVuZ3RoIDwgYi5sZW5ndGgpPy0xOjE7XG4gICAgICAgIGlmIChhLmxlbmd0aCA+IDEpIHN0YWNrLnB1c2goYSwgYiwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhY2subGVuZ3RoID09IDApIHJldHVybiAwO1xuICAgIHZhciBpID0gc3RhY2sucG9wKCk7XG4gICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoaSArIDEgPCBhLmxlbmd0aCkgc3RhY2sucHVzaChhLCBiLCBpICsgMSk7XG4gICAgYSA9IGFbaV07XG4gICAgYiA9IGJbaV07XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9jb21wYXJlIChhLCBiKSB7IHJldHVybiBjYW1sX2NvbXBhcmVfdmFsIChhLCBiLCB0cnVlKTsgfVxuLy9Qcm92aWRlczogY2FtbF9pbnRfY29tcGFyZSBtdXRhYmxlIChjb25zdCwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2ludF9jb21wYXJlIChhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuICgtMSk7IGlmIChhID09IGIpIHJldHVybiAwOyByZXR1cm4gMTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9lcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPT0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbm90ZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ub3RlcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgIT0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JlYXRlcmVxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZ3JlYXRlcmVxdWFsICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA+PSAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9ncmVhdGVydGhhbiBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJ0aGFuICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA+IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3NlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3NlcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPD0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbGVzc3RoYW4gbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzdGhhbiAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPCAwKTsgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgbGlicmFyeVxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEpzbGliOiBjb2RlIHNwZWNpZmljIHRvIEpzX29mX29jYW1sXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfb25faWUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfb25faWUgKCkge1xuICB2YXIgdWEgPVxuICAgICAgZ2xvYmFsVGhpcy5uYXZpZ2F0b3I/Z2xvYmFsVGhpcy5uYXZpZ2F0b3IudXNlckFnZW50OlwiXCI7XG4gIHJldHVybiB1YS5pbmRleE9mKFwiTVNJRVwiKSAhPSAtMSAmJiB1YS5pbmRleE9mKFwiT3BlcmFcIikgIT0gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VzY2FwZSBjb25zdCAoY29uc3QpXG52YXIgY2FtbF9qc19yZWdleHBzID0geyBhbXA6LyYvZywgbHQ6LzwvZywgcXVvdDovXFxcIi9nLCBhbGw6L1smPFxcXCJdLyB9O1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VzY2FwZSAocykge1xuICBpZiAoIWNhbWxfanNfcmVnZXhwcy5hbGwudGVzdChzKSkgcmV0dXJuIHM7XG4gIHJldHVybiBzLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmFtcCwgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKGNhbWxfanNfcmVnZXhwcy5sdCwgXCImbHQ7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLnF1b3QsIFwiJnF1b3Q7XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2h0bWxfZW50aXRpZXNcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfanNfaHRtbF9lbnRpdGllcyhzKSB7XG4gIHZhciBlbnRpdHkgPSAvXiYjP1swLTlhLXpBLVpdKzskL1xuICBpZihzLm1hdGNoKGVudGl0eSkpXG4gIHtcbiAgICB2YXIgc3RyLCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIHRlbXAuaW5uZXJIVE1MPSBzO1xuICAgIHN0cj0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dDtcbiAgICB0ZW1wPW51bGw7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBlbHNlIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiSW52YWxpZCBlbnRpdHkgXCIgKyBzKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldF9jb25zb2xlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2pzX2dldF9jb25zb2xlICgpIHtcbiAgdmFyIGMgPSBnbG9iYWxUaGlzLmNvbnNvbGU/Z2xvYmFsVGhpcy5jb25zb2xlOnt9O1xuICB2YXIgbSA9IFtcImxvZ1wiLCBcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiLCBcImFzc2VydFwiLCBcImRpclwiLCBcImRpcnhtbFwiLFxuICAgICAgICAgICBcInRyYWNlXCIsIFwiZ3JvdXBcIiwgXCJncm91cENvbGxhcHNlZFwiLCBcImdyb3VwRW5kXCIsIFwidGltZVwiLCBcInRpbWVFbmRcIl07XG4gIGZ1bmN0aW9uIGYgKCkge31cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSBpZiAoIWNbbVtpXV0pIGNbbVtpXV09ZjtcbiAgcmV0dXJuIGM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlKHVuaXQpe1xuICB2YXIgZyA9IGdsb2JhbFRoaXM7XG4gIGlmKHR5cGVvZiBnLlhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7IHJldHVybiBuZXcgZy5YTUxIdHRwUmVxdWVzdCB9IGNhdGNoIChlKSB7IH07XG4gIH1cbiAgaWYodHlwZW9mIGcuYWN0aXZlWE9iamVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkgeyByZXR1cm4gbmV3IGcuYWN0aXZlWE9iamVjdChcIk1zeG1sMi5YTUxIVFRQXCIpIH0gY2F0Y2goZSl7IH07XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBnLmFjdGl2ZVhPYmplY3QoXCJNc3htbDMuWE1MSFRUUFwiKSB9IGNhdGNoKGUpeyB9O1xuICAgIHRyeSB7IHJldHVybiBuZXcgZy5hY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIikgfSBjYXRjaChlKXsgfTtcbiAgfVxuICBjYW1sX2ZhaWx3aXRoKFwiQ2Fubm90IGNyZWF0ZSBhIFhNTEh0dHBSZXF1ZXN0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmKGV4bi5qc19lcnJvcikgeyByZXR1cm4gZXhuLmpzX2Vycm9yOyB9XG4gIHJldHVybiBudWxsO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF91cGRhdGVfZHVtbXlcbmZ1bmN0aW9uIGNhbWxfdXBkYXRlX2R1bW15ICh4LCB5KSB7XG4gIGlmKCB0eXBlb2YgeT09PVwiZnVuY3Rpb25cIiApIHsgeC5mdW4gPSB5OyByZXR1cm4gMDsgfVxuICBpZiggeS5mdW4gKSB7IHguZnVuID0geS5mdW47IHJldHVybiAwOyB9XG4gIHZhciBpID0geS5sZW5ndGg7IHdoaWxlIChpLS0pIHhbaV0gPSB5W2ldOyByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfaXNfYmxvY2sgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfaXNfYmxvY2sgKHgpIHsgcmV0dXJuICsoeCBpbnN0YW5jZW9mIEFycmF5KTsgfVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfb2JqX3RhZyAoeCkge1xuICBpZiAoKHggaW5zdGFuY2VvZiBBcnJheSkgJiYgeFswXSA9PSAoeFswXSA+Pj4gMCkpXG4gICAgcmV0dXJuIHhbMF1cbiAgZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh4KSlcbiAgICByZXR1cm4gMjUyXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHgpKVxuICAgIHJldHVybiAyNTJcbiAgZWxzZSBpZiAoKHggaW5zdGFuY2VvZiBGdW5jdGlvbikgfHwgdHlwZW9mIHggPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiAyNDdcbiAgZWxzZSBpZiAoeCAmJiB4LmNhbWxfY3VzdG9tKVxuICAgIHJldHVybiAyNTVcbiAgZWxzZVxuICAgIHJldHVybiAxMDAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF90YWcgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfc2V0X3RhZyAoeCwgdGFnKSB7IHhbMF0gPSB0YWc7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX29ial9ibG9jayBjb25zdCAoY29uc3QsY29uc3QpXG5mdW5jdGlvbiBjYW1sX29ial9ibG9jayAodGFnLCBzaXplKSB7XG4gIHZhciBvID0gbmV3IEFycmF5KHNpemUrMSk7XG4gIG9bMF09dGFnO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzaXplOyBpKyspIG9baV0gPSAwO1xuICByZXR1cm4gbztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfd2l0aF90YWdcbmZ1bmN0aW9uIGNhbWxfb2JqX3dpdGhfdGFnKHRhZyx4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gdGFnO1xuICBmb3IodmFyIGkgPSAxOyBpIDwgbDsgaSsrICkgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9kdXAgbXV0YWJsZSAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX29ial9kdXAgKHgpIHtcbiAgdmFyIGwgPSB4Lmxlbmd0aDtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKysgKSBhW2ldID0geFtpXTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RydW5jYXRlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9vYmpfdHJ1bmNhdGUgKHgsIHMpIHtcbiAgaWYgKHM8PTAgfHwgcyArIDEgPiB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiT2JqLnRydW5jYXRlXCIpO1xuICBpZiAoeC5sZW5ndGggIT0gcyArIDEpIHgubGVuZ3RoID0gcyArIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9tYWtlX2ZvcndhcmRcbmZ1bmN0aW9uIGNhbWxfb2JqX21ha2VfZm9yd2FyZCAoYix2KSB7XG4gIGJbMF09MjUwO1xuICBiWzFdPXY7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9sYXp5X21ha2VfZm9yd2FyZCAodikgeyByZXR1cm4gWzI1MCwgdl07IH1cblxuLy8vLy8vLy8vLy8vLyBDYW1saW50ZXJuYWxPT1xuLy9Qcm92aWRlczogY2FtbF9nZXRfcHVibGljX21ldGhvZCBjb25zdFxudmFyIGNhbWxfbWV0aG9kX2NhY2hlID0gW107XG5mdW5jdGlvbiBjYW1sX2dldF9wdWJsaWNfbWV0aG9kIChvYmosIHRhZywgY2FjaGVpZCkge1xuICB2YXIgbWV0aHMgPSBvYmpbMV07XG4gIHZhciBvZnMgPSBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXTtcbiAgaWYgKG9mcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBpcyBub3Qgc3BhcnNlXG4gICAgZm9yICh2YXIgaSA9IGNhbWxfbWV0aG9kX2NhY2hlLmxlbmd0aDsgaSA8IGNhY2hlaWQ7IGkrKylcbiAgICAgIGNhbWxfbWV0aG9kX2NhY2hlW2ldID0gMDtcbiAgfSBlbHNlIGlmIChtZXRoc1tvZnNdID09PSB0YWcpIHtcbiAgICByZXR1cm4gbWV0aHNbb2ZzIC0gMV07XG4gIH1cbiAgdmFyIGxpID0gMywgaGkgPSBtZXRoc1sxXSAqIDIgKyAxLCBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkraGkpID4+IDEpIHwgMTtcbiAgICBpZiAodGFnIDwgbWV0aHNbbWkrMV0pIGhpID0gbWktMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF0gPSBsaSArIDE7XG4gIC8qIHJldHVybiAwIGlmIHRhZyBpcyBub3QgdGhlcmUgKi9cbiAgcmV0dXJuICh0YWcgPT0gbWV0aHNbbGkrMV0gPyBtZXRoc1tsaV0gOiAwKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vb19sYXN0X2lkXG52YXIgY2FtbF9vb19sYXN0X2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9zZXRfb29faWRcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9zZXRfb29faWQgKGIpIHtcbiAgYlsyXT1jYW1sX29vX2xhc3RfaWQrKztcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZnJlc2hfb29faWQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9mcmVzaF9vb19pZCgpIHtcbiAgcmV0dXJuIGNhbWxfb29fbGFzdF9pZCsrO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3Jhd19maWVsZChvLGkpIHsgcmV0dXJuIG9baSsxXSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF9yYXdfZmllbGQobyxpLHYpIHsgcmV0dXJuIG9baSsxXSA9IHYgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9yZWFjaGFibGVfd29yZHNcbmZ1bmN0aW9uIGNhbWxfb2JqX3JlYWNoYWJsZV93b3JkcyhvKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2FkZF9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfb2JqX2FkZF9vZmZzZXQodixvZmZzZXQpIHtcbiAgY2FtbF9mYWlsd2l0aChcIk9iai5hZGRfb2Zmc2V0IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG59XG4iLCIvLy8vLy8vLy8gQklHU1RSSU5HXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9iaWdzdHJpbmcoaCwgYnMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsYnMuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlcihicykge1xuICByZXR1cm4gYnMuZGF0YS5idWZmZXJcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5IG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b190eXBlZF9hcnJheShicykge1xuICByZXR1cm4gYnMuZGF0YVxufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlcihhYikge1xuICB2YXIgdGEgPSBuZXcgZ2xvYmFsVGhpcy5VaW50OEFycmF5KGFiKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5KGJhKSB7XG4gIHZhciB0YSA9IG5ldyBnbG9iYWxUaGlzLlVpbnQ4QXJyYXkoYmEuYnVmZmVyLCBiYS5ieXRlT2Zmc2V0LCBiYS5sZW5ndGggKiBiYS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX21lbWNtcFxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfbWVtY21wKHMxLCBwb3MxLCBzMiwgcG9zMiwgbGVuKXtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBhID0gY2FtbF9iYV9nZXRfMShzMSxwb3MxICsgaSk7XG4gICAgdmFyIGIgPSBjYW1sX2JhX2dldF8xKHMyLHBvczIgKyBpKTtcbiAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmEoYmExLCBwb3MxLCBiYTIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMS5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKDEyICE9IGJhMi5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKG9mczEgKyBsZW4gPiBiYTEuZGF0YS5sZW5ndGgpe1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gYmExLmRhdGEuc3ViYXJyYXkob2ZzMSxvZnMxK2xlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSxwb3MyKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKHBvczEgKyBsZW4gPiBjYW1sX21sX3N0cmluZ19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYob2ZzMiArIGxlbiA+IGJhMi5kYXRhLmxlbmd0aCkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBjYW1sX2FycmF5X29mX3N0cmluZyhzdHIxKS5zbGljZShwb3MxLHBvczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2Usb2ZzMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYnl0ZXNfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYnl0ZXNfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKHBvczEgKyBsZW4gPiBjYW1sX21sX2J5dGVzX2xlbmd0aChzdHIxKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGNhbWxfYXJyYXlfb2ZfYnl0ZXMoc3RyMSkuc2xpY2UocG9zMSxwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLG9mczIpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXMoYmExLCBwb3MxLCBieXRlczIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMS5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZihsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMxID0gYmExLm9mZnNldChwb3MxKTtcbiAgaWYob2ZzMSArIGxlbiA+IGJhMS5kYXRhLmxlbmd0aCl7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmKHBvczIgKyBsZW4gPiBjYW1sX21sX2J5dGVzX2xlbmd0aChieXRlczIpKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gYmExLmRhdGEuc2xpY2Uob2ZzMSwgb2ZzMStsZW4pO1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl9hcnJheShzbGljZSksIDAsIGJ5dGVzMiwgcG9zMiwgbGVuKTtcbiAgcmV0dXJuIDBcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMgKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9iYWNrdHJhY2Vfc3RhdHVzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2JhY2t0cmFjZV9zdGF0dXMgKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSAoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UgKCkgeyByZXR1cm4gWzBdOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfcmVjb3JkX2JhY2t0cmFjZSAoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgKCkgeyByZXR1cm4gWzBdOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbGVuZ3RoKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdCgpIHsgcmV0dXJuIDAgfVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QgKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZV9zbG90OiBpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfcmVzdG9yZV9yYXdfYmFja3RyYWNlKGV4biwgYnQpIHsgcmV0dXJuIDAgfVxuLy9Qcm92aWRlczogY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrICgpIHsgcmV0dXJuIFswXTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90KCl7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCIpO1xufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUgQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAqL1xuLyogIGVuIEF1dG9tYXRpcXVlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCAgICAqL1xuLyogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aXRoICAgICAqL1xuLyogIHRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiBmaWxlIC4uL0xJQ0VOU0UuICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKiAkSWQ6IGxleGluZy5jIDYwNDUgMjAwNC0wMS0wMSAxNjo0Mjo0M1ogZG9saWdleiAkICovXG5cbi8qIFRoZSB0YWJsZS1kcml2ZW4gYXV0b21hdG9uIGZvciBsZXhlcnMgZ2VuZXJhdGVkIGJ5IGNhbWxsZXguICovXG5cbi8vUHJvdmlkZXM6IGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2xleF9hcnJheShzKSB7XG4gIHMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpO1xuICB2YXIgbCA9IHMubGVuZ3RoIC8gMjtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgIGFbaV0gPSAocy5jaGFyQ29kZUF0KDIgKiBpKSB8IChzLmNoYXJDb2RlQXQoMiAqIGkgKyAxKSA8PCA4KSkgPDwgMTYgPj4gMTY7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5LCBjYW1sX2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuXG4gIGlmICghdGJsLmxleF9kZWZhdWx0KSB7XG4gICAgdGJsLmxleF9iYXNlID0gICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFzZV0pO1xuICAgIHRibC5sZXhfYmFja3RyayA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfZGVmYXVsdF0pO1xuICB9XG5cbiAgdmFyIGMsIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGNhbWxfYXJyYXlfb2ZfYnl0ZXMobGV4YnVmW2xleF9idWZmZXJdKTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvcig7Oykge1xuICAgIC8qIExvb2t1cCBiYXNlIGFkZHJlc3Mgb3IgYWN0aW9uIG51bWJlciBmb3IgY3VycmVudCBzdGF0ZSAqL1xuICAgIHZhciBiYXNlID0gdGJsLmxleF9iYXNlW3N0YXRlXTtcbiAgICBpZiAoYmFzZSA8IDApIHJldHVybiAtYmFzZS0xO1xuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IGJhY2t0cms7XG4gICAgfVxuICAgIC8qIFNlZSBpZiB3ZSBuZWVkIGEgcmVmaWxsICovXG4gICAgaWYgKGxleGJ1ZltsZXhfY3Vycl9wb3NdID49IGxleGJ1ZltsZXhfYnVmZmVyX2xlbl0pe1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09IDApXG4gICAgICAgIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZVxuICAgICAgICBjID0gMjU2O1xuICAgIH1lbHNle1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBidWZmZXJbbGV4YnVmW2xleF9jdXJyX3Bvc11dO1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09IHN0YXRlKVxuICAgICAgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfZGVmYXVsdFtzdGF0ZV07XG4gICAgLyogSWYgbm8gdHJhbnNpdGlvbiBvbiB0aGlzIGNoYXIsIHJldHVybiB0byBsYXN0IGJhY2t0cmFjayBwb2ludCAqL1xuICAgIGlmIChzdGF0ZSA8IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdID0gbGV4YnVmW2xleF9sYXN0X3Bvc107XG4gICAgICBpZiAobGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPT0gLTEpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfWVsc2V7XG4gICAgICAvKiBFcmFzZSB0aGUgRU9GIGNvbmRpdGlvbiBvbmx5IGlmIHRoZSBFT0YgcHNldWRvLWNoYXJhY3RlciB3YXNcbiAgICAgICAgIGNvbnN1bWVkIGJ5IHRoZSBhdXRvbWF0b24gKGkuZS4gdGhlcmUgd2FzIG5vIGJhY2t0cmFjayBhYm92ZSlcbiAgICAgICovXG4gICAgICBpZiAoYyA9PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogTmV3IGxleGVyIGVuZ2luZSwgd2l0aCBtZW1vcnkgb2YgcG9zaXRpb25zICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9sZXhfcnVuX21lbShzLCBpLCBtZW0sIGN1cnJfcG9zKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZHN0ID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKGRzdCA9PSAweGZmKSByZXR1cm47XG4gICAgdmFyIHNyYyA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChzcmMgPT0gMHhmZilcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSBjdXJyX3BvcztcbiAgICBlbHNlXG4gICAgICBtZW0gW2RzdCArIDFdID0gbWVtIFtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fdGFnKHMsIGksIG1lbSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChkc3QgPT0gMHhmZikgcmV0dXJuIDtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKHNyYyA9PSAweGZmKVxuICAgICAgbWVtIFtkc3QgKyAxXSA9IC0xO1xuICAgIGVsc2VcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSBtZW0gW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbmV3X2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9tZW0gPSAxMDtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuICB2YXIgbGV4X2Jhc2VfY29kZSA9IDY7XG4gIHZhciBsZXhfYmFja3Rya19jb2RlID0gNztcbiAgdmFyIGxleF9kZWZhdWx0X2NvZGUgPSA4O1xuICB2YXIgbGV4X3RyYW5zX2NvZGUgPSA5O1xuICB2YXIgbGV4X2NoZWNrX2NvZGUgPSAxMDtcbiAgdmFyIGxleF9jb2RlID0gMTE7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSAgICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYXNlXSk7XG4gICAgdGJsLmxleF9iYWNrdHJrID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFja3Rya10pO1xuICAgIHRibC5sZXhfY2hlY2sgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2NoZWNrXSk7XG4gICAgdGJsLmxleF90cmFucyA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfdHJhbnNdKTtcbiAgICB0YmwubGV4X2RlZmF1bHQgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHRfY29kZSkge1xuICAgIHRibC5sZXhfYmFzZV9jb2RlID0gICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFzZV9jb2RlXSk7XG4gICAgdGJsLmxleF9iYWNrdHJrX2NvZGUgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYWNrdHJrX2NvZGVdKTtcbiAgICB0YmwubGV4X2NoZWNrX2NvZGUgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2NoZWNrX2NvZGVdKTtcbiAgICB0YmwubGV4X3RyYW5zX2NvZGUgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X3RyYW5zX2NvZGVdKTtcbiAgICB0YmwubGV4X2RlZmF1bHRfY29kZSA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2RlZmF1bHRfY29kZV0pO1xuICB9XG4gIGlmICh0YmwubGV4X2NvZGUgPT0gbnVsbCkgdGJsLmxleF9jb2RlID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh0YmxbbGV4X2NvZGVdKTtcblxuICB2YXIgYywgc3RhdGUgPSBzdGFydF9zdGF0ZTtcblxuICB2YXIgYnVmZmVyID0gY2FtbF9hcnJheV9vZl9ieXRlcyhsZXhidWZbbGV4X2J1ZmZlcl0pO1xuXG4gIGlmIChzdGF0ZSA+PSAwKSB7XG4gICAgLyogRmlyc3QgZW50cnkgKi9cbiAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfc3RhcnRfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgLyogUmVlbnRyeSBhZnRlciByZWZpbGwgKi9cbiAgICBzdGF0ZSA9IC1zdGF0ZSAtIDE7XG4gIH1cbiAgZm9yKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkge1xuICAgICAgdmFyIHBjX29mZiA9IHRibC5sZXhfYmFzZV9jb2RlW3N0YXRlXTtcbiAgICAgIGNhbWxfbGV4X3J1bl90YWcodGJsLmxleF9jb2RlLCBwY19vZmYsIGxleGJ1ZltsZXhfbWVtXSk7XG4gICAgICByZXR1cm4gLWJhc2UtMTtcbiAgICB9XG4gICAgLyogU2VlIGlmIGl0J3MgYSBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICB2YXIgYmFja3RyayA9IHRibC5sZXhfYmFja3Rya1tzdGF0ZV07XG4gICAgaWYgKGJhY2t0cmsgPj0gMCkge1xuICAgICAgdmFyIHBjX29mZiA9IHRibC5sZXhfYmFja3Rya19jb2RlW3N0YXRlXTtcbiAgICAgIGNhbWxfbGV4X3J1bl90YWcodGJsLmxleF9jb2RlLCBwY19vZmYsIGxleGJ1ZltsZXhfbWVtXSk7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKXtcbiAgICAgIGlmIChsZXhidWZbbGV4X2VvZl9yZWFjaGVkXSA9PSAwKVxuICAgICAgICByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2VcbiAgICAgICAgYyA9IDI1NjtcbiAgICB9ZWxzZXtcbiAgICAgIC8qIFJlYWQgbmV4dCBpbnB1dCBjaGFyICovXG4gICAgICBjID0gYnVmZmVyW2xleGJ1ZltsZXhfY3Vycl9wb3NdXTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdICsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIHZhciBwc3RhdGUgPSBzdGF0ZSA7XG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09IHN0YXRlKVxuICAgICAgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfZGVmYXVsdFtzdGF0ZV07XG4gICAgLyogSWYgbm8gdHJhbnNpdGlvbiBvbiB0aGlzIGNoYXIsIHJldHVybiB0byBsYXN0IGJhY2t0cmFjayBwb2ludCAqL1xuICAgIGlmIChzdGF0ZSA8IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdID0gbGV4YnVmW2xleF9sYXN0X3Bvc107XG4gICAgICBpZiAobGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPT0gLTEpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfWVsc2V7XG4gICAgICAvKiBJZiBzb21lIHRyYW5zaXRpb24sIGdldCBhbmQgcGVyZm9ybSBtZW1vcnkgbW92ZXMgKi9cbiAgICAgIHZhciBiYXNlX2NvZGUgPSB0YmwubGV4X2Jhc2VfY29kZVtwc3RhdGVdLCBwY19vZmY7XG4gICAgICBpZiAodGJsLmxleF9jaGVja19jb2RlW2Jhc2VfY29kZSArIGNdID09IHBzdGF0ZSlcbiAgICAgICAgcGNfb2ZmID0gdGJsLmxleF90cmFuc19jb2RlW2Jhc2VfY29kZSArIGNdO1xuICAgICAgZWxzZVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X2RlZmF1bHRfY29kZVtwc3RhdGVdO1xuICAgICAgaWYgKHBjX29mZiA+IDApXG4gICAgICAgIGNhbWxfbGV4X3J1bl9tZW1cbiAgICAgICh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dLCBsZXhidWZbbGV4X2N1cnJfcG9zXSk7XG4gICAgICAvKiBFcmFzZSB0aGUgRU9GIGNvbmRpdGlvbiBvbmx5IGlmIHRoZSBFT0YgcHNldWRvLWNoYXJhY3RlciB3YXNcbiAgICAgICAgIGNvbnN1bWVkIGJ5IHRoZSBhdXRvbWF0b24gKGkuZS4gdGhlcmUgd2FzIG5vIGJhY2t0cmFjayBhYm92ZSlcbiAgICAgICovXG4gICAgICBpZiAoYyA9PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gQXJyYXlcblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zdWIgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9zdWIgKGEsIGksIGxlbikge1xuICB2YXIgYTIgPSBuZXcgQXJyYXkobGVuKzEpO1xuICBhMlswXT0wO1xuICBmb3IodmFyIGkyID0gMSwgaTE9IGkrMTsgaTIgPD0gbGVuOyBpMisrLGkxKysgKXtcbiAgICBhMltpMl09YVtpMV07XG4gIH1cbiAgcmV0dXJuIGEyO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2FwcGVuZCBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X2FwcGVuZChhMSwgYTIpIHtcbiAgdmFyIGwxID0gYTEubGVuZ3RoLCBsMiA9IGEyLmxlbmd0aDtcbiAgdmFyIGwgPSBsMStsMi0xXG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gMDtcbiAgdmFyIGkgPSAxLGogPSAxO1xuICBmb3IoO2k8bDE7aSsrKSBhW2ldPWExW2ldO1xuICBmb3IoO2k8bDtpKyssaisrKSBhW2ldPWEyW2pdO1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9jb25jYXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9ibGl0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfYmxpdChhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIGlmIChpMiA8PSBpMSkge1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IGxlbjsgaisrKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBqID0gbGVuOyBqID49IDE7IGotLSkgYTJbaTIgKyBqXSA9IGExW2kxICsgal07XG4gIH07XG4gIHJldHVybiAwO1xufVxuXG4vLy8vLy8vLy8vLy8vIFBlcnZhc2l2ZVxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zZXQgKG11dGFibGUsIGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc2V0IChhcnJheSwgaW5kZXgsIG5ld3ZhbCkge1xuICBpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGFycmF5Lmxlbmd0aCAtIDEpKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGFycmF5W2luZGV4KzFdPW5ld3ZhbDsgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfZ2V0IG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfZ2V0IChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBhcnJheS5sZW5ndGggLSAxKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXlbaW5kZXgrMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfZmlsbFxuZnVuY3Rpb24gY2FtbF9hcnJheV9maWxsKGFycmF5LCBvZnMsIGxlbiwgdil7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgYXJyYXlbb2ZzK2krMV0gPSB2O1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoZWNrX2JvdW5kIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2NoZWNrX2JvdW5kIChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4+PiAwID49IGFycmF5Lmxlbmd0aCAtIDEpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfdmVjdCBjb25zdCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX3ZlY3QgKGxlbiwgaW5pdCkge1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IGluaXQ7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfZmxvYXRfdmVjdCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX21ha2VfZmxvYXRfdmVjdChsZW4pe1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MjU0O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gMDtcbiAgcmV0dXJuIGJcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9jcmVhdGUgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2NyZWF0ZShsZW4pe1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MjU0O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gMDtcbiAgcmV0dXJuIGJcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBXZWFrIEFQSSwgYnV0IHdpdGhvdXQgdGhlIHdlYWsgc2VtYW50aWNzXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2tleV9vZmZzZXQgPSAzXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxudmFyIGNhbWxfZXBoZV9kYXRhX29mZnNldCA9IDJcblxuLy9Qcm92aWRlczogY2FtbF93ZWFrX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXQsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF93ZWFrX2NyZWF0ZSAobikge1xuICBpZiAobiA8IDApIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLmNyZWF0ZVwiKTtcbiAgdmFyIHggPSBbMjUxLFwiY2FtbF9lcGhlX2xpc3RfaGVhZFwiXTtcbiAgeC5sZW5ndGggPSBjYW1sX2VwaGVfa2V5X29mZnNldCArIG47XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3dlYWtfc2V0KHgsIGksIHYpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLnNldFwiKTtcbiAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdjtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3dlYWtfZ2V0KHgsIGkpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLmdldF9rZXlcIik7XG4gIHJldHVybiAoeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgXT09PXVuZGVmaW5lZCk/MDp4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfZ2V0X2NvcHlcbi8vUmVxdWlyZXM6IGNhbWxfd2Vha19nZXQsY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3dlYWtfZ2V0X2NvcHkoeCwgaSkge1xuICBpZihpIDwgMCB8fCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgPj0geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuZ2V0X2NvcHlcIik7XG4gIHZhciB5ID0gY2FtbF93ZWFrX2dldCh4LCBpKTtcbiAgaWYgKHkgPT09IDApIHJldHVybiB5O1xuICB2YXIgeiA9IHlbMV07XG4gIGlmICh6IGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBbMCwgY2FtbF9vYmpfZHVwKHopXTtcbiAgcmV0dXJuIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19jaGVjayBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuZnVuY3Rpb24gY2FtbF93ZWFrX2NoZWNrKHgsIGkpIHtcbiAgaWYoeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldIT09dW5kZWZpbmVkICYmIHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXSAhPT0wKVxuICAgIHJldHVybiAxO1xuICBlbHNlXG4gICAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX3dlYWtfYmxpdChhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIC8vIG1pbnVzIG9uZSBiZWNhdXNlIGNhbWxfYXJyYXlfYmxpdCB3b3JrcyBvbiBvY2FtbCBhcnJheVxuICBjYW1sX2FycmF5X2JsaXQoYTEsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTEgLSAxLFxuICAgICAgICAgICAgICAgICAgYTIsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTIgLSAxLFxuICAgICAgICAgICAgICAgICAgbGVuKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfd2Vha19jcmVhdGVcbnZhciBjYW1sX2VwaGVfY3JlYXRlID0gY2FtbF93ZWFrX2NyZWF0ZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfd2Vha19ibGl0XG52YXIgY2FtbF9lcGhlX2JsaXRfa2V5ID0gY2FtbF93ZWFrX2JsaXRcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfd2Vha19nZXRcbnZhciBjYW1sX2VwaGVfZ2V0X2tleSA9IGNhbWxfd2Vha19nZXRcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlfY29weVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX2dldF9jb3B5XG52YXIgY2FtbF9lcGhlX2dldF9rZXlfY29weSA9IGNhbWxfd2Vha19nZXRfY29weVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX3dlYWtfY2hlY2tcbnZhciBjYW1sX2VwaGVfY2hlY2tfa2V5ID0gY2FtbF93ZWFrX2NoZWNrXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9zZXRfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX3dlYWtfc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2tleSh4LCBpLCB2KSB7XG4gIHJldHVybiBjYW1sX3dlYWtfc2V0KHgsIGksIFswLCB2XSlcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX3NldFxuZnVuY3Rpb24gY2FtbF9lcGhlX3Vuc2V0X2tleSh4LCBpKSB7XG4gIHJldHVybiBjYW1sX3dlYWtfc2V0KHgsIGksIDApXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfZGF0YShzcmMsIGRzdCl7XG4gIGRzdFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID0gc3JjW2NhbWxfZXBoZV9kYXRhX29mZnNldF07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhKHgpe1xuICBpZih4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gMDtcbiAgZWxzZVxuICAgIHJldHVybiBbMCwgeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9vYmpfZHVwXG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2RhdGFfY29weSh4KXtcbiAgaWYoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0pXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfZGF0YSh4LCBkYXRhKXtcbiAgeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID0gZGF0YTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9kYXRhKHgsIGRhdGEpe1xuICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSB1bmRlZmluZWQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfY2hlY2tfZGF0YSh4KXtcbiAgaWYoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gMTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X2NoYW5cbi8vUmVxdWlyZXM6IGNhbWxfbWQ1X3N0cmluZywgY2FtbF9zdHJpbmdfb2ZfYXJyYXksY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX21kNV9jaGFuKGNoYW5pZCxsZW4pe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIGNoYW5fbGVuID0gY2hhbi5maWxlLmxlbmd0aCgpO1xuICBpZihsZW48MCkgbGVuID0gY2hhbl9sZW4gLSBjaGFuLm9mZnNldDtcbiAgaWYoY2hhbi5vZmZzZXQgKyBsZW4gPiBjaGFuX2xlbikgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICB2YXIgYnVmID0gY2FtbF9jcmVhdGVfYnl0ZXMobGVuKTtcbiAgY2hhbi5maWxlLnJlYWQoY2hhbi5vZmZzZXQsYnVmLDAsbGVuKTtcbiAgcmV0dXJuIGNhbWxfbWQ1X3N0cmluZyhjYW1sX3N0cmluZ19vZl9ieXRlcyhidWYpLDAsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX3N0cmluZywgY2FtbF9tZDVfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWQ1X3N0cmluZyhzLCBvZnMsIGxlbikge1xuICByZXR1cm4gY2FtbF9tZDVfYnl0ZXMoY2FtbF9ieXRlc19vZl9zdHJpbmcocyksb2ZzLGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheSwgY2FtbF9tbF9ieXRlc19jb250ZW50XG52YXIgY2FtbF9tZDVfYnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGFkZCAoeCwgeSkgeyByZXR1cm4gKHggKyB5KSB8IDA7IH1cbiAgZnVuY3Rpb24geHgocSxhLGIseCxzLHQpIHtcbiAgICBhID0gYWRkKGFkZChhLCBxKSwgYWRkKHgsIHQpKTtcbiAgICByZXR1cm4gYWRkKChhIDw8IHMpIHwgKGEgPj4+ICgzMiAtIHMpKSwgYik7XG4gIH1cbiAgZnVuY3Rpb24gZmYoYSxiLGMsZCx4LHMsdCkge1xuICAgIHJldHVybiB4eCgoYiAmIGMpIHwgKCh+YikgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gZ2coYSxiLGMsZCx4LHMsdCkge1xuICAgIHJldHVybiB4eCgoYiAmIGQpIHwgKGMgJiAofmQpKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gaGgoYSxiLGMsZCx4LHMsdCkgeyByZXR1cm4geHgoYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTsgfVxuICBmdW5jdGlvbiBpaShhLGIsYyxkLHgscyx0KSB7IHJldHVybiB4eChjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7IH1cblxuICBmdW5jdGlvbiBtZDUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICB2YXIgaSA9IGxlbmd0aDtcbiAgICBidWZmZXJbaSA+PiAyXSB8PSAweDgwIDw8ICg4ICogKGkgJiAzKSk7XG4gICAgZm9yIChpID0gKGkgJiB+MHgzKSArIDg7KGkgJiAweDNGKSA8IDYwIDtpICs9IDQpXG4gICAgICBidWZmZXJbKGkgPj4gMikgLSAxXSA9IDA7XG4gICAgYnVmZmVyWyhpID4+IDIpIC0xXSA9IGxlbmd0aCA8PCAzO1xuICAgIGJ1ZmZlcltpID4+IDJdID0gKGxlbmd0aCA+PiAyOSkgJiAweDFGRkZGRkZGO1xuXG4gICAgdmFyIHcgPSBbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3Nl07XG5cbiAgICBmb3IoaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICB2YXIgYSA9IHdbMF0sIGIgPSB3WzFdLCBjID0gd1syXSwgZCA9IHdbM107XG5cbiAgICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbaSsgMF0sIDcsIDB4RDc2QUE0NzgpO1xuICAgICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcltpKyAxXSwgMTIsIDB4RThDN0I3NTYpO1xuICAgICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKyAyXSwgMTcsIDB4MjQyMDcwREIpO1xuICAgICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKyAzXSwgMjIsIDB4QzFCRENFRUUpO1xuICAgICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcltpKyA0XSwgNywgMHhGNTdDMEZBRik7XG4gICAgICBkID0gZmYoZCwgYSwgYiwgYywgYnVmZmVyW2krIDVdLCAxMiwgMHg0Nzg3QzYyQSk7XG4gICAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyW2krIDZdLCAxNywgMHhBODMwNDYxMyk7XG4gICAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyW2krIDddLCAyMiwgMHhGRDQ2OTUwMSk7XG4gICAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyW2krIDhdLCA3LCAweDY5ODA5OEQ4KTtcbiAgICAgIGQgPSBmZihkLCBhLCBiLCBjLCBidWZmZXJbaSsgOV0sIDEyLCAweDhCNDRGN0FGKTtcbiAgICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbaSsxMF0sIDE3LCAweEZGRkY1QkIxKTtcbiAgICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbaSsxMV0sIDIyLCAweDg5NUNEN0JFKTtcbiAgICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbaSsxMl0sIDcsIDB4NkI5MDExMjIpO1xuICAgICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcltpKzEzXSwgMTIsIDB4RkQ5ODcxOTMpO1xuICAgICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKzE0XSwgMTcsIDB4QTY3OTQzOEUpO1xuICAgICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKzE1XSwgMjIsIDB4NDlCNDA4MjEpO1xuXG4gICAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyW2krIDFdLCA1LCAweEY2MUUyNTYyKTtcbiAgICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbaSsgNl0sIDksIDB4QzA0MEIzNDApO1xuICAgICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKzExXSwgMTQsIDB4MjY1RTVBNTEpO1xuICAgICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKyAwXSwgMjAsIDB4RTlCNkM3QUEpO1xuICAgICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlcltpKyA1XSwgNSwgMHhENjJGMTA1RCk7XG4gICAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyW2krMTBdLCA5LCAweDAyNDQxNDUzKTtcbiAgICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbaSsxNV0sIDE0LCAweEQ4QTFFNjgxKTtcbiAgICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbaSsgNF0sIDIwLCAweEU3RDNGQkM4KTtcbiAgICAgIGEgPSBnZyhhLCBiLCBjLCBkLCBidWZmZXJbaSsgOV0sIDUsIDB4MjFFMUNERTYpO1xuICAgICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlcltpKzE0XSwgOSwgMHhDMzM3MDdENik7XG4gICAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyW2krIDNdLCAxNCwgMHhGNEQ1MEQ4Nyk7XG4gICAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyW2krIDhdLCAyMCwgMHg0NTVBMTRFRCk7XG4gICAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyW2krMTNdLCA1LCAweEE5RTNFOTA1KTtcbiAgICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbaSsgMl0sIDksIDB4RkNFRkEzRjgpO1xuICAgICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKyA3XSwgMTQsIDB4Njc2RjAyRDkpO1xuICAgICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKzEyXSwgMjAsIDB4OEQyQTRDOEEpO1xuXG4gICAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyW2krIDVdLCA0LCAweEZGRkEzOTQyKTtcbiAgICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbaSsgOF0sIDExLCAweDg3NzFGNjgxKTtcbiAgICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbaSsxMV0sIDE2LCAweDZEOUQ2MTIyKTtcbiAgICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbaSsxNF0sIDIzLCAweEZERTUzODBDKTtcbiAgICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbaSsgMV0sIDQsIDB4QTRCRUVBNDQpO1xuICAgICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlcltpKyA0XSwgMTEsIDB4NEJERUNGQTkpO1xuICAgICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKyA3XSwgMTYsIDB4RjZCQjRCNjApO1xuICAgICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKzEwXSwgMjMsIDB4QkVCRkJDNzApO1xuICAgICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlcltpKzEzXSwgNCwgMHgyODlCN0VDNik7XG4gICAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyW2krIDBdLCAxMSwgMHhFQUExMjdGQSk7XG4gICAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyW2krIDNdLCAxNiwgMHhENEVGMzA4NSk7XG4gICAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyW2krIDZdLCAyMywgMHgwNDg4MUQwNSk7XG4gICAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyW2krIDldLCA0LCAweEQ5RDREMDM5KTtcbiAgICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbaSsxMl0sIDExLCAweEU2REI5OUU1KTtcbiAgICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbaSsxNV0sIDE2LCAweDFGQTI3Q0Y4KTtcbiAgICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbaSsgMl0sIDIzLCAweEM0QUM1NjY1KTtcblxuICAgICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlcltpKyAwXSwgNiwgMHhGNDI5MjI0NCk7XG4gICAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyW2krIDddLCAxMCwgMHg0MzJBRkY5Nyk7XG4gICAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyW2krMTRdLCAxNSwgMHhBQjk0MjNBNyk7XG4gICAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyW2krIDVdLCAyMSwgMHhGQzkzQTAzOSk7XG4gICAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyW2krMTJdLCA2LCAweDY1NUI1OUMzKTtcbiAgICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbaSsgM10sIDEwLCAweDhGMENDQzkyKTtcbiAgICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbaSsxMF0sIDE1LCAweEZGRUZGNDdEKTtcbiAgICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbaSsgMV0sIDIxLCAweDg1ODQ1REQxKTtcbiAgICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbaSsgOF0sIDYsIDB4NkZBODdFNEYpO1xuICAgICAgZCA9IGlpKGQsIGEsIGIsIGMsIGJ1ZmZlcltpKzE1XSwgMTAsIDB4RkUyQ0U2RTApO1xuICAgICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlcltpKyA2XSwgMTUsIDB4QTMwMTQzMTQpO1xuICAgICAgYiA9IGlpKGIsIGMsIGQsIGEsIGJ1ZmZlcltpKzEzXSwgMjEsIDB4NEUwODExQTEpO1xuICAgICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlcltpKyA0XSwgNiwgMHhGNzUzN0U4Mik7XG4gICAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyW2krMTFdLCAxMCwgMHhCRDNBRjIzNSk7XG4gICAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyW2krIDJdLCAxNSwgMHgyQUQ3RDJCQik7XG4gICAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyW2krIDldLCAyMSwgMHhFQjg2RDM5MSk7XG5cbiAgICAgIHdbMF0gPSBhZGQoYSwgd1swXSk7XG4gICAgICB3WzFdID0gYWRkKGIsIHdbMV0pO1xuICAgICAgd1syXSA9IGFkZChjLCB3WzJdKTtcbiAgICAgIHdbM10gPSBhZGQoZCwgd1szXSk7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoMTYpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA0OyBqKyspXG4gICAgICAgIHRbaSAqIDQgKyBqXSA9ICh3W2ldID4+ICg4ICogaikpICYgMHhGRjtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAocywgb2ZzLCBsZW4pIHtcbiAgICAvLyBGSVg6IG1heWJlIHdlIHNob3VsZCBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiBieSBjaHVuayBvZiA2NCBieXRlc1xuICAgIC8vIGFzIGluIGh0dHA6Ly93d3cubXllcnNkYWlseS5vcmcvam9zZXBoL2phdmFzY3JpcHQvbWQ1LmpzXG4gICAgdmFyIGJ1ZiA9IFtdO1xuICAgIHZhciBjb250ZW50ID0gY2FtbF9tbF9ieXRlc19jb250ZW50KHMpO1xuICAgIGlmKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKXtcbiAgICAgIHZhciBiID0gY29udGVudDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKz00KSB7XG4gICAgICAgIHZhciBqID0gaSArIG9mcztcbiAgICAgICAgYnVmW2k+PjJdID1cbiAgICAgICAgICBiLmNoYXJDb2RlQXQoaikgfCAoYi5jaGFyQ29kZUF0KGorMSkgPDwgOCkgfFxuICAgICAgICAgIChiLmNoYXJDb2RlQXQoaisyKSA8PCAxNikgfCAoYi5jaGFyQ29kZUF0KGorMykgPDwgMjQpO1xuICAgICAgfVxuICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykgYnVmW2k+PjJdIHw9IGIuY2hhckNvZGVBdChpICsgb2ZzKSA8PCAoOCAqIChpICYgMykpO1xuICAgIH0gZWxzZSB7IC8qIEFSUkFZICovXG4gICAgICB2YXIgYSA9IGNvbnRlbnQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSs9NCkge1xuICAgICAgICB2YXIgaiA9IGkgKyBvZnM7XG4gICAgICAgIGJ1ZltpPj4yXSA9IGFbal0gfCAoYVtqKzFdIDw8IDgpIHwgKGFbaisyXSA8PCAxNikgfCAoYVtqKzNdIDw8IDI0KTtcbiAgICAgIH1cbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIGJ1ZltpPj4yXSB8PSBhW2kgKyBvZnNdIDw8ICg4ICogKGkgJiAzKSk7XG4gICAgfVxuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShtZDUoYnVmLCBsZW4pKTtcbiAgfVxufSAoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIEh1Z28gSGV1emFyZFxuLy8gQ29weXJpZ2h0IChDKSAyMDIwIC0gU2hhY2hhciBJdHpoYWt5XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi80LjA3L290aGVybGlicy9zdHIvc3Ryc3R1YnMuY1xuLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzY29xL2pzY29xL2Jsb2IvdjguMTEvY29xLWpzL2pzX3N0dWIvc3RyLmpzXG5cbi8vUHJvdmlkZXM6IHJlX21hdGNoXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19nZXRcblxudmFyIHJlX21hdGNoID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlX3dvcmRfbGV0dGVycyA9IFtcbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiAweDAwLTB4MUY6IG5vbmUgKi9cbiAgICAweDAwLCAweDAwLCAweEZGLCAweDAzLCAgICAgICAvKiAweDIwLTB4M0Y6IGRpZ2l0cyAwLTkgKi9cbiAgICAweEZFLCAweEZGLCAweEZGLCAweDg3LCAgICAgICAvKiAweDQwLTB4NUY6IEEgdG8gWiwgXyAqL1xuICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4MDcsICAgICAgIC8qIDB4NjAtMHg3RjogYSB0byB6ICovXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogMHg4MC0weDlGOiBub25lICovXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogMHhBMC0weEJGOiBub25lICovXG4gICAgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgICAgICAgLyogMHhDMC0weERGOiBMYXRpbi0xIGFjY2VudGVkIHVwcGVyY2FzZSAqL1xuICAgIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYgICAgICAgIC8qIDB4RTAtMHhGRjogTGF0aW4tMSBhY2NlbnRlZCBsb3dlcmNhc2UgKi9cbiAgXTtcblxuICB2YXIgb3Bjb2RlcyA9IHtcbiAgICBDSEFSOiAwLCBDSEFSTk9STTogMSwgU1RSSU5HOiAyLCBTVFJJTkdOT1JNOiAzLCBDSEFSQ0xBU1M6IDQsXG4gICAgQk9MOiA1LCBFT0w6IDYsIFdPUkRCT1VOREFSWTogNyxcbiAgICBCRUdHUk9VUDogOCwgRU5ER1JPVVA6IDksIFJFRkdST1VQOiAxMCxcbiAgICBBQ0NFUFQ6IDExLFxuICAgIFNJTVBMRU9QVDogMTIsIFNJTVBMRVNUQVI6IDEzLCBTSU1QTEVQTFVTOiAxNCxcbiAgICBHT1RPOiAxNSwgUFVTSEJBQ0s6IDE2LCBTRVRNQVJLOiAxNyxcbiAgICBDSEVDS1BST0dSRVNTOiAxOFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzX3dvcmRfbGV0dGVyKGMpIHtcbiAgICByZXR1cm4gKHJlX3dvcmRfbGV0dGVyc1sgIChjID4+IDMpXSA+PiAoYyAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiBpbl9iaXRzZXQocyxpKSB7XG4gICAgcmV0dXJuIChjYW1sX3N0cmluZ19nZXQocywoaSA+PiAzKSkgPj4gKGkgJiA3KSkgJiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVfbWF0Y2hfaW1wbChyZSwgcywgcG9zLCBwYXJ0aWFsKSB7XG5cbiAgICB2YXIgcHJvZyAgICAgICAgICA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsxXSksXG4gICAgICAgIGNwb29sICAgICAgICAgPSBjYW1sX2pzX2Zyb21fYXJyYXkocmVbMl0pLFxuICAgICAgICBub3JtdGFibGUgICAgID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZVszXSksXG4gICAgICAgIG51bWdyb3VwcyAgICAgPSByZVs0XSB8IDAsXG4gICAgICAgIG51bXJlZ2lzdGVycyAgPSByZVs1XSB8IDAsXG4gICAgICAgIHN0YXJ0Y2hhcnMgICAgPSByZVs2XSB8IDA7XG5cbiAgICB2YXIgcyA9IGNhbWxfYXJyYXlfb2Zfc3RyaW5nKHMpO1xuXG4gICAgdmFyIHBjID0gMCxcbiAgICAgICAgcXVpdCA9IGZhbHNlLFxuICAgICAgICBzdGFjayA9IFtdLFxuICAgICAgICBncm91cHMgPSBuZXcgQXJyYXkobnVtZ3JvdXBzKSxcbiAgICAgICAgcmVfcmVnaXN0ZXIgPSBuZXcgQXJyYXkobnVtcmVnaXN0ZXJzKTtcblxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspe1xuICAgICAgZ3JvdXBzW2ldID0ge3N0YXJ0OiAtMSwgZW5kOi0xfVxuICAgIH1cbiAgICBncm91cHNbMF0uc3RhcnQgPSBwb3M7XG5cbiAgICB2YXIgYmFja3RyYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS51bmRvKSB7XG4gICAgICAgICAgaXRlbS51bmRvLm9ialtpdGVtLnVuZG8ucHJvcF0gPSBpdGVtLnVuZG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihpdGVtLnBvcykge1xuICAgICAgICAgIHBjID0gaXRlbS5wb3MucGM7XG4gICAgICAgICAgcG9zID0gaXRlbS5wb3MudHh0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVpdCA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBwdXNoID0gZnVuY3Rpb24oaXRlbSkgeyBzdGFjay5wdXNoKGl0ZW0pOyB9O1xuXG4gICAgdmFyIGFjY2VwdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGdyb3Vwc1swXS5lbmQgPSBwb3M7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KDEgKyBncm91cHMubGVuZ3RoKjIpO1xuICAgICAgcmVzdWx0WzBdID0gMDsgLy8gdGFnXG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIGcgPSBncm91cHNbaV07XG4gICAgICAgIGlmKGcuc3RhcnQgPCAwIHx8IGcuZW5kIDwgMCkge1xuICAgICAgICAgIGcuc3RhcnQgPSBnLmVuZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFsyKmkgKyAxIF0gPSBnLnN0YXJ0O1xuICAgICAgICByZXN1bHRbMippICsgMSArIDEgXSA9IGcuZW5kO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgdmFyIHByZWZpeF9tYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKHBhcnRpYWwpIHJldHVybiBhY2NlcHQgKCk7XG4gICAgICBlbHNlIGJhY2t0cmFjayAoKTtcbiAgICB9XG5cbiAgICAvKiBNYWluIERGQSBpbnRlcnByZXRlciBsb29wICovXG4gICAgd2hpbGUgKCFxdWl0KSB7XG4gICAgICB2YXIgb3AgPSBwcm9nW3BjXSAmIDB4ZmYsXG4gICAgICAgICAgc2FyZyA9IHByb2dbcGNdID4+IDgsXG4gICAgICAgICAgdWFyZyA9IHNhcmcgJiAweGZmLFxuICAgICAgICAgIGMgPSBzW3Bvc10sXG4gICAgICAgICAgZ3JvdXA7XG5cbiAgICAgIHBjKys7XG5cbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChjID09PSB1YXJnKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hBUk5PUk06XG4gICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSB1YXJnKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU1RSSU5HOlxuICAgICAgICBmb3IgKHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYgKGMgPT09IGFyZy5jaGFyQ29kZUF0KGkpKVxuICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGVsc2UgeyBiYWNrdHJhY2soKTsgYnJlYWs7IH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkdOT1JNOlxuICAgICAgICBmb3IgKHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSBhcmcuY2hhckNvZGVBdChpKSlcbiAgICAgICAgICAgIGMgPSBzWysrcG9zXTtcbiAgICAgICAgICBlbHNlIHsgYmFja3RyYWNrKCk7IGJyZWFrOyB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hBUkNMQVNTOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQk9MOlxuICAgICAgICBpZihwb3MgPiAwICYmIHNbcG9zIC0gMV0gIT0gMTAgLyogXFxuICovKSB7YmFja3RyYWNrKCl9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkVPTDpcbiAgICAgICAgaWYocG9zIDwgcy5sZW5ndGggJiYgc1twb3NdICE9IDEwIC8qIFxcbiAqLykge2JhY2t0cmFjaygpfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5XT1JEQk9VTkRBUlk6XG4gICAgICAgIGlmKHBvcyA9PSAwKSB7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmKGlzX3dvcmRfbGV0dGVyKHNbMF0pKSBicmVhaztcbiAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYoaXNfd29yZF9sZXR0ZXIoc1twb3MgLSAxXSkpIGJyZWFrO1xuICAgICAgICAgIGJhY2t0cmFjayAoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZihpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSAhPSBpc193b3JkX2xldHRlcihzW3Bvc10pKSBicmVhaztcbiAgICAgICAgICBiYWNrdHJhY2sgKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQkVHR1JPVVA6XG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICBwdXNoKHt1bmRvOiB7b2JqOmdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcDonc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwLnN0YXJ0fX0pO1xuICAgICAgICBncm91cC5zdGFydCA9IHBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuRU5ER1JPVVA6XG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICBwdXNoKHt1bmRvOiB7b2JqOiBncm91cCxcbiAgICAgICAgICAgICAgICAgICAgIHByb3A6J2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ3JvdXAuZW5kfX0pO1xuICAgICAgICBncm91cC5lbmQgPSBwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlJFRkdST1VQOlxuICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgaWYoZ3JvdXAuc3RhcnQgPCAwIHx8IGdyb3VwLmVuZCA8IDApIHtiYWNrdHJhY2sgKCk7IGJyZWFrfVxuICAgICAgICBmb3IgKHZhciBpID0gZ3JvdXAuc3RhcnQ7IGkgPCBncm91cC5lbmQ7IGkrKyl7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmKHNbaV0gIT0gc1twb3NdKSB7YmFja3RyYWNrICgpOyBicmVha31cbiAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVPUFQ6XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU0lNUExFU1RBUjpcbiAgICAgICAgd2hpbGUgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpXG4gICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVQTFVTOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSB7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIH0gd2hpbGUgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkFDQ0VQVDpcbiAgICAgICAgcmV0dXJuIGFjY2VwdCgpO1xuICAgICAgY2FzZSBvcGNvZGVzLkdPVE86XG4gICAgICAgIHBjID0gcGMgKyBzYXJnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5QVVNIQkFDSzpcbiAgICAgICAgcHVzaCh7cG9zOiB7cGM6IHBjICsgc2FyZywgdHh0OiBwb3N9fSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNFVE1BUks6XG4gICAgICAgIHB1c2goe3VuZG86IHtvYmo6cmVfcmVnaXN0ZXIsXG4gICAgICAgICAgICAgICAgICAgICBwcm9wOiB1YXJnLFxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlX3JlZ2lzdGVyW3VhcmddfX0pO1xuICAgICAgICByZV9yZWdpc3Rlclt1YXJnXSA9IHBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hFQ0tQUk9HUkVTUzpcbiAgICAgICAgaWYgKHJlX3JlZ2lzdGVyW3VhcmddID09PSBwb3MpIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZWNvZGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHJlX21hdGNoX2ltcGw7XG59KCk7XG5cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2ZvcndhcmRcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfc2VhcmNoX2ZvcndhcmQocmUsIHMsIHBvcykge1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIuc2VhcmNoX2ZvcndhcmRcIilcbiAgd2hpbGUgKHBvcyA8PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpIHtcbiAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICBwb3MrKztcbiAgfVxuXG4gIHJldHVybiBbMF07ICAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cbi8vUHJvdmlkZXM6IHJlX3NlYXJjaF9iYWNrd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zZWFyY2hfYmFja3dhcmQocmUsIHMsIHBvcykge1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIuc2VhcmNoX2JhY2t3YXJkXCIpXG4gIHdoaWxlIChwb3MgPj0gMCkge1xuICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgIHBvcy0tO1xuICB9XG5cbiAgcmV0dXJuIFswXTsgIC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuXG4vL1Byb3ZpZGVzOiByZV9zdHJpbmdfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfc3RyaW5nX21hdGNoKHJlLHMscG9zKXtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnN0cmluZ19tYXRjaFwiKVxuICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGVsc2UgcmV0dXJuIFswXTtcbn1cblxuLy9Qcm92aWRlczogcmVfcGFydGlhbF9tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9wYXJ0aWFsX21hdGNoKHJlLHMscG9zKXtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnBhcnRpYWxfbWF0Y2hcIilcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDEpO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3JlcGxhY2VtZW50X3RleHRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyBleHRlcm5hbCByZV9yZXBsYWNlbWVudF90ZXh0OiBzdHJpbmcgLT4gaW50IGFycmF5IC0+IHN0cmluZyAtPiBzdHJpbmdcbmZ1bmN0aW9uIHJlX3JlcGxhY2VtZW50X3RleHQocmVwbCxncm91cHMsb3JpZykge1xuICB2YXIgcmVwbCA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocmVwbCk7XG4gIHZhciBsZW4gPSByZXBsLmxlbmd0aDtcbiAgdmFyIG9yaWcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG9yaWcpO1xuICB2YXIgcmVzID0gXCJcIjsgLy9yZXN1bHRcbiAgdmFyIG4gPSAwOyAvLyBjdXJyZW50IHBvc2l0aW9uXG4gIHZhciBjdXI7IC8vY3VycmVudCBjaGFyXG4gIHZhciBzdGFydCwgZW5kLCBjO1xuICB3aGlsZShuIDwgbGVuKXtcbiAgICBjdXIgPSByZXBsLmNoYXJBdChuKyspO1xuICAgIGlmKGN1ciAhPSAnXFxcXCcpe1xuICAgICAgcmVzICs9IGN1cjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZihuID09IGxlbikgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiBpbGxlZ2FsIGJhY2tzbGFzaCBzZXF1ZW5jZVwiKTtcbiAgICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgICBzd2l0Y2goY3VyKXtcbiAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICByZXMgKz0gY3VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzpcbiAgICAgICAgYyA9ICtjdXI7XG4gICAgICAgIGlmIChjKjIgPj0gZ3JvdXBzLmxlbmd0aCAtIDEgKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJTdHIucmVwbGFjZTogcmVmZXJlbmNlIHRvIHVubWF0Y2hlZCBncm91cFwiICk7XG4gICAgICAgIHN0YXJ0ID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLGMqMik7XG4gICAgICAgIGVuZCA9IGNhbWxfYXJyYXlfZ2V0KGdyb3VwcywgYyoyICsxKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09IC0xKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJTdHIucmVwbGFjZTogcmVmZXJlbmNlIHRvIHVubWF0Y2hlZCBncm91cFwiKTtcbiAgICAgICAgcmVzKz1vcmlnLnNsaWNlKHN0YXJ0LGVuZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzICs9ICgnXFxcXCcgICsgY3VyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocmVzKTsgfVxuIiwiLy9UaGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkIGluIENzdHJ1Y3Rcbi8vVGhlcmUgYXJlIGp1c3QgcHJvdmlkZWQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxpdF9iaWdzdHJpbmdfdG9fYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhXG4vL1dlYWtkZWZcbnZhciBjYW1sX2JsaXRfYmlnc3RyaW5nX3RvX2JpZ3N0cmluZyA9IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmFcbi8vUHJvdmlkZXM6IGNhbWxfYmxpdF9iaWdzdHJpbmdfdG9fc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2J5dGVzXG4vL1dlYWtkZWZcbnZhciBjYW1sX2JsaXRfYmlnc3RyaW5nX3RvX3N0cmluZyA9IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXNcbi8vUHJvdmlkZXM6IGNhbWxfYmxpdF9zdHJpbmdfdG9fYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYVxuLy9XZWFrZGVmXG52YXIgY2FtbF9ibGl0X3N0cmluZ190b19iaWdzdHJpbmcgPSBjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBEYW5pZWwgQy4gQnVlbnpsaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5cbmxldCBlcnJfbm9fcHJlZCA9IFwiVSswMDAwIGhhcyBubyBwcmVkZWNlc3NvclwiXG5sZXQgZXJyX25vX3N1Y2MgPSBcIlUrMTBGRkZGIGhhcyBubyBzdWNjZXNzb3JcIlxubGV0IGVycl9ub3Rfc3YgaSA9IGZvcm1hdF9pbnQgXCIlWFwiIGkgXiBcIiBpcyBub3QgYW4gVW5pY29kZSBzY2FsYXIgdmFsdWVcIlxubGV0IGVycl9ub3RfbGF0aW4xIHUgPSBcIlUrXCIgXiBmb3JtYXRfaW50IFwiJTA0WFwiIHUgXiBcIiBpcyBub3QgYSBsYXRpbjEgY2hhcmFjdGVyXCJcblxudHlwZSB0ID0gaW50XG5cbmxldCBtaW4gPSAweDAwMDBcbmxldCBtYXggPSAweDEwRkZGRlxubGV0IGxvX2JvdW5kID0gMHhEN0ZGXG5sZXQgaGlfYm91bmQgPSAweEUwMDBcblxubGV0IGJvbSA9IDB4RkVGRlxubGV0IHJlcCA9IDB4RkZGRFxuXG5sZXQgc3VjYyB1ID1cbiAgaWYgdSA9IGxvX2JvdW5kIHRoZW4gaGlfYm91bmQgZWxzZVxuICBpZiB1ID0gbWF4IHRoZW4gaW52YWxpZF9hcmcgZXJyX25vX3N1Y2MgZWxzZVxuICB1ICsgMVxuXG5sZXQgcHJlZCB1ID1cbiAgaWYgdSA9IGhpX2JvdW5kIHRoZW4gbG9fYm91bmQgZWxzZVxuICBpZiB1ID0gbWluIHRoZW4gaW52YWxpZF9hcmcgZXJyX25vX3ByZWQgZWxzZVxuICB1IC0gMVxuXG5sZXQgaXNfdmFsaWQgaSA9IChtaW4gPD0gaSAmJiBpIDw9IGxvX2JvdW5kKSB8fCAoaGlfYm91bmQgPD0gaSAmJiBpIDw9IG1heClcbmxldCBvZl9pbnQgaSA9IGlmIGlzX3ZhbGlkIGkgdGhlbiBpIGVsc2UgaW52YWxpZF9hcmcgKGVycl9ub3Rfc3YgaSlcbmV4dGVybmFsIHVuc2FmZV9vZl9pbnQgOiBpbnQgLT4gdCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHRvX2ludCA6IHQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgaXNfY2hhciB1ID0gdSA8IDI1NlxubGV0IG9mX2NoYXIgYyA9IENoYXIuY29kZSBjXG5sZXQgdG9fY2hhciB1ID1cbiAgaWYgdSA+IDI1NSB0aGVuIGludmFsaWRfYXJnIChlcnJfbm90X2xhdGluMSB1KSBlbHNlXG4gIENoYXIudW5zYWZlX2NociB1XG5cbmxldCB1bnNhZmVfdG9fY2hhciA9IENoYXIudW5zYWZlX2NoclxuXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgaGFzaCA9IHRvX2ludFxuXG4oKiBVVEYgY29kZWNzIHRvb2xzICopXG5cbnR5cGUgdXRmX2RlY29kZSA9IGludFxuKCogVGhpcyBpcyBhbiBpbnQgWzB4RFVVVVVVVV0gZGVjb21wb3NlZCBhcyBmb2xsb3dzOlxuICAgLSBbRF0gaXMgZm91ciBiaXRzIGZvciBkZWNvZGUgaW5mb3JtYXRpb24sIHRoZSBoaWdoZXN0IGJpdCBpcyBzZXQgaWYgdGhlXG4gICAgIGRlY29kZSBpcyB2YWxpZC4gVGhlIHRocmVlIGxvd2VyIGJpdHMgaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50c1xuICAgICBmcm9tIHRoZSBzb3VyY2UgdGhhdCB3ZXJlIGNvbnN1bWVkIGJ5IHRoZSBkZWNvZGUuXG4gICAtIFtVVVVVVVVdIGlzIHRoZSBkZWNvZGVkIFVuaWNvZGUgY2hhcmFjdGVyIG9yIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50XG4gICAgIGNoYXJhY3RlciBVK0ZGRkQgaWYgZm9yIGludmFsaWQgZGVjb2Rlcy4gKilcblxubGV0IHZhbGlkX2JpdCA9IDI3XG5sZXQgZGVjb2RlX2JpdHMgPSAyNFxuXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pc192YWxpZCBkID0gKGQgbHNyIHZhbGlkX2JpdCkgPSAxXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9sZW5ndGggZCA9IChkIGxzciBkZWNvZGVfYml0cykgbGFuZCAwYjExMVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfdWNoYXIgZCA9IHVuc2FmZV9vZl9pbnQgKGQgbGFuZCAweEZGRkZGRilcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlIG4gdSA9ICgoOCBsb3IgbikgbHNsIGRlY29kZV9iaXRzKSBsb3IgKHRvX2ludCB1KVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfaW52YWxpZCBuID0gKG4gbHNsIGRlY29kZV9iaXRzKSBsb3IgcmVwXG5cbmxldCB1dGZfOF9ieXRlX2xlbmd0aCB1ID0gbWF0Y2ggdG9faW50IHUgd2l0aFxufCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG58IHUgd2hlbiB1IDw9IDB4MDA3RiAtPiAxXG58IHUgd2hlbiB1IDw9IDB4MDdGRiAtPiAyXG58IHUgd2hlbiB1IDw9IDB4RkZGRiAtPiAzXG58IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+IDRcbnwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHV0Zl8xNl9ieXRlX2xlbmd0aCB1ID0gbWF0Y2ggdG9faW50IHUgd2l0aFxufCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG58IHUgd2hlbiB1IDw9IDB4RkZGRiAtPiAyXG58IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+IDRcbnwgXyAtPiBhc3NlcnQgZmFsc2VcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQ2NF06IDY0LWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQ2NCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfdG9fZmxvYXRcIiBcImNhbWxfaW50NjRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzIgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX25hdGl2ZWludFwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnQgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuXG5sZXQgemVybyA9IDBMXG5sZXQgb25lID0gMUxcbmxldCBtaW51c19vbmUgPSAtMUxcbmxldCBzdWNjIG4gPSBhZGQgbiAxTFxubGV0IHByZWQgbiA9IHN1YiBuIDFMXG5sZXQgYWJzIG4gPSBpZiBuID49IDBMIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDAwMDAwMDAwMExcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGTFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xTClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgY29tcGFyZSB6ZXJvIG4gPD0gMCAmJiBjb21wYXJlIG4gbWF4X2ludCA8PSAwIHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZyA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxubGV0IHRvX3N0cmluZyBuID0gZm9ybWF0IFwiJWRcIiBuXG5cbmV4dGVybmFsIG9mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQ2NCA9IFwiY2FtbF9pbnQ2NF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogZXhwb3NlIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlIGRpcmVjdGx5LiAqKVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuXG5cbmV4dGVybmFsIGJpdHNfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XCIgXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9hdF9vZl9iaXRzIDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1wiIFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzX3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG50eXBlIHQgPSBpbnQ2NFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lXG4gICBiaXRuZXNzLiBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSBuIGQgPCAwIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIHIgZCA+PSAwIHRoZW4gc3VjYyBxIGVsc2UgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFRoZSBydW4tdGltZSBsaWJyYXJ5IGZvciBsZXhlcnMgZ2VuZXJhdGVkIGJ5IGNhbWxsZXggKilcblxudHlwZSBwb3NpdGlvbiA9IHtcbiAgcG9zX2ZuYW1lIDogc3RyaW5nO1xuICBwb3NfbG51bSA6IGludDtcbiAgcG9zX2JvbCA6IGludDtcbiAgcG9zX2NudW0gOiBpbnQ7XG59XG5cbmxldCBkdW1teV9wb3MgPSB7XG4gIHBvc19mbmFtZSA9IFwiXCI7XG4gIHBvc19sbnVtID0gMDtcbiAgcG9zX2JvbCA9IDA7XG4gIHBvc19jbnVtID0gLTE7XG59XG5cbnR5cGUgbGV4YnVmID1cbiAgeyByZWZpbGxfYnVmZiA6IGxleGJ1ZiAtPiB1bml0O1xuICAgIG11dGFibGUgbGV4X2J1ZmZlciA6IGJ5dGVzO1xuICAgIG11dGFibGUgbGV4X2J1ZmZlcl9sZW4gOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfYWJzX3BvcyA6IGludDtcbiAgICBtdXRhYmxlIGxleF9zdGFydF9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfY3Vycl9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfbGFzdF9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfbGFzdF9hY3Rpb24gOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfZW9mX3JlYWNoZWQgOiBib29sO1xuICAgIG11dGFibGUgbGV4X21lbSA6IGludCBhcnJheTtcbiAgICBtdXRhYmxlIGxleF9zdGFydF9wIDogcG9zaXRpb247XG4gICAgbXV0YWJsZSBsZXhfY3Vycl9wIDogcG9zaXRpb247XG4gIH1cblxudHlwZSBsZXhfdGFibGVzID1cbiAgeyBsZXhfYmFzZTogc3RyaW5nO1xuICAgIGxleF9iYWNrdHJrOiBzdHJpbmc7XG4gICAgbGV4X2RlZmF1bHQ6IHN0cmluZztcbiAgICBsZXhfdHJhbnM6IHN0cmluZztcbiAgICBsZXhfY2hlY2s6IHN0cmluZztcbiAgICBsZXhfYmFzZV9jb2RlIDogc3RyaW5nO1xuICAgIGxleF9iYWNrdHJrX2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X2RlZmF1bHRfY29kZSA6IHN0cmluZztcbiAgICBsZXhfdHJhbnNfY29kZSA6IHN0cmluZztcbiAgICBsZXhfY2hlY2tfY29kZSA6IHN0cmluZztcbiAgICBsZXhfY29kZTogc3RyaW5nO31cblxuZXh0ZXJuYWwgY19lbmdpbmUgOiBsZXhfdGFibGVzIC0+IGludCAtPiBsZXhidWYgLT4gaW50ID0gXCJjYW1sX2xleF9lbmdpbmVcIlxuZXh0ZXJuYWwgY19uZXdfZW5naW5lIDogbGV4X3RhYmxlcyAtPiBpbnQgLT4gbGV4YnVmIC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX25ld19sZXhfZW5naW5lXCJcblxubGV0IGVuZ2luZSB0Ymwgc3RhdGUgYnVmID1cbiAgbGV0IHJlc3VsdCA9IGNfZW5naW5lIHRibCBzdGF0ZSBidWYgaW5cbiAgaWYgcmVzdWx0ID49IDAgJiYgYnVmLmxleF9jdXJyX3AgIT0gZHVtbXlfcG9zIHRoZW4gYmVnaW5cbiAgICBidWYubGV4X3N0YXJ0X3AgPC0gYnVmLmxleF9jdXJyX3A7XG4gICAgYnVmLmxleF9jdXJyX3AgPC0ge2J1Zi5sZXhfY3Vycl9wXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggcG9zX2NudW0gPSBidWYubGV4X2Fic19wb3MgKyBidWYubGV4X2N1cnJfcG9zfTtcbiAgZW5kO1xuICByZXN1bHRcblxuXG5sZXQgbmV3X2VuZ2luZSB0Ymwgc3RhdGUgYnVmID1cbiAgbGV0IHJlc3VsdCA9IGNfbmV3X2VuZ2luZSB0Ymwgc3RhdGUgYnVmIGluXG4gIGlmIHJlc3VsdCA+PSAwICYmIGJ1Zi5sZXhfY3Vycl9wICE9IGR1bW15X3BvcyB0aGVuIGJlZ2luXG4gICAgYnVmLmxleF9zdGFydF9wIDwtIGJ1Zi5sZXhfY3Vycl9wO1xuICAgIGJ1Zi5sZXhfY3Vycl9wIDwtIHtidWYubGV4X2N1cnJfcFxuICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBvc19jbnVtID0gYnVmLmxleF9hYnNfcG9zICsgYnVmLmxleF9jdXJyX3Bvc307XG4gIGVuZDtcbiAgcmVzdWx0XG5cbmxldCBsZXhfcmVmaWxsIHJlYWRfZnVuIGF1eF9idWZmZXIgbGV4YnVmID1cbiAgbGV0IHJlYWQgPVxuICAgIHJlYWRfZnVuIGF1eF9idWZmZXIgKEJ5dGVzLmxlbmd0aCBhdXhfYnVmZmVyKSBpblxuICBsZXQgbiA9XG4gICAgaWYgcmVhZCA+IDBcbiAgICB0aGVuIHJlYWRcbiAgICBlbHNlIChsZXhidWYubGV4X2VvZl9yZWFjaGVkIDwtIHRydWU7IDApIGluXG4gICgqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGJ1ZmZlcjpcbiAgICAgICAgPC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tPlxuICAgICAgICB8ICBqdW5rIHwgICAgICB2YWxpZCBkYXRhICAgICB8ICAganVuayAgICB8XG4gICAgICAgIF4gICAgICAgXiAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgIF5cbiAgICAgICAgMCAgICBzdGFydF9wb3MgICAgICAgICAgICAgYnVmZmVyX2VuZCAgICBCeXRlcy5sZW5ndGggYnVmZmVyXG4gICopXG4gIGlmIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiArIG4gPiBCeXRlcy5sZW5ndGggbGV4YnVmLmxleF9idWZmZXIgdGhlbiBiZWdpblxuICAgICgqIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICopXG4gICAgaWYgbGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MgKyBuXG4gICAgICAgPD0gQnl0ZXMubGVuZ3RoIGxleGJ1Zi5sZXhfYnVmZmVyXG4gICAgdGhlbiBiZWdpblxuICAgICAgKCogQnV0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpZiB3ZSByZWNsYWltIHRoZSBqdW5rIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgIG9mIHRoZSBidWZmZXIgKilcbiAgICAgIEJ5dGVzLmJsaXQgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9zdGFydF9wb3NcbiAgICAgICAgICAgICAgICAgIGxleGJ1Zi5sZXhfYnVmZmVyIDBcbiAgICAgICAgICAgICAgICAgIChsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3BvcylcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgKCogV2UgbXVzdCBncm93IHRoZSBidWZmZXIuICBEb3VibGluZyBpdHMgc2l6ZSB3aWxsIHByb3ZpZGUgZW5vdWdoXG4gICAgICAgICBzcGFjZSBzaW5jZSBuIDw9IFN0cmluZy5sZW5ndGggYXV4X2J1ZmZlciA8PSBTdHJpbmcubGVuZ3RoIGJ1ZmZlci5cbiAgICAgICAgIFdhdGNoIG91dCBmb3Igc3RyaW5nIGxlbmd0aCBvdmVyZmxvdywgdGhvdWdoLiAqKVxuICAgICAgbGV0IG5ld2xlbiA9XG4gICAgICAgIEludC5taW4gKDIgKiBCeXRlcy5sZW5ndGggbGV4YnVmLmxleF9idWZmZXIpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgICAgaWYgbGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MgKyBuID4gbmV3bGVuXG4gICAgICB0aGVuIGZhaWx3aXRoIFwiTGV4aW5nLmxleF9yZWZpbGw6IGNhbm5vdCBncm93IGJ1ZmZlclwiO1xuICAgICAgbGV0IG5ld2J1ZiA9IEJ5dGVzLmNyZWF0ZSBuZXdsZW4gaW5cbiAgICAgICgqIENvcHkgdGhlIHZhbGlkIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGJ1ZmZlciAqKVxuICAgICAgQnl0ZXMuYmxpdCBsZXhidWYubGV4X2J1ZmZlciBsZXhidWYubGV4X3N0YXJ0X3Bvc1xuICAgICAgICAgICAgICAgICAgbmV3YnVmIDBcbiAgICAgICAgICAgICAgICAgIChsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3Bvcyk7XG4gICAgICBsZXhidWYubGV4X2J1ZmZlciA8LSBuZXdidWZcbiAgICBlbmQ7XG4gICAgKCogUmVhbGxvY2F0aW9uIG9yIG5vdCwgd2UgaGF2ZSBzaGlmdGVkIHRoZSBkYXRhIGxlZnQgYnlcbiAgICAgICBzdGFydF9wb3MgY2hhcmFjdGVyczsgdXBkYXRlIHRoZSBwb3NpdGlvbnMgKilcbiAgICBsZXQgcyA9IGxleGJ1Zi5sZXhfc3RhcnRfcG9zIGluXG4gICAgbGV4YnVmLmxleF9hYnNfcG9zIDwtIGxleGJ1Zi5sZXhfYWJzX3BvcyArIHM7XG4gICAgbGV4YnVmLmxleF9jdXJyX3BvcyA8LSBsZXhidWYubGV4X2N1cnJfcG9zIC0gcztcbiAgICBsZXhidWYubGV4X3N0YXJ0X3BvcyA8LSAwO1xuICAgIGxleGJ1Zi5sZXhfbGFzdF9wb3MgPC0gbGV4YnVmLmxleF9sYXN0X3BvcyAtIHM7XG4gICAgbGV4YnVmLmxleF9idWZmZXJfbGVuIDwtIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIHMgO1xuICAgIGxldCB0ID0gbGV4YnVmLmxleF9tZW0gaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIHQtMSBkb1xuICAgICAgbGV0IHYgPSB0LihpKSBpblxuICAgICAgaWYgdiA+PSAwIHRoZW5cbiAgICAgICAgdC4oaSkgPC0gdi1zXG4gICAgZG9uZVxuICBlbmQ7XG4gICgqIFRoZXJlIGlzIG5vdyBlbm91Z2ggc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICopXG4gIEJ5dGVzLmJsaXQgYXV4X2J1ZmZlciAwIGxleGJ1Zi5sZXhfYnVmZmVyIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiBuO1xuICBsZXhidWYubGV4X2J1ZmZlcl9sZW4gPC0gbGV4YnVmLmxleF9idWZmZXJfbGVuICsgblxuXG5sZXQgemVyb19wb3MgPSB7XG4gIHBvc19mbmFtZSA9IFwiXCI7XG4gIHBvc19sbnVtID0gMTtcbiAgcG9zX2JvbCA9IDA7XG4gIHBvc19jbnVtID0gMDtcbn1cblxubGV0IGZyb21fZnVuY3Rpb24gPyh3aXRoX3Bvc2l0aW9ucyA9IHRydWUpIGYgPVxuICB7IHJlZmlsbF9idWZmID0gbGV4X3JlZmlsbCBmIChCeXRlcy5jcmVhdGUgNTEyKTtcbiAgICBsZXhfYnVmZmVyID0gQnl0ZXMuY3JlYXRlIDEwMjQ7XG4gICAgbGV4X2J1ZmZlcl9sZW4gPSAwO1xuICAgIGxleF9hYnNfcG9zID0gMDtcbiAgICBsZXhfc3RhcnRfcG9zID0gMDtcbiAgICBsZXhfY3Vycl9wb3MgPSAwO1xuICAgIGxleF9sYXN0X3BvcyA9IDA7XG4gICAgbGV4X2xhc3RfYWN0aW9uID0gMDtcbiAgICBsZXhfbWVtID0gW3x8XTtcbiAgICBsZXhfZW9mX3JlYWNoZWQgPSBmYWxzZTtcbiAgICBsZXhfc3RhcnRfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gICAgbGV4X2N1cnJfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gIH1cblxubGV0IGZyb21fY2hhbm5lbCA/d2l0aF9wb3NpdGlvbnMgaWMgPVxuICBmcm9tX2Z1bmN0aW9uID93aXRoX3Bvc2l0aW9ucyAoZnVuIGJ1ZiBuIC0+IGlucHV0IGljIGJ1ZiAwIG4pXG5cbmxldCBmcm9tX3N0cmluZyA/KHdpdGhfcG9zaXRpb25zID0gdHJ1ZSkgcyA9XG4gIHsgcmVmaWxsX2J1ZmYgPSAoZnVuIGxleGJ1ZiAtPiBsZXhidWYubGV4X2VvZl9yZWFjaGVkIDwtIHRydWUpO1xuICAgIGxleF9idWZmZXIgPSBCeXRlcy5vZl9zdHJpbmcgczsgKCogaGF2ZSB0byBtYWtlIGEgY29weSBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1bnNhZmUtc3RyaW5nIG1vZGUgKilcbiAgICBsZXhfYnVmZmVyX2xlbiA9IFN0cmluZy5sZW5ndGggcztcbiAgICBsZXhfYWJzX3BvcyA9IDA7XG4gICAgbGV4X3N0YXJ0X3BvcyA9IDA7XG4gICAgbGV4X2N1cnJfcG9zID0gMDtcbiAgICBsZXhfbGFzdF9wb3MgPSAwO1xuICAgIGxleF9sYXN0X2FjdGlvbiA9IDA7XG4gICAgbGV4X21lbSA9IFt8fF07XG4gICAgbGV4X2VvZl9yZWFjaGVkID0gdHJ1ZTtcbiAgICBsZXhfc3RhcnRfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gICAgbGV4X2N1cnJfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gIH1cblxubGV0IHNldF9wb3NpdGlvbiBsZXhidWYgcG9zaXRpb24gPVxuICBsZXhidWYubGV4X2N1cnJfcCAgPC0ge3Bvc2l0aW9uIHdpdGggcG9zX2ZuYW1lID0gbGV4YnVmLmxleF9jdXJyX3AucG9zX2ZuYW1lfTtcbiAgbGV4YnVmLmxleF9hYnNfcG9zIDwtIHBvc2l0aW9uLnBvc19jbnVtXG5cbmxldCBzZXRfZmlsZW5hbWUgbGV4YnVmIGZuYW1lID1cbiAgbGV4YnVmLmxleF9jdXJyX3AgPC0ge2xleGJ1Zi5sZXhfY3Vycl9wIHdpdGggcG9zX2ZuYW1lID0gZm5hbWV9XG5cbmxldCB3aXRoX3Bvc2l0aW9ucyBsZXhidWYgPSBsZXhidWYubGV4X2N1cnJfcCAhPSBkdW1teV9wb3NcblxubGV0IGxleGVtZSBsZXhidWYgPVxuICBsZXQgbGVuID0gbGV4YnVmLmxleF9jdXJyX3BvcyAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zIGluXG4gIEJ5dGVzLnN1Yl9zdHJpbmcgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9zdGFydF9wb3MgbGVuXG5cbmxldCBzdWJfbGV4ZW1lIGxleGJ1ZiBpMSBpMiA9XG4gIGxldCBsZW4gPSBpMi1pMSBpblxuICBCeXRlcy5zdWJfc3RyaW5nIGxleGJ1Zi5sZXhfYnVmZmVyIGkxIGxlblxuXG5sZXQgc3ViX2xleGVtZV9vcHQgbGV4YnVmIGkxIGkyID1cbiAgaWYgaTEgPj0gMCB0aGVuIGJlZ2luXG4gICAgbGV0IGxlbiA9IGkyLWkxIGluXG4gICAgU29tZSAoQnl0ZXMuc3ViX3N0cmluZyBsZXhidWYubGV4X2J1ZmZlciBpMSBsZW4pXG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgTm9uZVxuICBlbmRcblxubGV0IHN1Yl9sZXhlbWVfY2hhciBsZXhidWYgaSA9IEJ5dGVzLmdldCBsZXhidWYubGV4X2J1ZmZlciBpXG5cbmxldCBzdWJfbGV4ZW1lX2NoYXJfb3B0IGxleGJ1ZiBpID1cbiAgaWYgaSA+PSAwIHRoZW5cbiAgICBTb21lIChCeXRlcy5nZXQgbGV4YnVmLmxleF9idWZmZXIgaSlcbiAgZWxzZVxuICAgIE5vbmVcblxuXG5sZXQgbGV4ZW1lX2NoYXIgbGV4YnVmIGkgPVxuICBCeXRlcy5nZXQgbGV4YnVmLmxleF9idWZmZXIgKGxleGJ1Zi5sZXhfc3RhcnRfcG9zICsgaSlcblxubGV0IGxleGVtZV9zdGFydCBsZXhidWYgPSBsZXhidWYubGV4X3N0YXJ0X3AucG9zX2NudW1cbmxldCBsZXhlbWVfZW5kIGxleGJ1ZiA9IGxleGJ1Zi5sZXhfY3Vycl9wLnBvc19jbnVtXG5cbmxldCBsZXhlbWVfc3RhcnRfcCBsZXhidWYgPSBsZXhidWYubGV4X3N0YXJ0X3BcbmxldCBsZXhlbWVfZW5kX3AgbGV4YnVmID0gbGV4YnVmLmxleF9jdXJyX3BcblxubGV0IG5ld19saW5lIGxleGJ1ZiA9XG4gIGxldCBsY3AgPSBsZXhidWYubGV4X2N1cnJfcCBpblxuICBpZiBsY3AgIT0gZHVtbXlfcG9zIHRoZW5cbiAgICBsZXhidWYubGV4X2N1cnJfcCA8LVxuICAgICAgeyBsY3Agd2l0aFxuICAgICAgICBwb3NfbG51bSA9IGxjcC5wb3NfbG51bSArIDE7XG4gICAgICAgIHBvc19ib2wgPSBsY3AucG9zX2NudW07XG4gICAgICB9XG5cblxuXG4oKiBEaXNjYXJkIGRhdGEgbGVmdCBpbiBsZXhlciBidWZmZXIuICopXG5cbmxldCBmbHVzaF9pbnB1dCBsYiA9XG4gIGxiLmxleF9jdXJyX3BvcyA8LSAwO1xuICBsYi5sZXhfYWJzX3BvcyA8LSAwO1xuICBsZXQgbGNwID0gbGIubGV4X2N1cnJfcCBpblxuICBpZiBsY3AgIT0gZHVtbXlfcG9zIHRoZW5cbiAgICBsYi5sZXhfY3Vycl9wIDwtIHt6ZXJvX3BvcyB3aXRoIHBvc19mbmFtZSA9IGxjcC5wb3NfZm5hbWV9O1xuICBsYi5sZXhfYnVmZmVyX2xlbiA8LSAwO1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAoKiBUb29scyB0byBtYW5pcHVsYXRlIHNjYW5uaW5nIHNldCBvZiBjaGFycyAoc2VlICVbLi4uXSkgKilcblxudHlwZSBtdXRhYmxlX2NoYXJfc2V0ID0gYnl0ZXNcblxuKCogQ3JlYXRlIGEgZnJlc2gsIGVtcHR5LCBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGNyZWF0ZV9jaGFyX3NldCAoKSA9IEJ5dGVzLm1ha2UgMzIgJ1xcMDAwJ1xuXG4oKiBBZGQgYSBjaGFyIGluIGEgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICBCeXRlcy5zZXQgY2hhcl9zZXQgc3RyX2luZFxuICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKEJ5dGVzLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsb3IgbWFzaykpXG5cbmxldCBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBCeXRlcy50b19zdHJpbmcgY2hhcl9zZXRcblxuKCogQ29tcHV0ZSB0aGUgY29tcGxlbWVudCBvZiBhIGNoYXIgc2V0LiAqKVxubGV0IHJldl9jaGFyX3NldCBjaGFyX3NldCA9XG4gIGxldCBjaGFyX3NldCcgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIDMxIGRvXG4gICAgQnl0ZXMuc2V0IGNoYXJfc2V0JyBpXG4gICAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IGkpIGx4b3IgMHhGRikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGNoYXJfc2V0J1xuXG4oKiBSZXR1cm4gdHJ1ZSBpZiBhIGBjJyBpcyBpbiBgY2hhcl9zZXQnLiAqKVxubGV0IGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxhbmQgbWFzaykgPD4gMFxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogSWdub3JlZCBwYXJhbSBjb252ZXJzaW9uICopXG5cbigqIEdBRFQgdXNlZCB0byBhYnN0cmFjdCBhbiBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlci4gKilcbigqIFNlZSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiID0gUGFyYW1fZm9ybWF0X0VCQiA6XG4gICAgKCd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiXG5cbigqIENvbXB1dGUgYSBwYWRkaW5nIGFzc29jaWF0ZWQgdG8gYSBwYWRfb3B0aW9uIChzZWUgXCIlXzQyZFwiKS4gKilcbmxldCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wYWRkaW5nXG4gIHwgU29tZSB3aWR0aCAtPiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuXG4oKiBDb21wdXRlIGEgcHJlY2lzaW9uIGFzc29jaWF0ZWQgdG8gYSBwcmVjX29wdGlvbiAoc2VlIFwiJV8uNDJmXCIpLiAqKVxubGV0IHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQgPSBtYXRjaCBwcmVjX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wcmVjaXNpb25cbiAgfCBTb21lIG5kZWMgLT4gTGl0X3ByZWNpc2lvbiBuZGVjXG5cbigqIFR1cm4gYW4gaWdub3JlZCBwYXJhbSBpbnRvIGl0cyBlcXVpdmFsZW50IG5vdC1pZ25vcmVkIGZvcm1hdCBub2RlLiAqKVxuKCogVXNlZCBmb3IgZm9ybWF0IHByZXR0eS1wcmludGluZyBhbmQgU2NhbmYuICopXG5sZXQgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+ICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYXJhbV9mb3JtYXRfZWJiID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2hhciBmbXQpXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX2NoYXIgZm10KVxuICB8IElnbm9yZWRfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDMyIChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50MzIgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChOYXRpdmVpbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQ2NCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDY0IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfZmxvYXQgKHBhZF9vcHQsIHByZWNfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGbG9hdCAoKEZsb2F0X2ZsYWdfLCBGbG9hdF9mKSxcbiAgICAgICAgICAgICAgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Jvb2wgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEJvb2wgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChSZWFkZXIgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10KVxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlcyAqKVxuXG50eXBlICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlbiA9XG4gIHwgQWNjX29wZW5fdGFnIG9mICgnYiwgJ2MpIGFjY1xuICB8IEFjY19vcGVuX2JveCBvZiAoJ2IsICdjKSBhY2NcblxuKCogUmV2ZXJzZWQgbGlzdCBvZiBwcmludGluZyBhdG9tcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBwcmludGYgYXJndW1lbnRzLiAqKVxuYW5kICgnYiwgJ2MpIGFjYyA9XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IG9mICgnYiwgJ2MpIGFjYyAqIGZvcm1hdHRpbmdfbGl0XG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gb2YgKCdiLCAnYykgYWNjICogKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuXG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBMaXRlcmFsIHN0cmluZyAqKVxuICB8IEFjY19jaGFyX2xpdGVyYWwgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIExpdGVyYWwgY2hhciAqKVxuICB8IEFjY19kYXRhX3N0cmluZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIEdlbmVyYXRlZCBzdHJpbmcgKilcbiAgfCBBY2NfZGF0YV9jaGFyICAgICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBHZW5lcmF0ZWQgY2hhciAqKVxuICB8IEFjY19kZWxheSAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IgLT4gJ2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBEZWxheWVkIHByaW50aW5nICglYSwgJXQpICopXG4gIHwgQWNjX2ZsdXNoICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAgICAgICAgICAgICAgKCogRmx1c2ggKilcbiAgfCBBY2NfaW52YWxpZF9hcmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nXG4gICAgICAoKiBSYWlzZSBJbnZhbGlkX2FyZ3VtZW50IG1zZyAqKVxuICB8IEVuZF9vZl9hY2NcblxuKCogTGlzdCBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBzY2FuZiBjYWxsYmFjayBhcmd1bWVudHMuICopXG50eXBlICgnYSwgJ2IpIGhldGVyX2xpc3QgPVxuICB8IENvbnMgOiAnYyAqICgnYSwgJ2IpIGhldGVyX2xpc3QgLT4gKCdjIC0+ICdhLCAnYikgaGV0ZXJfbGlzdFxuICB8IE5pbCA6ICgnYiwgJ2IpIGhldGVyX2xpc3RcblxuKCogRXhpc3RlbnRpYWwgQmxhY2sgQm94ZXMuICopXG4oKiBVc2VkIHRvIGFic3RyYWN0IHNvbWUgZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRkaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmIgPSBQYWRkaW5nX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRwcmVjIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmIgPSBQYWRwcmVjX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICd6KSBwcmVjaXNpb24gKiAoJ3osICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZGRpbmdfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiID0gUGFkZGluZ19mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwYWRkaW5nICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wcmVjaXNpb25fZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmIgPSBQcmVjaXNpb25fZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkcHJlY19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmIgPSBQYWRwcmVjX2ZtdF9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAncCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgdGhlICdhIGFuZCAnZCBwYXJhbWV0ZXJzIG9mIGFuIGZtdC4gKilcbigqIE91dHB1dCB0eXBlIG9mIHRoZSBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiID0gRm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2Zvcm1hdF9nZW4gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiID0gRm10X2ZtdHR5X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXQgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYiA9IEZtdHR5X2ZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10dHkgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10X2ZtdHR5X2ViYiAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgZm10dHkgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIGZvcm1hdCB0eXBlcy4gKilcbnR5cGUgZm10dHlfZWJiID0gRm10dHlfRUJCIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+IGZtdHR5X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcGFkZGluZyB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcGFkZGluZ3MuICopXG50eXBlIHBhZGRpbmdfZWJiID0gUGFkZGluZ19FQkIgOiAoJ2EsICdiKSBwYWRkaW5nIC0+IHBhZGRpbmdfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwcmVjaXNpb24gdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHByZWNpc2lvbnMuICopXG50eXBlIHByZWNpc2lvbl9lYmIgPSBQcmVjaXNpb25fRUJCIDogKCdhLCAnYikgcHJlY2lzaW9uIC0+IHByZWNpc2lvbl9lYmJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb25zdGFudHMgKilcblxuKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIGZsb2F0IHByaW50aW5nLiAqKVxubGV0IGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252ID1cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyB8IEZsb2F0X2ggfCBGbG9hdF9IXG4gIHwgRmxvYXRfQ0YgLT4gLTZcbiAgKCogRm9yICVoICVIIGFuZCAlI0YgZm9ybWF0cywgYSBuZWdhdGl2ZSBwcmVjaXNpb24gbWVhbnMgXCJhcyBtYW55IGRpZ2l0cyBhc1xuICAgICBuZWNlc3NhcnlcIi4gIEZvciB0aGUgb3RoZXIgRlAgZm9ybWF0cywgd2UgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICAgb2YgdGhlIHByZWNpc2lvbiwgaGVuY2UgNiBkaWdpdHMgYnkgZGVmYXVsdC4gKilcbiAgfCBGbG9hdF9GIC0+IDEyXG4gICgqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBPQ2FtbCBmbG9hdCBwcmludGluZyAoJUYpLiAqKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEV4dGVybmFscyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQ6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDMyOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfbmF0aXZlaW50OiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ2NDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxuZXh0ZXJuYWwgaGV4c3RyaW5nX29mX2Zsb2F0OiBmbG9hdCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0XCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICgqIFRvb2xzIHRvIHByZXR0eS1wcmludCBmb3JtYXRzICopXG5cbigqIFR5cGUgb2YgZXh0ZW5zaWJsZSBjaGFyYWN0ZXIgYnVmZmVycy4gKilcbnR5cGUgYnVmZmVyID0ge1xuICBtdXRhYmxlIGluZCA6IGludDtcbiAgbXV0YWJsZSBieXRlcyA6IGJ5dGVzO1xufVxuXG4oKiBDcmVhdGUgYSBmcmVzaCBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NyZWF0ZSBpbml0X3NpemUgPSB7IGluZCA9IDA7IGJ5dGVzID0gQnl0ZXMuY3JlYXRlIGluaXRfc2l6ZSB9XG5cbigqIENoZWNrIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgZ3JvdyBpdCBpZiBuZWVkZWQuICopXG5sZXQgYnVmZmVyX2NoZWNrX3NpemUgYnVmIG92ZXJoZWFkID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYuYnl0ZXMgaW5cbiAgbGV0IG1pbl9sZW4gPSBidWYuaW5kICsgb3ZlcmhlYWQgaW5cbiAgaWYgbWluX2xlbiA+IGxlbiB0aGVuIChcbiAgICBsZXQgbmV3X2xlbiA9IEludC5tYXggKGxlbiAqIDIpIG1pbl9sZW4gaW5cbiAgICBsZXQgbmV3X3N0ciA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYuYnl0ZXMgMCBuZXdfc3RyIDAgbGVuO1xuICAgIGJ1Zi5ieXRlcyA8LSBuZXdfc3RyO1xuICApXG5cbigqIEFkZCB0aGUgY2hhcmFjdGVyIGBjJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfY2hhciBidWYgYyA9XG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiAxO1xuICBCeXRlcy5zZXQgYnVmLmJ5dGVzIGJ1Zi5pbmQgYztcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgMVxuXG4oKiBBZGQgdGhlIHN0cmluZyBgcycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX3N0cmluZyBidWYgcyA9XG4gIGxldCBzdHJfbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBzdHJfbGVuO1xuICBTdHJpbmcuYmxpdCBzIDAgYnVmLmJ5dGVzIGJ1Zi5pbmQgc3RyX2xlbjtcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgc3RyX2xlblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY29udGVudHMgYnVmID1cbiAgQnl0ZXMuc3ViX3N0cmluZyBidWYuYnl0ZXMgMCBidWYuaW5kXG5cbigqKiopXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciBjb252ZXJzaW9uIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9pY29udiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCB8IEludF9DZCAtPiAnZCcgfCBJbnRfaSB8IEludF9waSB8IEludF9zaVxuICB8IEludF9DaSAtPiAnaScgfCBJbnRfeCB8IEludF9DeCAtPiAneCcgfCBJbnRfWCB8IEludF9DWCAtPiAnWCcgfCBJbnRfb1xuICB8IEludF9DbyAtPiAnbycgfCBJbnRfdSB8IEludF9DdSAtPiAndSdcblxuKCogQ29udmVydCBhIGZsb2F0IGNvbnZlcnNpb24gdG8gY2hhci4gKilcbigqIGBjRicgd2lsbCBiZSAnRicgZm9yIGRpc3BsYXlpbmcgZm9ybWF0IGFuZCAnZycgdG8gY2FsbCBsaWJjIHByaW50ZiAqKVxubGV0IGNoYXJfb2ZfZmNvbnYgPyhjRj0nRicpIGZjb252ID0gbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIC0+ICdmJyB8IEZsb2F0X2UgLT4gJ2UnXG4gIHwgRmxvYXRfRSAtPiAnRScgfCBGbG9hdF9nIC0+ICdnJ1xuICB8IEZsb2F0X0cgLT4gJ0cnIHwgRmxvYXRfRiAtPiBjRlxuICB8IEZsb2F0X2ggLT4gJ2gnIHwgRmxvYXRfSCAtPiAnSCdcbiAgfCBGbG9hdF9DRiAtPiAnRidcblxuXG4oKiBDb252ZXJ0IGEgc2Nhbm5pbmcgY291bnRlciB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfY291bnRlciBjb3VudGVyID0gbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyICAtPiAnbCdcbiAgfCBDaGFyX2NvdW50ZXIgIC0+ICduJ1xuICB8IFRva2VuX2NvdW50ZXIgLT4gJ04nXG5cbigqKiopXG5cbigqIFByaW50IGEgY2hhcl9zZXQgaW4gYSBidWZmZXIgd2l0aCB0aGUgT0NhbWwgZm9ybWF0IGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0ID1cbiAgbGV0IHJlYyBwcmludF9zdGFydCBzZXQgPVxuICAgIGxldCBpc19hbG9uZSBjID1cbiAgICAgIGxldCBiZWZvcmUsIGFmdGVyID0gQ2hhci4oY2hyIChjb2RlIGMgLSAxKSwgY2hyIChjb2RlIGMgKyAxKSkgaW5cbiAgICAgIGlzX2luX2NoYXJfc2V0IHNldCBjXG4gICAgICAmJiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCBiZWZvcmUgJiYgaXNfaW5fY2hhcl9zZXQgc2V0IGFmdGVyKSBpblxuICAgIGlmIGlzX2Fsb25lICddJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nO1xuICAgIHByaW50X291dCBzZXQgMTtcbiAgICBpZiBpc19hbG9uZSAnLScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICctJztcbiAgYW5kIHByaW50X291dCBzZXQgaSA9XG4gICAgaWYgaSA8IDI1NiB0aGVuXG4gICAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW4gcHJpbnRfZmlyc3Qgc2V0IGlcbiAgICAgIGVsc2UgcHJpbnRfb3V0IHNldCAoaSArIDEpXG4gIGFuZCBwcmludF9maXJzdCBzZXQgaSA9XG4gICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnXFwyNTUnIC0+IHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICB8ICddJyB8ICctJyAtPiBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgfCBfIC0+IHByaW50X3NlY29uZCBzZXQgKGkgKyAxKTtcbiAgYW5kIHByaW50X3NlY29uZCBzZXQgaSA9XG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuXG4gICAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICAgIHwgJ1xcMjU1JyAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTQ7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICAgIHwgJ10nIHwgJy0nIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgICB8IF8gd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAyKTtcbiAgICAgIHwgXyAtPlxuICAgICAgICBwcmludF9pbiBzZXQgKGkgLSAxKSAoaSArIDIpO1xuICAgIGVsc2UgKFxuICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICApXG4gIGFuZCBwcmludF9pbiBzZXQgaSBqID1cbiAgICBpZiBqID0gMjU2IHx8IG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBqKSkgdGhlbiAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGludF9vZl9jaGFyICctJyk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaiAtIDEpO1xuICAgICAgaWYgaiA8IDI1NiB0aGVuIHByaW50X291dCBzZXQgKGogKyAxKTtcbiAgICApIGVsc2VcbiAgICAgIHByaW50X2luIHNldCBpIChqICsgMSk7XG4gIGFuZCBwcmludF9jaGFyIGJ1ZiBpID0gbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnJScgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIHwgJ0AnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICdAJztcbiAgICB8IGMgICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGluXG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1snO1xuICBwcmludF9zdGFydCAoXG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgJ1xcMDAwJ1xuICAgIHRoZW4gKCBidWZmZXJfYWRkX2NoYXIgYnVmICdeJzsgcmV2X2NoYXJfc2V0IGNoYXJfc2V0IClcbiAgICBlbHNlIGNoYXJfc2V0XG4gICk7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nXG5cbigqKiopXG5cbigqIFByaW50IGEgcGFkdHkgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWR0eSBidWYgcGFkdHkgPSBtYXRjaCBwYWR0eSB3aXRoXG4gIHwgTGVmdCAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSdcbiAgfCBSaWdodCAtPiAoKVxuICB8IFplcm9zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJzAnXG5cbigqIFByaW50IHRoZSAnXycgb2YgYW4gaWdub3JlZCBmbGFnIGlmIG5lZWRlZC4gKilcbmxldCBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZyA9XG4gIGlmIGlnbl9mbGFnIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXydcblxuKCoqKilcblxubGV0IGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgd2lkdGggLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHdpZHRoKVxuXG4oKioqKVxuXG4oKiBQcmludCBwYWRkaW5nIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkZGluZyA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwYWRkaW5nIC0+IHVuaXQgPVxuZnVuIGJ1ZiBwYWQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+ICgpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCBuKSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcqJ1xuXG4oKiBQcmludCBwcmVjaXNpb24gaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wcmVjaXNpb24gOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcHJlY2lzaW9uIC0+IHVuaXQgPVxuICBmdW4gYnVmIHByZWMgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uIC0+ICgpXG4gIHwgTGl0X3ByZWNpc2lvbiBuIC0+XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wcmVjaXNpb24gLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIuKlwiXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBvciAnIycgYXNzb2NpYXRlZCB0byBhbiBpbnQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X3BkIHwgSW50X3BpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgSW50X3NkIHwgSW50X3NpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgSW50X0N4IHwgSW50X0NYIHwgSW50X0NvIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEludF9kIHwgSW50X2kgfCBJbnRfeCB8IEludF9YIHwgSW50X28gfCBJbnRfdSAtPiAoKVxuXG4oKiBQcmludCBhbiBjb21wbGV0ZSBpbnQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlMy4qZFwiKS4gKilcbmxldCBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBhbmQvb3IgJyMnIGFzc29jaWF0ZWQgdG8gYSBmbG9hdCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udiA9XG4gIGJlZ2luIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZmxhZ19wIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgRmxvYXRfZmxhZ19zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgRmxvYXRfZmxhZ18gLT4gKCkgZW5kO1xuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X0NGIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0dcbiAgfCBGbG9hdF9GIHwgRmxvYXRfaCB8IEZsb2F0X0ggLT4gKClcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmbG9hdCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUrKi4zZlwiKS4gKilcbmxldCBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2Zjb252IGZjb252KVxuXG4oKiBDb21wdXRlIHRoZSBsaXRlcmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZvcm1hdHRpbmdfbGl0LiAqKVxuKCogVXNlZCBieSBQcmludGYgYW5kIFNjYW5mIHdoZXJlIGZvcm1hdHRpbmcgaXMgbm90IGludGVycHJldGVkLiAqKVxubGV0IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCA9IG1hdGNoIGZvcm1hdHRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAtPiBcIkBdXCJcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAtPiBcIkB9XCJcbiAgfCBCcmVhayAoc3RyLCBfLCBfKSAgICAtPiBzdHJcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAtPiBcIkA/XCJcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAtPiBcIkBcXG5cIlxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgIC0+IFwiQC5cIlxuICB8IE1hZ2ljX3NpemUgKHN0ciwgXykgIC0+IHN0clxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgIC0+IFwiQEBcIlxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgIC0+IFwiQCVcIlxuICB8IFNjYW5faW5kaWMgYyAtPiBcIkBcIiBeIChTdHJpbmcubWFrZSAxIGMpXG5cbigqKiopXG5cbigqIFByaW50IGEgbGl0ZXJhbCBjaGFyIGluIGEgYnVmZmVyLCBlc2NhcGUgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHIgPSBtYXRjaCBjaHIgd2l0aFxuICB8ICclJyAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlJVwiXG4gIHwgXyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGNoclxuXG4oKiBQcmludCBhIGxpdGVyYWwgc3RyaW5nIGluIGEgYnVmZmVyLCBlc2NhcGUgYWxsICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHIgPVxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzdHIgLSAxIGRvXG4gICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgc3RyLltpXVxuICBkb25lXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwcmV0dHktcHJpbnRpbmcgKilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgdHlwZSAoYW4gZm10dHkpIGluIGEgYnVmZmVyLiAqKVxubGV0IHJlYyBicHJpbnRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgICBidWZmZXIgLT4gKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiB1bml0ID1cbmZ1biBidWYgZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVjXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlaVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDMyX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVsaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJW5pXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlTGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZsb2F0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVmXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQm9vbF90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbHBoYV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlYVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFRoZXRhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV0XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQW55X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJT9cIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBSZWFkZXJfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlclwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVfclwiO1xuICAgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIle1wiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlfVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHksIF8sIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJShcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRW5kX29mX2ZtdHR5IC0+ICgpXG5cbigqKiopXG5cbmxldCByZWMgaW50X29mX2N1c3RvbV9hcml0eSA6IHR5cGUgYSBiIGMgLlxuICAoYSwgYiwgYykgY3VzdG9tX2FyaXR5IC0+IGludCA9XG4gIGZ1bmN0aW9uXG4gIHwgQ3VzdG9tX3plcm8gLT4gMFxuICB8IEN1c3RvbV9zdWNjIHggLT4gMSArIGludF9vZl9jdXN0b21fYXJpdHkgeFxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfZm10IGJ1ZiBmbXQgPVxuICBsZXQgcmVjIGZtdGl0ZXIgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYm9vbCAtPiB1bml0ID1cbiAgZnVuIGZtdCBpZ25fZmxhZyAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdzJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdTJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ2wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICduJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdMJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdDJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdhJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAndCc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICBmb3IgX2kgPSAxIHRvIGludF9vZl9jdXN0b21fYXJpdHkgYXJpdHkgZG9cbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICc/JztcbiAgICAgIGRvbmU7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBSZWFkZXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncic7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUhXCI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0cjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICd7JztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICd9JztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgd2lkdGhfb3B0OyBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0O1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfY291bnRlciBjb3VudGVyKTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgXCIwY1wiOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICAgIGZtdGl0ZXIgZm10JyB0cnVlO1xuXG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0KTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZm10aW5nX2dlbiB3aXRoXG4gICAgICB8IE9wZW5fdGFnIChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkB7XCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIHwgT3Blbl9ib3ggKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQFtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgZW5kO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+ICgpXG5cbiAgaW4gZm10aXRlciBmbXQgZmFsc2VcblxuKCoqKilcblxuKCogQ29udmVydCBhIGZvcm1hdCB0byBzdHJpbmcuICopXG5sZXQgc3RyaW5nX29mX2ZtdCBmbXQgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10IGJ1ZiBmbXQ7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZSBleHRyYWN0aW9uICopXG5cbnR5cGUgKF8sIF8pIGVxID0gUmVmbCA6ICgnYSwgJ2EpIGVxXG5cbigqIEludmFyaWFudDogdGhpcyBmdW5jdGlvbiBpcyB0aGUgaWRlbnRpdHkgb24gdmFsdWVzLlxuXG4gICBJbiBwYXJ0aWN1bGFyLCBpZiAodHkxLCB0eTIpIGhhdmUgZXF1YWwgdmFsdWVzLCB0aGVuXG4gICAodHJhbnMgKHN5bW0gdHkxKSB0eTIpIHJlc3BlY3RzIHRoZSAndHJhbnMnIHByZWNvbmRpdGlvbi4gKilcbmxldCByZWMgc3ltbSA6IHR5cGUgYTEgYjEgYzEgZDEgZTEgZjEgYTIgYjIgYzIgZDIgZTIgZjIgLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXR0eV9yZWxcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT4gQ2hhcl90eSAoc3ltbSByZXN0KVxuICB8IEludF90eSByZXN0IC0+IEludF90eSAoc3ltbSByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT4gSW50MzJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+IEludDY0X3R5IChzeW1tIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gTmF0aXZlaW50X3R5IChzeW1tIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPiBGbG9hdF90eSAoc3ltbSByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPiBCb29sX3R5IChzeW1tIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT4gU3RyaW5nX3R5IChzeW1tIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPiBUaGV0YV90eSAoc3ltbSByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT4gQWxwaGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPiBBbnlfdHkgKHN5bW0gcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPiBSZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+IElnbm9yZWRfcmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyLCB0eTEsIHN5bW0gcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbmxldCByZWMgZm10dHlfcmVsX2RldCA6IHR5cGUgYTEgYiBjIGQxIGUxIGYxIGEyIGQyIGUyIGYyIC5cbiAgKGExLCBiLCBjLCBkMSwgZTEsIGYxLFxuICAgYTIsIGIsIGMsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoZjEsIGYyKSBlcSAtPiAoYTEsIGEyKSBlcSlcbiAgKiAoKGExLCBhMikgZXEgLT4gKGYxLCBmMikgZXEpXG4gICogKChlMSwgZTIpIGVxIC0+IChkMSwgZDIpIGVxKVxuICAqICgoZDEsIGQyKSBlcSAtPiAoZTEsIGUyKSBlcSlcbj0gZnVuY3Rpb25cbiAgfCBFbmRfb2ZfZm10dHkgLT5cbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbClcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgRm9ybWF0X2FyZ190eSAoX3R5LCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgbGV0IGFnLCBnYSwgZGosIGpkID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZyBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGdhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gbGV0IFJlZmwgPSBkaiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGpkIFJlZmwgaW4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG5cbigqIFByZWNvbmRpdGlvbjogd2UgYXNzdW1lIHRoYXQgdGhlIHR3byBmbXR0eV9yZWwgYXJndW1lbnRzIGhhdmUgZXF1YWxcbiAgIHZhbHVlcyAoYXQgcG9zc2libHkgZGlzdGluY3QgdHlwZXMpOyB0aGlzIGludmFyaWFudCBjb21lcyBmcm9tIHRoZSB3YXlcbiAgIGZtdHR5X3JlbCB3aXRuZXNzZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSB0eXBlLWNoZWNrZXJcblxuICAgVGhlIGNvZGUgYmVsb3cgdXNlcyAoYXNzZXJ0IGZhbHNlKSB3aGVuIHRoaXMgYXNzdW1wdGlvbiBpcyBicm9rZW4uIFRoZVxuICAgY29kZSBwYXR0ZXJuIGlzIHRoZSBmb2xsb3dpbmc6XG5cbiAgICAgfCBGb28geCwgRm9vIHkgLT5cbiAgICAgICAoKiBjYXNlIHdoZXJlIGluZGVlZCBib3RoIHZhbHVlc1xuICAgICAgICAgIHN0YXJ0IHdpdGggY29uc3RydWN0b3IgRm9vICopXG4gICAgIHwgRm9vIF8sIF9cbiAgICAgfCBfLCBGb28gXyAtPlxuICAgICAgICgqIGRpZmZlcmVudCBoZWFkIGNvbnN0cnVjdG9yczogYnJva2VuIHByZWNvbmRpdGlvbiAqKVxuICAgICAgIGFzc2VydCBmYWxzZVxuKilcbmFuZCB0cmFucyA6IHR5cGVcbiAgYTEgYjEgYzEgZDEgZTEgZjFcbiAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgYTMgYjMgYzMgZDMgZTMgZjNcbi5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG4tPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbj0gZnVuIHR5MSB0eTIgLT4gbWF0Y2ggdHkxLCB0eTIgd2l0aFxuICB8IENoYXJfdHkgcmVzdDEsIENoYXJfdHkgcmVzdDIgLT4gQ2hhcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgU3RyaW5nX3R5IHJlc3QxLCBTdHJpbmdfdHkgcmVzdDIgLT4gU3RyaW5nX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBCb29sX3R5IHJlc3QxLCBCb29sX3R5IHJlc3QyIC0+IEJvb2xfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludF90eSByZXN0MSwgSW50X3R5IHJlc3QyIC0+IEludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50MzJfdHkgcmVzdDEsIEludDMyX3R5IHJlc3QyIC0+IEludDMyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQ2NF90eSByZXN0MSwgSW50NjRfdHkgcmVzdDIgLT4gSW50NjRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IE5hdGl2ZWludF90eSByZXN0MSwgTmF0aXZlaW50X3R5IHJlc3QyIC0+IE5hdGl2ZWludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRmxvYXRfdHkgcmVzdDEsIEZsb2F0X3R5IHJlc3QyIC0+IEZsb2F0X3R5ICh0cmFucyByZXN0MSByZXN0MilcblxuICB8IEFscGhhX3R5IHJlc3QxLCBBbHBoYV90eSByZXN0MiAtPiBBbHBoYV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQWxwaGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbHBoYV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgVGhldGFfdHkgcmVzdDEsIFRoZXRhX3R5IHJlc3QyIC0+IFRoZXRhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBUaGV0YV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFRoZXRhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBBbnlfdHkgcmVzdDEsIEFueV90eSByZXN0MiAtPiBBbnlfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFueV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFueV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgUmVhZGVyX3R5IHJlc3QxLCBSZWFkZXJfdHkgcmVzdDIgLT4gUmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBSZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBSZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QxLCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MiAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIElnbm9yZWRfcmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfYXJnX3R5ICh0eTEsIHJlc3QxKSwgRm9ybWF0X2FyZ190eSAodHkyLCByZXN0MikgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0cmFucyB0eTEgdHkyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfYXJnX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X2FyZ190eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTEyLCByZXN0MSksXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIxLCB0eTIyLCByZXN0MikgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEyKSB0eTIxIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MjIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9zdWJzdF90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9zdWJzdF90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRW5kX29mX2ZtdHR5LCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG4gIHwgRW5kX29mX2ZtdHR5LCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEVuZF9vZl9mbXR0eSAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHJlYyBmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBFeHRyYWN0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIChhbiBmbXR0eSkgb2YgYSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfZm10IDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuXG4gIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQzMl90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoTmF0aXZlaW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDY0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEZsb2F0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuXG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAgICAgICAgICAgLT5cbiAgICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChCb29sX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gQWxwaGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgIC0+IFRoZXRhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAgICAtPiBmbXR0eV9vZl9jdXN0b20gYXJpdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFJlYWRlciByZXN0ICAgICAgICAgICAgICAgIC0+IFJlYWRlcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5LCB0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+IFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT4gSW50X3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAtPiBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdFxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpICAtPlxuICAgIGNvbmNhdF9mbXR0eSAoZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gZm10aW5nX2dlbikgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgLT4gRW5kX29mX2ZtdHR5XG5cbmFuZCBmbXR0eV9vZl9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICh5LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gYXJpdHkgZm10dHkgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IGZtdHR5XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT4gQW55X3R5IChmbXR0eV9vZl9jdXN0b20gYXJpdHkgZm10dHkpXG5cbigqIEV4dHJhY3QgdGhlIGZtdHR5IG9mIGFuIGlnbm9yZWQgcGFyYW1ldGVyIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mXG4gICB0aGUgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gY29uY2F0X2ZtdHR5IGZtdHR5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gSWdub3JlZF9yZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwYWRkaW5nIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKnNcIikuICopXG5hbmQgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAgLT4gZm10dHlcbiAgICB8IExpdF9wYWRkaW5nIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wYWRkaW5nIF8gLT4gSW50X3R5IGZtdHR5XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwcmVjaXNpb24gaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikuKilcbmFuZCBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMgd2l0aFxuICAgIHwgTm9fcHJlY2lzaW9uICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcHJlY2lzaW9uIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wcmVjaXNpb24gICAtPiBJbnRfdHkgZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwaW5nICopXG5cbigqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZvcm1hdCBkb2VzIG5vdCBtYXRjaCBhIGdpdmVuIGZvcm1hdCB0eXBlLiAqKVxuZXhjZXB0aW9uIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIHBhZGRpbmcuICopXG4oKiBUYWtlIGFuIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiB0aGUgaW50ZWdlciBzaG91bGQgYmUga2VwdCBhcyBhcmd1bWVudC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkZGluZyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCwgZm10dHkgd2l0aFxuICB8IE5vX3BhZGRpbmcsIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKE5vX3BhZGRpbmcsIGZtdHR5KVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKExpdF9wYWRkaW5nIChwYWR0eSx3KSxmbXR0eSlcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgSW50X3R5IHJlc3QgLT4gUGFkZGluZ19mbXR0eV9FQkIgKEFyZ19wYWRkaW5nIHBhZHR5LHJlc3QpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIENvbnZlcnQgYSAodXBhZGRpbmcsIHVwcmVjaXNpb24pIHRvIGEgKHBhZGRpbmcsIHByZWNpc2lvbikuICopXG4oKiBUYWtlIG9uZSBvciB0d28gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIG5lZWRlZC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkcHJlYyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IHogLlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeikgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYywgdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIE5vX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAsIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTGl0X3ByZWNpc2lvbiBwLCByZXN0KVxuICB8IEFyZ19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEludF90eSByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIEFyZ19wcmVjaXNpb24sIHJlc3QpXG4gIHwgXywgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBJZiB0eXBpbmcgc3VjY2VlZCwgZ2VuZXJhdGUgYSBjb3B5IG9mIHRoZSBmb3JtYXQgd2l0aCB0aGUgc2FtZVxuICAgIHR5cGUgcGFyYW1ldGVycyBhcyB0aGUgZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCByZWMgdHlwZV9mb3JtYXQgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgd2l0aFxuICB8IEZtdF9mbXR0eV9FQkIgKGZtdCcsIEVuZF9vZl9mbXR0eSkgLT4gZm10J1xuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXRfZ2VuIDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggZm10LCBmbXR0eSB3aXRoXG4gIHwgQ2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXIgZm10JywgZm10dHknKVxuICB8IENhbWxfY2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfY2hhciBmbXQnLCBmbXR0eScpXG4gIHwgU3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfc3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50MzJfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDY0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgRmxvYXRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEJvb2wgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEJvb2xfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEJvb2wgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbHVzaCBmbXRfcmVzdCwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGbHVzaCBmbXQnLCBmbXR0eScpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10JyksIGZtdHR5JylcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXJfbGl0ZXJhbCAoY2hyLCBmbXQnKSwgZm10dHknKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5JywgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5MSwgX3N1Yl9mbXR0eTIsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkxKSB0aGVuXG4gICAgICByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID1cbiAgICAgIHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCAoZXJhc2VfcmVsIGZtdHR5X3Jlc3QpXG4gICAgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eTEsIGZtdCcpLCBmbXR0eScpXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBBbHBoYSBmbXRfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChBbHBoYSBmbXQnLCBmbXR0eScpXG4gIHwgVGhldGEgZm10X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoVGhldGEgZm10JywgZm10dHknKVxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nX2dlbiwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9mb3JtYXR0aW5nX2dlbiBmb3JtYXR0aW5nX2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciBmbXRfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoUmVhZGVyIGZtdCcsIGZtdHR5JylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXRfcmVzdCksIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpLCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQnKSwgZm10dHknKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW0gaWduIHJlc3QgZm10dHlfcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdCAtPiBGbXRfZm10dHlfRUJCIChFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0KVxuXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhMSBhMyBiMSBiMyBjMSBjMyBkMSBkMyBlMSBlMiBlMyBmMSBmMiBmMyAuXG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGYxLCBiMSwgYzEsIGUxLCBlMiwgZjIpIGZtdCAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eSAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXRfZm10dHlfZWJiID1cbmZ1biBmb3JtYXR0aW5nX2dlbiBmbXQwIGZtdHR5MCAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcblxuKCogVHlwZSBhbiBJZ25vcmVkX3BhcmFtIG5vZGUgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbSA6IHR5cGUgcCBxIHggeSB6IHQgdSB2IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgeSwgeiwgdCwgcSwgcCkgaWdub3JlZCAtPlxuICAgIChwLCB5LCB6LCBxLCB1LCB2KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10X2ZtdHR5X2ViYiA9XG5mdW4gaWduIGZtdCBmbXR0eSAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50IF8gICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50MzIgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfbmF0aXZlaW50IF8gICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50NjQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZmxvYXQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgKElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSkgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5JywgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSkgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5IGZtdCBmbXR0eSBpblxuICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQnKSxcbiAgICAgICAgICAgICAgICAgICBmbXR0eScpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT4gKFxuICAgIG1hdGNoIGZtdHR5IHdpdGhcbiAgICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10JyksIGZtdHR5JylcbiAgICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG5cbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIDogdHlwZSBhMSBhMiBiMSBiMiBjMSBjMiBkMSBkMiBlMSBlMiBmMSBmMiAuXG4gICAgKGEyLCBiMiwgYzIsIGQyLCBkMiwgYTIpIGlnbm9yZWQgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGlnbiBmbXQgZm10dHkgLT5cbiAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IGluXG4gIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbiwgZm10JyksIGZtdHR5JylcblxuKCogVHlwaW5nIG9mIHRoZSBjb21wbGV4IGNhc2U6IFwiJV8oLi4uJSlcIi4gKilcbmFuZCB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiA6IHR5cGUgdyB4IHkgeiBwIHMgdCB1IGEgYiBjIGQgZSBmIC5cbiAgICAodywgeCwgeSwgeiwgcywgcCkgZm10dHkgLT5cbiAgICAocCwgeCwgeSwgcywgdCwgdSkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eV9mbXRfZWJiID1cbmZ1biBzdWJfZm10dHkgZm10IGZtdHR5IC0+IG1hdGNoIHN1Yl9mbXR0eSwgZm10dHkgd2l0aFxuICB8IENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQ2hhcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0LCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQzMl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQzMl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCwgSW50NjRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0LCBGbG9hdF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGbG9hdF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQm9vbF90eSBzdWJfZm10dHlfcmVzdCwgQm9vbF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChCb29sX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBBbHBoYV90eSBzdWJfZm10dHlfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChUaGV0YV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eSwgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWIyX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWIyX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5Jywgc3ViX2ZtdHR5X3Jlc3QnKSwgZm10JylcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHksICBzdWIyX2ZtdHR5LCAgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgICgqIFRPRE8gZGVmaW5lIEZtdHR5X3JlbF9FQkIgdG8gcmVtb3ZlIHRob3NlIGVyYXNlX3JlbCAqKVxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IHN1Yl9mbXR0eScgPSB0cmFucyAoc3ltbSBzdWIxX2ZtdHR5Jykgc3ViMl9mbXR0eScgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCBzdWJfZm10dHknIGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gKGVyYXNlX3JlbCBzdWJfZm10dHlfcmVzdCkgZm10IGZtdHR5X3Jlc3RcbiAgICBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbSBzdWJfZm10dHlfcmVzdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdCcpXG4gIHwgRW5kX29mX2ZtdHR5LCBmbXR0eSAtPlxuICAgIEZtdHR5X2ZtdF9FQkIgKEVuZF9vZl9mbXR0eSwgdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSlcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBgcmVjYXN0YCBpcyBhIGJpdCBkaXNhcHBvaW50aW5nLiBUaGVcbiAgIGludmFyaWFudCBwcm92aWRlZCBieSB0aGUgdHlwZSBhcmUgdmVyeSBzdHJvbmc6IHRoZSBpbnB1dCBmb3JtYXQnc1xuICAgdHlwZSBpcyBpbiByZWxhdGlvbiB0byB0aGUgb3V0cHV0IHR5cGUncyBhcyB3aXRuZXNzZWQgYnkgdGhlXG4gICBmbXR0eV9yZWwgYXJndW1lbnQuIE9uZSB3b3VsZCBhdCBmaXJzdCBleHBlY3QgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgdG90YWwsIGFuZCBpbXBsZW1lbnRhYmxlIGJ5IGV4aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZy4gSW5zdGVhZCxcbiAgIHdlIHJldXNlIHRoZSBoaWdobHkgcGFydGlhbCBhbmQgbXVjaCBsZXNzIHdlbGwtZGVmaW5lZCBmdW5jdGlvblxuICAgYHR5cGVfZm9ybWF0YCB0aGF0IGhhcyBsb3N0IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIGNvcnJlc3BvbmRlbmNlXG4gICBiZXR3ZWVuIHRoZSBhcmd1bWVudCdzIHR5cGVzLlxuXG4gICBCZXNpZGVzIHRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXVzZXMgYSBsb3Qgb2YgdGhlXG4gICBgdHlwZV9mb3JtYXRgIGxvZ2ljIChlZy46IHNlZWluZyBJbnRfdHkgaW4gdGhlIGZtdHR5IHBhcmFtZXRlciBkb2VzXG4gICBub3QgbGV0IHlvdSBtYXRjaCBvbiBJbnQgb25seSwgYXMgeW91IG1heSBpbiBmYWN0IGhhdmUgRmxvYXRcbiAgIChBcmdfcGFkZGluZywgLi4uKSAoXCIlLipkXCIpIGJlZ2lubmluZyB3aXRoIGFuIEludF90eSksIGl0IGlzIGFsc29cbiAgIGEgcGFydGlhbCBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgdHlwaW5nIGluZm9ybWF0aW9uIGluIGEgZm9ybWF0IGlzXG4gICBub3QgcXVpdGUgZW5vdWdoIHRvIHJlY29uc3RydWN0IGl0IHVuYW1iaWd1b3VzbHkuIEZvciBleGFtcGxlLCB0aGVcbiAgIGZvcm1hdCB0eXBlcyBvZiBcIiVkJV9yXCIgYW5kIFwiJV9yJWRcIiBoYXZlIHRoZSBzYW1lIGZvcm1hdDZcbiAgIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGFyZSBub3QgYXQgYWxsIGV4Y2hhbmdlYWJsZSwgYW5kIHB1dHRpbmcgb25lXG4gICBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgbXVzdCByZXN1bHQgaW4gYSBkeW5hbWljIGZhaWx1cmUuXG5cbiAgIEdpdmVuIHRoYXQ6XG4gICAtIHdlJ2QgaGF2ZSB0byBkdXBsaWNhdGUgYSBsb3Qgb2Ygbm9uLXRyaXZpYWwgdHlwaW5nIGxvZ2ljIGZyb20gdHlwZV9mb3JtYXRcbiAgIC0gdGhpcyB3b3VsZG4ndCBldmVuIGVsaW1pbmF0ZSAoYWxsKSB0aGUgZHluYW1pYyBmYWlsdXJlc1xuICAgd2UgZGVjaWRlZCB0byBqdXN0IHJldXNlIHR5cGVfZm9ybWF0IGRpcmVjdGx5IGZvciBub3cuXG4qKVxubGV0IHJlY2FzdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+XG4gIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUHJpbnRpbmcgdG9vbHMgKilcblxuKCogQWRkIHBhZGRpbmcgc3BhY2VzIGFyb3VuZCBhIHN0cmluZy4gKilcbmxldCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCBzdHIgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoLCBwYWR0eSA9XG4gICAgYWJzIHdpZHRoLFxuICAgICgqIHdoaWxlIGxpdGVyYWwgcGFkZGluZyB3aWR0aHMgYXJlIGFsd2F5cyBub24tbmVnYXRpdmUsXG4gICAgICAgZHluYW1pY2FsbHktc2V0IHdpZHRocyAoQXJnX3BhZGRpbmcsIGVnLiAlKmQpIG1heSBiZSBuZWdhdGl2ZTtcbiAgICAgICB3ZSBpbnRlcnByZXQgdGhvc2UgYXMgc3BlY2lmeWluZyBhIHBhZGRpbmctdG8tdGhlLWxlZnQ7IHRoaXNcbiAgICAgICBtZWFucyB0aGF0ICcwJyBtYXkgZ2V0IGRyb3BwZWQgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQsXG4gICAgICAgYnV0OlxuICAgICAgIC0gdGhpcyBpcyB3aGF0IHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZG9lcywgYW5kXG4gICAgICAgICB3ZSBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IGlmIHBvc3NpYmxlXG4gICAgICAgLSB3ZSBjb3VsZCBvbmx5IHNpZ25hbCB0aGlzIGlzc3VlIGJ5IGZhaWxpbmcgYXQgcnVudGltZSxcbiAgICAgICAgIHdoaWNoIGlzIG5vdCB2ZXJ5IG5pY2UuLi4gKilcbiAgICBpZiB3aWR0aCA8IDAgdGhlbiBMZWZ0IGVsc2UgcGFkdHkgaW5cbiAgaWYgd2lkdGggPD0gbGVuIHRoZW4gc3RyIGVsc2VcbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSB3aWR0aCAoaWYgcGFkdHkgPSBaZXJvcyB0aGVuICcwJyBlbHNlICcgJykgaW5cbiAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgfCBMZWZ0ICAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgMCBsZW5cbiAgICB8IFJpZ2h0IC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAwICYmIChzdHIuWzBdID0gJysnIHx8IHN0ci5bMF0gPSAnLScgfHwgc3RyLlswXSA9ICcgJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMCBzdHIuWzBdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzICh3aWR0aCAtIGxlbiArIDEpIChsZW4gLSAxKVxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAxICYmIHN0ci5bMF0gPSAnMCcgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzICh3aWR0aCAtIGxlbiArIDIpIChsZW4gLSAyKVxuICAgIHwgWmVyb3MgLT5cbiAgICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIGVuZDtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBBZGQgJzAnIHBhZGRpbmcgdG8gaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gKilcbmxldCBmaXhfaW50X3ByZWNpc2lvbiBwcmVjIHN0ciA9XG4gIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIG1hdGNoIHN0ci5bMF0gd2l0aFxuICB8ICgnKycgfCAnLScgfCAnICcpIGFzIGMgd2hlbiBwcmVjICsgMSA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMSkgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAwIGM7XG4gICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzIChwcmVjIC0gbGVuICsgMikgKGxlbiAtIDEpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIHdoZW4gcHJlYyArIDIgPiBsZW4gJiYgbGVuID4gMSAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMikgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzIChwcmVjIC0gbGVuICsgNCkgKGxlbiAtIDIpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHdoZW4gcHJlYyA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHByZWMgJzAnIGluXG4gICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzIChwcmVjIC0gbGVuKSBsZW47XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCBfIC0+XG4gICAgc3RyXG5cbigqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGluZyBjb252ZW50aW9uLiAqKVxubGV0IHN0cmluZ190b19jYW1sX3N0cmluZyBzdHIgPVxuICBsZXQgc3RyID0gU3RyaW5nLmVzY2FwZWQgc3RyIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFxcIicgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfaW50L2ludDMyL25hdGl2ZWludC9pbnQ2NCBmaXJzdCBhcmd1bWVudFxuICAgZnJvbSBhbiBpbnRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfaWNvbnYgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWRcIiB8IEludF9wZCAtPiBcIiUrZFwiIHwgSW50X3NkIC0+IFwiJSBkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVpXCIgfCBJbnRfcGkgLT4gXCIlK2lcIiB8IEludF9zaSAtPiBcIiUgaVwiXG4gIHwgSW50X3ggLT4gXCIleFwiIHwgSW50X0N4IC0+IFwiJSN4XCJcbiAgfCBJbnRfWCAtPiBcIiVYXCIgfCBJbnRfQ1ggLT4gXCIlI1hcIlxuICB8IEludF9vIC0+IFwiJW9cIiB8IEludF9DbyAtPiBcIiUjb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIldVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZMID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVMZFwiIHwgSW50X3BkIC0+IFwiJStMZFwiIHwgSW50X3NkIC0+IFwiJSBMZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlTGlcIiB8IEludF9waSAtPiBcIiUrTGlcIiB8IEludF9zaSAtPiBcIiUgTGlcIlxuICB8IEludF94IC0+IFwiJUx4XCIgfCBJbnRfQ3ggLT4gXCIlI0x4XCJcbiAgfCBJbnRfWCAtPiBcIiVMWFwiIHwgSW50X0NYIC0+IFwiJSNMWFwiXG4gIHwgSW50X28gLT4gXCIlTG9cIiB8IEludF9DbyAtPiBcIiUjTG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJUx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udmwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWxkXCIgfCBJbnRfcGQgLT4gXCIlK2xkXCIgfCBJbnRfc2QgLT4gXCIlIGxkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVsaVwiIHwgSW50X3BpIC0+IFwiJStsaVwiIHwgSW50X3NpIC0+IFwiJSBsaVwiXG4gIHwgSW50X3ggLT4gXCIlbHhcIiB8IEludF9DeCAtPiBcIiUjbHhcIlxuICB8IEludF9YIC0+IFwiJWxYXCIgfCBJbnRfQ1ggLT4gXCIlI2xYXCJcbiAgfCBJbnRfbyAtPiBcIiVsb1wiIHwgSW50X0NvIC0+IFwiJSNsb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252biA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbmRcIiB8IEludF9wZCAtPiBcIiUrbmRcIiB8IEludF9zZCAtPiBcIiUgbmRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJW5pXCIgfCBJbnRfcGkgLT4gXCIlK25pXCIgfCBJbnRfc2kgLT4gXCIlIG5pXCJcbiAgfCBJbnRfeCAtPiBcIiVueFwiIHwgSW50X0N4IC0+IFwiJSNueFwiXG4gIHwgSW50X1ggLT4gXCIlblhcIiB8IEludF9DWCAtPiBcIiUjblhcIlxuICB8IEludF9vIC0+IFwiJW5vXCIgfCBJbnRfQ28gLT4gXCIlI25vXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVudVwiXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfZmxvYXQgZmlyc3QgYXJndW1lbnQgZnJvbSBhIGZsb2F0X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMgPVxuICAgIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgICBsZXQgc3ltYiA9IGNoYXJfb2ZfZmNvbnYgfmNGOidnJyBmY29udiBpblxuICAgIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBwcmVjKTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmIHN5bWI7XG4gICAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG5sZXQgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgcyA9XG4gIG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICBsZXQgZGlnaXRzID1cbiAgICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgIHwgJzAnLi4nOScgLT4gaW5jciBuXG4gICAgICAgIHwgXyAtPiAoKVxuICAgICAgZG9uZTtcbiAgICAgICFuXG4gICAgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAoZGlnaXRzIC0gMSkgLyAzKSBpblxuICAgIGxldCBwb3MgPSByZWYgMCBpblxuICAgIGxldCBwdXQgYyA9IEJ5dGVzLnNldCBidWYgIXBvcyBjOyBpbmNyIHBvcyBpblxuICAgIGxldCBsZWZ0ID0gcmVmICgoZGlnaXRzIC0gMSkgbW9kIDMgKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAnMCcuLic5JyBhcyBjIC0+XG4gICAgICAgICAgaWYgIWxlZnQgPSAwIHRoZW4gKHB1dCAnXyc7IGxlZnQgOj0gMyk7IGRlY3IgbGVmdDsgcHV0IGNcbiAgICAgIHwgYyAtPiBwdXQgY1xuICAgIGRvbmU7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgfCBfIC0+IHNcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGNvbnZlcnNpb24uICopXG5sZXQgY29udmVydF9pbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50IChmb3JtYXRfb2ZfaWNvbnYgaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQzMiBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQzMiAoZm9ybWF0X29mX2ljb252bCBpY29udikgbilcbmxldCBjb252ZXJ0X25hdGl2ZWludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9uYXRpdmVpbnQgKGZvcm1hdF9vZl9pY29udm4gaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQ2NCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQ2NCAoZm9ybWF0X29mX2ljb252TCBpY29udikgbilcblxuKCogQ29udmVydCBhIGZsb2F0IHRvIHN0cmluZy4gKilcbigqIEZpeCBzcGVjaWFsIGNhc2Ugb2YgXCJPQ2FtbCBmbG9hdCBmb3JtYXRcIi4gKilcbmxldCBjb252ZXJ0X2Zsb2F0IGZjb252IHByZWMgeCA9XG4gIGxldCBoZXggKCkgPVxuICAgIGxldCBzaWduID1cbiAgICAgIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gICAgICB8IEZsb2F0X2ZsYWdfcCAtPiAnKydcbiAgICAgIHwgRmxvYXRfZmxhZ19zIC0+ICcgJ1xuICAgICAgfCBfIC0+ICctJyBpblxuICAgIGhleHN0cmluZ19vZl9mbG9hdCB4IHByZWMgc2lnbiBpblxuICBsZXQgYWRkX2RvdF9pZl9uZWVkZWQgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGlzX3ZhbGlkIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ2UnIHwgJ0UnIC0+IHRydWVcbiAgICAgICAgfCBfIC0+IGlzX3ZhbGlkIChpICsgMSkgaW5cbiAgICBpZiBpc192YWxpZCAwIHRoZW4gc3RyIGVsc2Ugc3RyIF4gXCIuXCIgaW5cbiAgbGV0IGNhbWxfc3BlY2lhbF92YWwgc3RyID0gbWF0Y2ggY2xhc3NpZnlfZmxvYXQgeCB3aXRoXG4gICAgfCBGUF9ub3JtYWwgfCBGUF9zdWJub3JtYWwgfCBGUF96ZXJvIC0+IHN0clxuICAgIHwgRlBfaW5maW5pdGUgLT4gaWYgeCA8IDAuMCB0aGVuIFwibmVnX2luZmluaXR5XCIgZWxzZSBcImluZmluaXR5XCJcbiAgICB8IEZQX25hbiAtPiBcIm5hblwiIGluXG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfaCAtPiBoZXggKClcbiAgfCBGbG9hdF9IIC0+IFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGhleCAoKSlcbiAgfCBGbG9hdF9DRiAtPiBjYW1sX3NwZWNpYWxfdmFsIChoZXggKCkpXG4gIHwgRmxvYXRfRiAtPlxuICAgIGxldCBzdHIgPSBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4IGluXG4gICAgY2FtbF9zcGVjaWFsX3ZhbCAoYWRkX2RvdF9pZl9uZWVkZWQgc3RyKVxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIC0+XG4gICAgZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeFxuXG4oKiBDb252ZXJ0IGEgY2hhciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBmb3JtYXRfY2FtbF9jaGFyIGMgPVxuICBsZXQgc3RyID0gQ2hhci5lc2NhcGVkIGMgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXCcnIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHR5cGUgdG8gc3RyaW5nICopXG5sZXQgc3RyaW5nX29mX2ZtdHR5IGZtdHR5ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBwcmludGluZyBmdW5jdGlvbiAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBwcmludGluZyBmdW5jdGlvbi4gKilcbigqIFVzZWQgdG8gZ2VuZXJhdGUgUHJpbnRmIGFuZCBGb3JtYXQgcHJpbnRpbmcgZnVuY3Rpb25zLiAqKVxuKCogUGFyYW1ldGVyczpcbiAgICAgazogYSBjb250aW51YXRpb24gZmluYWxseSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gICAgIG86IHRoZSBvdXRwdXQgc3RyZWFtIChzZWUgaywgJWEgYW5kICV0KS5cbiAgICAgYWNjOiByZXYgbGlzdCBvZiBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzaCwgZm9ybWF0dGluZywgLi4uKS5cbiAgICAgZm10OiB0aGUgZm9ybWF0LiAqKVxubGV0IHJlYyBtYWtlX3ByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2NhbWxfY2hhciBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgKGZ1biBzdHIgLT4gc3RyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ190b19jYW1sX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50IGljb252XG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDMyIGljb252XG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9uYXRpdmVpbnQgaWNvbnZcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50NjQgaWNvbnZcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgZmNvbnZcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ19vZl9ib29sXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIGZ1biBmIHggLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGZ1biBvIC0+IGYgbyB4KSkgcmVzdFxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBmdW4gZiAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgKCkpXG4gIHwgUmVhZGVyIF8gLT5cbiAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICopXG4gICAgKCogSW5kZWVkLCBzaW5jZSBwcmludGYgYW5kIGNvLiB0YWtlIGEgZm9ybWF0NCBhcyBhcmd1bWVudCwgdGhlICdkIGFuZCAnZVxuICAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiBmbXQgYXJlIG9idmlvdXNseSBlcXVhbHMuIFRoZSBSZWFkZXIgaXMgdGhlXG4gICAgICAgb25seSBjb25zdHJ1Y3RvciB3aGljaCB0b3VjaCAnZCBhbmQgJ2UgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXRcbiAgICAgICB0eXBlLCBpdCBhZGRzIGFuICgtPikgdG8gdGhlICdkIHBhcmFtZXRlcnMuIENvbnNlcXVlbnRseSwgYSBmb3JtYXQ0XG4gICAgICAgY2Fubm90IGNvbnRhaW4gYSBSZWFkZXIgbm9kZSwgZXhjZXB0IGluIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG9cbiAgICAgICBhbiAley4uLiV9LiBJdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBtYWtlX3ByaW50ZiBkbyBub3QgY2FsbFxuICAgICAgIGl0c2VsZiByZWN1cnNpdmVseSBvbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvICV7Li4uJX0uICopXG4gICAgYXNzZXJ0IGZhbHNlXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mbHVzaCBhY2MpIHJlc3RcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX3N0cmluZ19saXRlcmFsIChhY2MsIHN0cikpIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfY2hhcl9saXRlcmFsIChhY2MsIGNocikpIHJlc3RcblxuICB8IEZvcm1hdF9hcmcgKF8sIHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSBzdHJpbmdfb2ZfZm10dHkgc3ViX2ZtdHR5IGluXG4gICAgKGZ1biBzdHIgLT5cbiAgICAgIGlnbm9yZSBzdHI7XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHkpKSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+IG1ha2VfcHJpbnRmIGsgYWNjXG4gICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgbGV0IG5ld19hY2MgPSBBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVbXCIpIGluXG4gICAgZnVuIF8gLT4gbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICgqIFRoaXMgY2FzZSBzaG91bGQgYmUgcmVmdXNlZCBmb3IgUHJpbnRmLiAqKVxuICAgICgqIEFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqKVxuICAgICgqIEludGVycHJldCAlbCwgJW4gYW5kICVMIGFzICV1LiAqKVxuICAgIGZ1biBuIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfaW50IFwiJXVcIiBuKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbWFrZV9pZ25vcmVkX3BhcmFtIGsgYWNjIGlnbiByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19saXQgKGFjYywgZm10aW5nX2xpdCkpIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl90YWcga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl9ib3gga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBrIGFjY1xuXG4oKiBEZWxheSB0aGUgZXJyb3IgKEludmFsaWRfYXJndW1lbnQgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpLiAqKVxuKCogR2VuZXJhdGUgZnVuY3Rpb25zIHRvIHRha2UgcmVtYWluaW5nIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIFwiJV9cIikuICopXG5hbmQgbWFrZV9pZ25vcmVkX3BhcmFtIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgZm10dHkgZm10XG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcblxuXG4oKiBTcGVjaWFsIGNhc2Ugb2YgcHJpbnRmIFwiJV8oXCIuICopXG5hbmQgbWFrZV9mcm9tX2ZtdHR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgZm10dHkgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBSZWFkZXJfdHkgXyAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogSW5zZXJ0IGFuIEFjY19pbnZhbGlkX2FyZyBpbiB0aGUgYWNjdW11bGF0b3IgYW5kIGNvbnRpbnVlIHRvIGdlbmVyYXRlXG4gICBjbG9zdXJlcyB0byBnZXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG5hbmQgbWFrZV9pbnZhbGlkX2FyZyA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPlxuICBtYWtlX3ByaW50ZiBrIChBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpKSBmbXRcblxuKCogRml4IHBhZGRpbmcsIHRha2UgaXQgYXMgYW4gZXh0cmEgaW50ZWdlciBhcmd1bWVudCBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9wYWRkaW5nIDogdHlwZSB4IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHogLT4gYSkgcGFkZGluZyAtPiAoeiAtPiBzdHJpbmcpIC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCB0cmFucyAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHJhbnMgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcblxuKCogRml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBmb3IgaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0LiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IChpbnRfY29udiAtPiB6IC0+IHN0cmluZykgLT5cbiAgICBpbnRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyB0cmFucyBpY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gdHJhbnMgaWNvbnYgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuXG4oKiBDb252ZXJ0IGEgZmxvYXQsIGZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gaWYgbmVlZGVkLiAqKVxuKCogVGFrZSB0aGUgZmxvYXQgYXJndW1lbnQgYW5kIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgZmxvYXQgLT4gYSkgcHJlY2lzaW9uIC0+IGZsb2F0X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgZmNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbmFuZCBtYWtlX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geCAtPiB5ID1cbiAgZnVuIGsgYWNjIHJlc3QgYXJpdHkgZiAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiB4KVxuXG5sZXQgY29uc3QgeCBfID0geFxuXG5sZXQgcmVjIG1ha2VfaXByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuICBmdW4gayBvIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBDYW1sX3N0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBCb29sIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyByZXN0IGFyaXR5XG4gICAgfCBSZWFkZXIgXyAtPlxuICAgICAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICBTZWUgdGhlXG4gICAgICAgICAgIG5vdGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FzZSBmb3IgbWFrZV9wcmludGYuICopXG4gICAgICAgIGFzc2VydCBmYWxzZVxuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+XG4gICAgICAgICAgbWFrZV9pcHJpbnRmIGsgb1xuICAgICAgICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG4gICAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pZ25vcmVkX3BhcmFtIChmdW4gXyAtPiBrIG8pIChFbmRfb2ZfYWNjKSBpZ24gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgICAgIGsgb1xuYW5kIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIDpcbiAgdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IHggPVxuICBmdW4gayBvIGZtdCBwYWQgcHJlYyAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICwgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpKVxuYW5kIGZuX29mX2N1c3RvbV9hcml0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT5cbiAgc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHkgPVxuICBmdW4gayBvIGZtdCAtPiBmdW5jdGlvblxuICAgIHwgQ3VzdG9tX3plcm8gLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyBmbXRcbiAgICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgICAgIGNvbnN0IChmbl9vZl9jdXN0b21fYXJpdHkgayBvIGZtdCBhcml0eSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29udGludWF0aW9ucyBmb3IgbWFrZV9wcmludGYgKilcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBvIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQHtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQFtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X2NoYXIgbyBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmIG9cbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGZsdXNoIG9cbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBvIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIGJ1ZnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBmIGJcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IGJ1ZnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBidWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiAlYSBhbmQgJXQuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiAoZiAoKSlcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEVycm9yIG1hbmFnZW1lbnQgKilcblxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBwcmV0dHktcHJpbnRlZCBlcnJvciBtZXNzYWdlLiAqKVxubGV0IGZhaWx3aXRoX21lc3NhZ2UgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyNTYgaW5cbiAgbGV0IGsgYWNjID0gc3RycHV0X2FjYyBidWYgYWNjOyBmYWlsd2l0aCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdHRpbmcgdG9vbHMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhbiBvcGVuIGJsb2NrIGRlc2NyaXB0aW9uIChpbmRlbnQsIGJsb2NrX3R5cGUpICopXG5sZXQgb3Blbl9ib3hfb2Zfc3RyaW5nIHN0ciA9XG4gIGlmIHN0ciA9IFwiXCIgdGhlbiAoMCwgUHBfYm94KSBlbHNlXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IGludmFsaWRfYm94ICgpID0gZmFpbHdpdGhfbWVzc2FnZSBcImludmFsaWQgYm94IGRlc2NyaXB0aW9uICVTXCIgc3RyIGluXG4gICAgbGV0IHJlYyBwYXJzZV9zcGFjZXMgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gaSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIC0+IHBhcnNlX3NwYWNlcyAoaSArIDEpXG4gICAgICAgIHwgXyAtPiBpXG4gICAgYW5kIHBhcnNlX2x3b3JkIGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICdhJyAuLiAneicgLT4gcGFyc2VfbHdvcmQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqXG4gICAgYW5kIHBhcnNlX2ludCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IHBhcnNlX2ludCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGogaW5cbiAgICBsZXQgd3N0YXJ0ID0gcGFyc2Vfc3BhY2VzIDAgaW5cbiAgICBsZXQgd2VuZCA9IHBhcnNlX2x3b3JkIHdzdGFydCB3c3RhcnQgaW5cbiAgICBsZXQgYm94X25hbWUgPSBTdHJpbmcuc3ViIHN0ciB3c3RhcnQgKHdlbmQgLSB3c3RhcnQpIGluXG4gICAgbGV0IG5zdGFydCA9IHBhcnNlX3NwYWNlcyB3ZW5kIGluXG4gICAgbGV0IG5lbmQgPSBwYXJzZV9pbnQgbnN0YXJ0IG5zdGFydCBpblxuICAgIGxldCBpbmRlbnQgPVxuICAgICAgaWYgbnN0YXJ0ID0gbmVuZCB0aGVuIDAgZWxzZVxuICAgICAgICB0cnkgaW50X29mX3N0cmluZyAoU3RyaW5nLnN1YiBzdHIgbnN0YXJ0IChuZW5kIC0gbnN0YXJ0KSlcbiAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICBsZXQgZXhwX2VuZCA9IHBhcnNlX3NwYWNlcyBuZW5kIGluXG4gICAgaWYgZXhwX2VuZCA8PiBsZW4gdGhlbiBpbnZhbGlkX2JveCAoKTtcbiAgICBsZXQgYm94X3R5cGUgPSBtYXRjaCBib3hfbmFtZSB3aXRoXG4gICAgICB8IFwiXCIgfCBcImJcIiAtPiBQcF9ib3hcbiAgICAgIHwgXCJoXCIgICAgICAtPiBQcF9oYm94XG4gICAgICB8IFwidlwiICAgICAgLT4gUHBfdmJveFxuICAgICAgfCBcImh2XCIgICAgIC0+IFBwX2h2Ym94XG4gICAgICB8IFwiaG92XCIgICAgLT4gUHBfaG92Ym94XG4gICAgICB8IF8gICAgICAgIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgKGluZGVudCwgYm94X3R5cGUpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUGFyc2luZyB0b29scyAqKVxuXG4oKiBDcmVhdGUgYSBwYWRkaW5nX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcgYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZGRpbmdfZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcGFkZGluZ19mbXRfZWJiID1cbmZ1biBwYWQgZm10IC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoTm9fcGFkZGluZywgZm10KVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRkaW5nX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgZm10KVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIGZtdClcblxuKCogQ3JlYXRlIGEgcHJlY2lzaW9uX2ZtdF9lYmIgZnJvbSBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wcmVjaXNpb25fZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcHJlY2lzaW9uIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwcmVjaXNpb25fZm10X2ViYiA9XG5mdW4gcHJlYyBmbXQgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uICAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChOb19wcmVjaXNpb24sIGZtdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKExpdF9wcmVjaXNpb24gcCwgZm10KVxuICB8IEFyZ19wcmVjaXNpb24gICAtPiBQcmVjaXNpb25fZm10X0VCQiAoQXJnX3ByZWNpc2lvbiwgZm10KVxuXG4oKiBDcmVhdGUgYSBwYWRwcmVjX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgYW5kIHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnRzXG4gICBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkcHJlY19mbXRfZWJiIDogdHlwZSB4IHkgeiB0IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+XG4gICAgKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgIChfLCBfLCBfLCBfLCBfKSBwYWRwcmVjX2ZtdF9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdCAtPlxuICBsZXQgUHJlY2lzaW9uX2ZtdF9FQkIgKHByZWMsIGZtdCcpID0gbWFrZV9wcmVjaXNpb25fZm10X2ViYiBwcmVjIGZtdCBpblxuICBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIHByZWMsIGZtdCcpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZHByZWNfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBwcmVjLCBmbXQnKVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIHByZWMsIGZtdCcpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwYXJzaW5nICopXG5cbigqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGZvcm1hdCBhbmQgY3JlYXRlIGEgZm10X2ViYi4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSBpbiBjYXNlIG9mIGludmFsaWQgZm9ybWF0LiAqKVxubGV0IGZtdF9lYmJfb2Zfc3RyaW5nID9sZWdhY3lfYmVoYXZpb3Igc3RyID1cbiAgKCogUGFyYW1ldGVycyBuYW1pbmcgY29udmVudGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gbGl0X3N0YXJ0OiBzdGFydCBvZiB0aGUgbGl0ZXJhbCBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzdHJfaW5kOiBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGVuZF9pbmQ6IGVuZCBvZiB0aGUgY3VycmVudCAoc3ViLSlmb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcGN0X2luZDogaW5kZXggb2YgdGhlICclJyBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICopXG4gICgqICAgLSB6ZXJvOiAgaXMgdGhlICcwJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIG1pbnVzOiBpcyB0aGUgJy0nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGx1czogIGlzIHRoZSAnKycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBoYXNoOiAgaXMgdGhlICcjJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHNwYWNlOiBpcyB0aGUgJyAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaWduOiAgIGlzIHRoZSAnXycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwYWQ6IHBhZGRpbmcgb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHByZWM6IHByZWNpc2lvbiBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3ltYjogY2hhciByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24gKCdjJywgJ3MnLCAnZCcsIC4uLikuICopXG4gICgqICAgLSBjaGFyX3NldDogc2V0IG9mIGNoYXJhY3RlcnMgYXMgYml0bWFwIChzZWUgc2NhbmYgJVsuLi5dKS4gICAgKilcblxuICBsZXQgbGVnYWN5X2JlaGF2aW9yID0gbWF0Y2ggbGVnYWN5X2JlaGF2aW9yIHdpdGhcbiAgICB8IFNvbWUgZmxhZyAtPiBmbGFnXG4gICAgfCBOb25lIC0+IHRydWVcbiAgKCogIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSBmb3JtYXQgcGFyc2VyIHRyaWVzIHRvIGJlaGF2ZSBhc1xuICAgICAgdGhlIDw0LjAyIGltcGxlbWVudGF0aW9ucywgaW4gcGFydGljdWxhciBpdCBpZ25vcmVzIG1vc3QgYmVuaW5lXG4gICAgICBub25zZW5zaWNhbCBmb3JtYXQuIFdoZW4gdGhlIGZsYWcgaXMgZGlzYWJsZWQsIGl0IHdpbGwgcmVqZWN0IGFueVxuICAgICAgZm9ybWF0IHRoYXQgaXMgbm90IGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLlxuXG4gICAgICBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSBcIiUrIGRcIjogc3BlY2lmeWluZyBib3RoICcrJyAoaWYgdGhlXG4gICAgICBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoIGEgJysnIHRvIGdldCB0aGUgc2FtZSB3aWR0aCBhc1xuICAgICAgbmVnYXRpdmUgbnVtYmVycykgYW5kICcgJyAoaWYgdGhlIG51bWJlciBpcyBwb3NpdGl2ZSwgcGFkIHdpdGhcbiAgICAgIGEgc3BhY2UpIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGJ1dCB0aGUgbGVnYWN5ICg8IDQuMDIpXG4gICAgICBpbXBsZW1lbnRhdGlvbiB3YXMgaGFwcHkgdG8ganVzdCBpZ25vcmUgdGhlIHNwYWNlLlxuICAqKVxuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZS4gKilcbiAgbGV0IGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZCBtc2cgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIG1zZ1xuICBpblxuXG4gICgqIFVzZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgKG9yIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXQpIHdhcyBlbmNvdW50ZXJlZFxuICAgICAgdW5leHBlY3RlZGx5LiAqKVxuICBsZXQgdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2UgZW5kX2luZFxuICAgICAgXCJ1bmV4cGVjdGVkIGVuZCBvZiBmb3JtYXRcIlxuICBpblxuXG4gICgqIFVzZWQgZm9yICUwYzogbm8gb3RoZXIgd2lkdGhzIGFyZSBpbXBsZW1lbnRlZCAqKVxuICBsZXQgaW52YWxpZF9ub25udWxsX2NoYXJfd2lkdGggc3RyX2luZCA9XG4gICAgaW52YWxpZF9mb3JtYXRfbWVzc2FnZSBzdHJfaW5kXG4gICAgICBcIm5vbi16ZXJvIHdpZHRocyBhcmUgdW5zdXBwb3J0ZWQgZm9yICVjIGNvbnZlcnNpb25zXCJcbiAgaW5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGFuIG9wdGlvbiBkZXBlbmRlbmN5XG4gICAgIHByb2JsZW0uICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IHN0cl9pbmQgYyBzID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAnJWMnIHdpdGhvdXQgJXNcIlxuICAgICAgc3RyIHN0cl9pbmQgYyBzXG4gIGluXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGFuIHVuZXhwZWN0ZWRcbiAgICAgY2hhcmFjdGVyLiAqKVxuICBsZXQgZXhwZWN0ZWRfY2hhcmFjdGVyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZCA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlcyBleHBlY3RlZCwgcmVhZCAlQ1wiXG4gICAgICBzdHIgc3RyX2luZCBleHBlY3RlZCByZWFkXG4gIGluXG5cbiAgKCogUGFyc2UgdGhlIHN0cmluZyBmcm9tIGJlZ19pbmQgKGluY2x1ZGVkKSB0byBlbmRfaW5kIChleGNsdWRlZCkuICopXG4gIGxldCByZWMgcGFyc2UgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gYmVnX2luZCBlbmRfaW5kIC0+IHBhcnNlX2xpdGVyYWwgYmVnX2luZCBiZWdfaW5kIGVuZF9pbmRcblxuICAoKiBSZWFkIGxpdGVyYWwgY2hhcmFjdGVycyB1cCB0byAnJScgb3IgJ0AnIHNwZWNpYWwgY2hhcmFjdGVycy4gKilcbiAgYW5kIHBhcnNlX2xpdGVyYWwgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGxpdF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIEVuZF9vZl9mb3JtYXQgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2Zvcm1hdCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgYWRkX2xpdGVyYWwgbGl0X3N0YXJ0IHN0cl9pbmQgZm10X3Jlc3RcbiAgICAgIHwgJ0AnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2VfYWZ0ZXJfYXQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8IF8gLT5cbiAgICAgICAgcGFyc2VfbGl0ZXJhbCBsaXRfc3RhcnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG5cbiAgKCogUGFyc2UgYSBmb3JtYXQgYWZ0ZXIgJyUnICopXG4gIGFuZCBwYXJzZV9mb3JtYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBlbmRfaW5kIC0+IHBhcnNlX2lnbiBwY3RfaW5kIChwY3RfaW5kICsgMSkgZW5kX2luZFxuXG4gIGFuZCBwYXJzZV9pZ24gOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ18nIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgKHN0cl9pbmQrMSkgZW5kX2luZCB0cnVlXG4gICAgICB8IF8gLT4gcGFyc2VfZmxhZ3MgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgZmFsc2VcblxuICBhbmQgcGFyc2VfZmxhZ3MgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmJcbiAgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgaWduIC0+XG4gICAgbGV0IHplcm8gPSByZWYgZmFsc2UgYW5kIG1pbnVzID0gcmVmIGZhbHNlXG4gICAgYW5kIHBsdXMgPSByZWYgZmFsc2UgYW5kIHNwYWNlID0gcmVmIGZhbHNlXG4gICAgYW5kIGhhc2ggPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgc2V0X2ZsYWcgc3RyX2luZCBmbGFnID1cbiAgICAgICgqIGluIGxlZ2FjeSBtb2RlLCBkdXBsaWNhdGUgZmxhZ3MgYXJlIGFjY2VwdGVkICopXG4gICAgICBpZiAhZmxhZyAmJiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIGR1cGxpY2F0ZSBmbGFnICVDXCJcbiAgICAgICAgICBzdHIgc3RyX2luZCBzdHIuW3N0cl9pbmRdO1xuICAgICAgZmxhZyA6PSB0cnVlO1xuICAgIGluXG4gICAgbGV0IHJlYyByZWFkX2ZsYWdzIHN0cl9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnMCcgLT4gc2V0X2ZsYWcgc3RyX2luZCB6ZXJvOyAgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICctJyAtPiBzZXRfZmxhZyBzdHJfaW5kIG1pbnVzOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJysnIC0+IHNldF9mbGFnIHN0cl9pbmQgcGx1czsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnIycgLT4gc2V0X2ZsYWcgc3RyX2luZCBoYXNoOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyAnIC0+IHNldF9mbGFnIHN0cl9pbmQgc3BhY2U7IHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmRcbiAgICAgICAgICAhemVybyAhbWludXMgIXBsdXMgIWhhc2ggIXNwYWNlIGlnblxuICAgICAgZW5kXG4gICAgaW5cbiAgICByZWFkX2ZsYWdzIHN0cl9pbmRcblxuICAoKiBUcnkgdG8gcmVhZCBhIGRpZ2l0YWwgb3IgYSAnKicgcGFkZGluZy4gKilcbiAgYW5kIHBhcnNlX3BhZGRpbmcgOiB0eXBlIGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCB6ZXJvIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYWR0eSA9IG1hdGNoIHplcm8sIG1pbnVzIHdpdGhcbiAgICAgIHwgZmFsc2UsIGZhbHNlIC0+IFJpZ2h0XG4gICAgICB8IGZhbHNlLCB0cnVlICAtPiBMZWZ0XG4gICAgICB8ICB0cnVlLCBmYWxzZSAtPiBaZXJvc1xuICAgICAgfCAgdHJ1ZSwgdHJ1ZSAgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gTGVmdFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnLScgXCIwXCIgaW5cbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgIGxldCBuZXdfaW5kLCB3aWR0aCA9IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwIGluXG4gICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgKExpdF9wYWRkaW5nIChwYWR0eSwgd2lkdGgpKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZVxuICAgICAgICBpZ24gKEFyZ19wYWRkaW5nIHBhZHR5KVxuICAgIHwgXyAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcGFkdHkgd2l0aFxuICAgICAgfCBMZWZ0ICAtPlxuICAgICAgICBpZiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IChzdHJfaW5kIC0gMSkgJy0nIFwicGFkZGluZ1wiO1xuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBOb19wYWRkaW5nXG4gICAgICB8IFplcm9zIC0+XG4gICAgICAgICAoKiBhICcwJyBwYWRkaW5nIGluZGljYXRpb24gbm90IGZvbGxvd2VkIGJ5IGFueXRoaW5nIHNob3VsZFxuICAgICAgICAgICBiZSBpbnRlcnByZXRlZCBhcyBhIFJpZ2h0IHBhZGRpbmcgb2Ygd2lkdGggMC4gVGhpcyBpcyB1c2VkXG4gICAgICAgICAgIGJ5IHNjYW5uaW5nIGNvbnZlcnNpb25zICUwcyBhbmQgJTBjICopXG4gICAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIChMaXRfcGFkZGluZyAoUmlnaHQsIDApKVxuICAgICAgfCBSaWdodCAtPlxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBOb19wYWRkaW5nXG4gICAgICBlbmRcblxuICAoKiBJcyBwcmVjaXNpb24gZGVmaW5lZD8gKilcbiAgYW5kIHBhcnNlX2FmdGVyX3BhZGRpbmcgOiB0eXBlIHggZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgXykgcGFkZGluZyAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnLicgLT5cbiAgICAgIHBhcnNlX3ByZWNpc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIHBhZFxuICAgIHwgc3ltYiAtPlxuICAgICAgcGFyc2VfY29udmVyc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZFxuICAgICAgICBOb19wcmVjaXNpb24gcGFkIHN5bWJcblxuICAoKiBSZWFkIHRoZSBkaWdpdGFsIG9yICcqJyBwcmVjaXNpb24uICopXG4gIGFuZCBwYXJzZV9wcmVjaXNpb24gOiB0eXBlIHggZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgXykgcGFkZGluZyAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbGV0IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZCA9XG4gICAgICBsZXQgbmV3X2luZCwgcHJlYyA9IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwIGluXG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCBuZXdfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gcHJlYykgaW5cbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT4gcGFyc2VfbGl0ZXJhbCBtaW51cyBzdHJfaW5kXG4gICAgfCAoJysnIHwgJy0nKSBhcyBzeW1iIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+XG4gICAgICAoKiBMZWdhY3kgbW9kZSB3b3VsZCBhY2NlcHQgYW5kIGlnbm9yZSAnKycgb3IgJy0nIGJlZm9yZSB0aGVcbiAgICAgICAgIGludGVnZXIgZGVzY3JpYmluZyB0aGUgZGVzaXJlZCBwcmVjaXNpb247IG5vdGUgdGhhdCB0aGlzXG4gICAgICAgICBjYW5ub3QgaGFwcGVuIGZvciBwYWRkaW5nIHdpZHRoLCBhcyAnKycgYW5kICctJyBhbHJlYWR5IGhhdmVcbiAgICAgICAgIGEgc2VtYW50aWNzIHRoZXJlLlxuXG4gICAgICAgICBUaGF0IHNhaWQsIHRoZSBpZGVhIChzdXBwb3J0ZWQgYnkgdGhpcyB0d2VhaykgdGhhdCB3aWR0aCBhbmRcbiAgICAgICAgIHByZWNpc2lvbiBsaXRlcmFscyBhcmUgXCJpbnRlZ2VyIGxpdGVyYWxzXCIgaW4gdGhlIE9DYW1sIHNlbnNlIGlzXG4gICAgICAgICBzdGlsbCBibGF0YW50bHkgd3JvbmcsIGFzIDEyM180NTYgb3IgMHhGRiBhcmUgcmVqZWN0ZWQuICopXG4gICAgICBwYXJzZV9saXRlcmFsIChtaW51cyB8fCBzeW1iID0gJy0nKSAoc3RyX2luZCArIDEpXG4gICAgfCAnKicgLT5cbiAgICAgIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIHBhZCBBcmdfcHJlY2lzaW9uXG4gICAgfCBfIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICAoKiBub3RlIHRoYXQgbGVnYWN5IGltcGxlbWVudGF0aW9uIGRpZCBub3QgaWdub3JlICcuJyB3aXRob3V0XG4gICAgICAgICAgIGEgbnVtYmVyIChhcyBpdCBkb2VzIGZvciBwYWRkaW5nIGluZGljYXRpb25zKSwgYnV0XG4gICAgICAgICAgIGludGVycHJldHMgaXQgYXMgJy4wJyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIHBhZCAoTGl0X3ByZWNpc2lvbiAwKVxuICAgICAgZWxzZVxuICAgICAgICBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IChzdHJfaW5kIC0gMSkgJy4nIFwicHJlY2lzaW9uXCJcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogdCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+XG4gICAgICAgICh4LCB5KSBwYWRkaW5nIC0+ICh6LCB0KSBwcmVjaXNpb24gLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgcHJlYyAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbGV0IHBhcnNlX2NvbnYgKHR5cGUgdSkgKHR5cGUgdikgKHBhZHByZWMgOiAodSwgdikgcGFkZGluZykgPVxuICAgICAgcGFyc2VfY29udmVyc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZFxuICAgICAgICBwcmVjIHBhZHByZWMgc3RyLltzdHJfaW5kXSBpblxuICAgICgqIGluIGxlZ2FjeSBtb2RlLCBzb21lIGZvcm1hdHMgKCVzIGFuZCAlUykgYWNjZXB0IGEgd2VpcmQgbWl4IG9mXG4gICAgICAgcGFkZGluZyBhbmQgcHJlY2lzaW9uLCB3aGljaCBpcyBtZXJnZWQgYXMgYSBzaW5nbGUgcGFkZGluZ1xuICAgICAgIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgaW4gJS4xMHMgdGhlIHByZWNpc2lvbiBpcyBpbXBsaWNpdGx5XG4gICAgICAgdW5kZXJzdG9vZCBhcyBwYWRkaW5nICUxMHMsIGJ1dCB0aGUgbGVmdC1wYWRkaW5nIGNvbXBvbmVudCBtYXlcbiAgICAgICBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgbGVmdCBwYWRkaW5nIG9yIGEgbmVnYXRpdmUgcHJlY2lzaW9uOlxuICAgICAgICUtLjNzIGFuZCAlLi0zcyBhcmUgZXF1aXZhbGVudCB0byAlLTNzICopXG4gICAgbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgLT4gKFxuICAgICAgbWF0Y2ggbWludXMsIHByZWMgd2l0aFxuICAgICAgICB8IF8sIE5vX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IE5vX3BhZGRpbmdcbiAgICAgICAgfCBmYWxzZSwgTGl0X3ByZWNpc2lvbiBuIC0+IHBhcnNlX2NvbnYgKExpdF9wYWRkaW5nIChSaWdodCwgbikpXG4gICAgICAgIHwgdHJ1ZSwgTGl0X3ByZWNpc2lvbiBuIC0+IHBhcnNlX2NvbnYgKExpdF9wYWRkaW5nIChMZWZ0LCBuKSlcbiAgICAgICAgfCBmYWxzZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBSaWdodClcbiAgICAgICAgfCB0cnVlLCBBcmdfcHJlY2lzaW9uIC0+IHBhcnNlX2NvbnYgKEFyZ19wYWRkaW5nIExlZnQpXG4gICAgKVxuICAgIHwgcGFkIC0+IHBhcnNlX2NvbnYgcGFkXG5cbiAgKCogQ2FzZSBhbmFseXNpcyBvbiBjb252ZXJzaW9uLiAqKVxuICBhbmQgcGFyc2VfY29udmVyc2lvbiA6IHR5cGUgeCB5IHogdCB1IHYgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gKHgsIHkpIHBhZGRpbmcgLT5cbiAgICAgICAgKHosIHQpIHByZWNpc2lvbiAtPiAodSwgdikgcGFkZGluZyAtPiBjaGFyIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgcGFkcHJlYyBzeW1iIC0+XG4gICAgKCogRmxhZ3MgdXNlZCB0byBjaGVjayBvcHRpb24gdXNhZ2VzL2NvbXBhdGliaWxpdGllcy4gKilcbiAgICBsZXQgcGx1c191c2VkICA9IHJlZiBmYWxzZSBhbmQgaGFzaF91c2VkID0gcmVmIGZhbHNlXG4gICAgYW5kIHNwYWNlX3VzZWQgPSByZWYgZmFsc2UgYW5kIGlnbl91c2VkICAgPSByZWYgZmFsc2VcbiAgICBhbmQgcGFkX3VzZWQgICA9IHJlZiBmYWxzZSBhbmQgcHJlY191c2VkICA9IHJlZiBmYWxzZSBpblxuXG4gICAgKCogQWNjZXNzIHRvIG9wdGlvbnMsIHVwZGF0ZSBmbGFncy4gKilcbiAgICBsZXQgZ2V0X3BsdXMgICAgKCkgPSBwbHVzX3VzZWQgIDo9IHRydWU7IHBsdXNcbiAgICBhbmQgZ2V0X2hhc2ggICAoKSA9IGhhc2hfdXNlZCA6PSB0cnVlOyBoYXNoXG4gICAgYW5kIGdldF9zcGFjZSAgICgpID0gc3BhY2VfdXNlZCA6PSB0cnVlOyBzcGFjZVxuICAgIGFuZCBnZXRfaWduICAgICAoKSA9IGlnbl91c2VkICAgOj0gdHJ1ZTsgaWduXG4gICAgYW5kIGdldF9wYWQgICAgICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRcbiAgICBhbmQgZ2V0X3ByZWMgICAgKCkgPSBwcmVjX3VzZWQgIDo9IHRydWU7IHByZWNcbiAgICBhbmQgZ2V0X3BhZHByZWMgKCkgPSBwYWRfdXNlZCAgIDo9IHRydWU7IHBhZHByZWMgaW5cblxuICAgIGxldCBnZXRfaW50X3BhZCAoKSA6ICh4LHkpIHBhZGRpbmcgPVxuICAgICAgKCogJTUuM2QgaXMgYWNjZXB0ZWQgYW5kIG1lYW5pbmdmdWw6IHBhZCB0byBsZW5ndGggNSB3aXRoXG4gICAgICAgICBzcGFjZXMsIGJ1dCBmaXJzdCBwYWQgd2l0aCB6ZXJvcyB1cHRvIGxlbmd0aCAzICgwLXBhZGRpbmdcbiAgICAgICAgIGlzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBcInByZWNpc2lvblwiIGZvciBpbnRlZ2VyIGZvcm1hdHMpLlxuXG4gICAgICAgICAlMDUuM2QgaXMgcmVkdW5kYW50OiBwYWQgdG8gbGVuZ3RoIDUgKndpdGggemVyb3MqLCBidXRcbiAgICAgICAgIGZpcnN0IHBhZCB3aXRoIHplcm9zLi4uIFRvIGFkZCBpbnN1bHQgdG8gdGhlIGluanVyeSwgdGhlXG4gICAgICAgICBsZWdhY3kgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgMC1wYWRkaW5nIGluZGljYXRpb24gYW5kXG4gICAgICAgICBkb2VzIHRoZSA1IHBhZGRpbmcgd2l0aCBzcGFjZXMgaW5zdGVhZC4gV2UgcmV1c2UgdGhpc1xuICAgICAgICAgaW50ZXJwcmV0YXRpb24gZm9yIGNvbXBhdGliaWxpdHksIGJ1dCBzdGF0aWNhbGx5IHJlamVjdCB0aGlzXG4gICAgICAgICBmb3JtYXQgd2hlbiB0aGUgbGVnYWN5IG1vZGUgaXMgZGlzYWJsZWQsIHRvIHByb3RlY3Qgc3RyaWN0XG4gICAgICAgICB1c2VycyBmcm9tIHRoaXMgY29ybmVyIGNhc2UuICopXG4gICAgICAgbWF0Y2ggZ2V0X3BhZCAoKSwgZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgICAgfCBwYWQsIE5vX3ByZWNpc2lvbiAtPiBwYWRcbiAgICAgICAgIHwgTm9fcGFkZGluZywgXyAgICAgLT4gTm9fcGFkZGluZ1xuICAgICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIG4pLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExpdF9wYWRkaW5nIChSaWdodCwgbilcbiAgICAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJzAnIFwicHJlY2lzaW9uXCJcbiAgICAgICAgIHwgQXJnX3BhZGRpbmcgWmVyb3MsIF8gLT5cbiAgICAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gQXJnX3BhZGRpbmcgUmlnaHRcbiAgICAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJzAnIFwicHJlY2lzaW9uXCJcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgXyBhcyBwYWQsIF8gLT4gcGFkXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZCBpblxuXG4gICAgKCogQ2hlY2sgdGhhdCBwYWR0eSA8PiBaZXJvcy4gKilcbiAgICBsZXQgY2hlY2tfbm9fMCBzeW1iICh0eXBlIGEgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA6IChhLGIpIHBhZGRpbmcgPVxuICAgICAgbWF0Y2ggcGFkIHdpdGhcbiAgICAgIHwgTm9fcGFkZGluZyAtPiBwYWRcbiAgICAgIHwgTGl0X3BhZGRpbmcgKChMZWZ0IHwgUmlnaHQpLCBfKSAtPiBwYWRcbiAgICAgIHwgQXJnX3BhZGRpbmcgKExlZnQgfCBSaWdodCkgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExpdF9wYWRkaW5nIChSaWdodCwgd2lkdGgpXG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgWmVyb3MgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gQXJnX3BhZGRpbmcgUmlnaHRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIjBcIlxuICAgIGluXG5cbiAgICAoKiBHZXQgcGFkZGluZyBhcyBhIHBhZF9vcHRpb24gKHNlZSBcIiVfXCIsIFwiJXtcIiwgXCIlKFwiIGFuZCBcIiVbXCIpLlxuICAgICAgIChubyBuZWVkIGZvciBsZWdhY3kgbW9kZSB0d2Vha2luZywgdGhvc2Ugd2VyZSByZWplY3RlZCBieSB0aGVcbiAgICAgICBsZWdhY3kgcGFyc2VyIGFzIHdlbGwpICopXG4gICAgbGV0IG9wdF9vZl9wYWQgYyAodHlwZSBhKSAodHlwZSBiKSAocGFkIDogKGEsIGIpIHBhZGRpbmcpID0gbWF0Y2ggcGFkIHdpdGhcbiAgICAgIHwgTm9fcGFkZGluZyAtPiBOb25lXG4gICAgICB8IExpdF9wYWRkaW5nIChSaWdodCwgd2lkdGgpIC0+IFNvbWUgd2lkdGhcbiAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJzAnXCJcbiAgICAgIHwgTGl0X3BhZGRpbmcgKExlZnQsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBTb21lIHdpZHRoXG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIGMgXCInLSdcIlxuICAgICAgfCBBcmdfcGFkZGluZyBfIC0+IGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJyonXCJcbiAgICBpblxuICAgIGxldCBnZXRfcGFkX29wdCBjID0gb3B0X29mX3BhZCBjIChnZXRfcGFkICgpKSBpblxuICAgIGxldCBnZXRfcGFkcHJlY19vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZHByZWMgKCkpIGluXG5cbiAgICAoKiBHZXQgcHJlY2lzaW9uIGFzIGEgcHJlY19vcHRpb24gKHNlZSBcIiVfZlwiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBnZXRfcHJlY19vcHQgKCkgPSBtYXRjaCBnZXRfcHJlYyAoKSB3aXRoXG4gICAgICB8IE5vX3ByZWNpc2lvbiAgICAgICAtPiBOb25lXG4gICAgICB8IExpdF9wcmVjaXNpb24gbmRlYyAtPiBTb21lIG5kZWNcbiAgICAgIHwgQXJnX3ByZWNpc2lvbiAgICAgIC0+IGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKidcIlxuICAgIGluXG5cbiAgICBsZXQgZm10X3Jlc3VsdCA9IG1hdGNoIHN5bWIgd2l0aFxuICAgIHwgJywnIC0+XG4gICAgICBwYXJzZSBzdHJfaW5kIGVuZF9pbmRcbiAgICB8ICdjJyAtPlxuICAgICAgbGV0IGNoYXJfZm9ybWF0IGZtdF9yZXN0ID0gKCogJWMgKilcbiAgICAgICAgaWYgZ2V0X2lnbiAoKVxuICAgICAgICB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKENoYXIgZm10X3Jlc3QpXG4gICAgICBpblxuICAgICAgbGV0IHNjYW5fZm9ybWF0IGZtdF9yZXN0ID0gKCogJTBjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3NjYW5fbmV4dF9jaGFyLCBmbXRfcmVzdCkpXG4gICAgICAgIGVsc2UgRm10X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10X3Jlc3QpXG4gICAgICBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGJlZ2luIG1hdGNoIGdldF9wYWRfb3B0ICdjJyB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBjaGFyX2Zvcm1hdCBmbXRfcmVzdFxuICAgICAgICB8IFNvbWUgMCAtPiBzY2FuX2Zvcm1hdCBmbXRfcmVzdFxuICAgICAgICB8IFNvbWUgX24gLT5cbiAgICAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvclxuICAgICAgICAgICB0aGVuIGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmRcbiAgICAgICAgICAgZWxzZSAoKiBsZWdhY3kgaWdub3JlcyAlYyB3aWR0aHMgKikgY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgIGVuZFxuICAgIHwgJ0MnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfY2FtbF9jaGFyLGZtdF9yZXN0KSlcbiAgICAgIGVsc2UgRm10X0VCQiAoQ2FtbF9jaGFyIGZtdF9yZXN0KVxuICAgIHwgJ3MnIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoU3RyaW5nIChwYWQnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ1MnIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2NhbWxfc3RyaW5nIChnZXRfcGFkcHJlY19vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRkaW5nX2ZtdF9FQkIgKHBhZCcsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkZGluZ19mbXRfZWJiIHBhZCBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChDYW1sX3N0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPlxuICAgICAgbGV0IGljb252ID0gY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgKGdldF9wbHVzICgpKSAoZ2V0X2hhc2ggKCkpXG4gICAgICAgIChnZXRfc3BhY2UgKCkpIHN5bWIgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ04nIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IGNvdW50ZXIgPSBUb2tlbl9jb3VudGVyIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgY291bnRlciBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdF9yZXN0KSlcbiAgICB8ICdsJyB8ICduJyB8ICdMJyB3aGVuIHN0cl9pbmQ9ZW5kX2luZCB8fCBub3QgKGlzX2ludF9iYXNlIHN0ci5bc3RyX2luZF0pIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IGNvdW50ZXIgPSBjb3VudGVyX29mX2NoYXIgc3ltYiBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAgIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludDMyIChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoSW50MzIgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICduJyAtPlxuICAgICAgbGV0IGljb252ID1cbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIChzdHJfaW5kICsgMSkgKGdldF9wbHVzICgpKVxuICAgICAgICAgIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3RyLltzdHJfaW5kXSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfbmF0aXZlaW50IChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoTmF0aXZlaW50IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnTCcgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAgIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludDY0IChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoSW50NjQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdmJyB8ICdlJyB8ICdFJyB8ICdnJyB8ICdHJyB8ICdGJyB8ICdoJyB8ICdIJyAtPlxuICAgICAgbGV0IGZjb252ID1cbiAgICAgICAgY29tcHV0ZV9mbG9hdF9jb252IHBjdF9pbmQgc3RyX2luZFxuICAgICAgICAgIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKSAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9mbG9hdCAoZ2V0X3BhZF9vcHQgJ18nLCBnZXRfcHJlY19vcHQgKCkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEZsb2F0IChmY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnYicgfCAnQicgLT5cbiAgICAgIGxldCBwYWQgPSBjaGVja19ub18wIHN5bWIgKGdldF9wYWRwcmVjICgpKSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfYm9vbCAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQm9vbCAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdhJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEFscGhhIGZtdF9yZXN0KVxuICAgIHwgJ3QnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoVGhldGEgZm10X3Jlc3QpXG4gICAgfCAncicgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9yZWFkZXIsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2UgRm10X0VCQiAoUmVhZGVyIGZtdF9yZXN0KVxuICAgIHwgJyEnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRmx1c2ggZm10X3Jlc3QpXG4gICAgfCAoJyUnIHwgJ0AnKSBhcyBjIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsIChjLCBmbXRfcmVzdCkpXG4gICAgfCAneycgLT5cbiAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgc3RyX2luZCBlbmRfaW5kICd9JyBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3ViX2VuZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgIGxldCBzdWJfZm10dHkgPSBmbXR0eV9vZl9mbXQgc3ViX2ZtdCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9mb3JtYXRfYXJnIChnZXRfcGFkX29wdCAnXycsIHN1Yl9mbXR0eSkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChGb3JtYXRfYXJnIChnZXRfcGFkX29wdCAneycsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJygnIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnKScgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCBzdWJfZW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnXycsIHN1Yl9mbXR0eSkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChGb3JtYXRfc3Vic3QgKGdldF9wYWRfb3B0ICcoJywgc3ViX2ZtdHR5LCBmbXRfcmVzdCkpXG4gICAgfCAnWycgLT5cbiAgICAgIGxldCBuZXh0X2luZCwgY2hhcl9zZXQgPSBwYXJzZV9jaGFyX3NldCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnXycsIGNoYXJfc2V0KSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKFNjYW5fY2hhcl9zZXQgKGdldF9wYWRfb3B0ICdbJywgY2hhcl9zZXQsIGZtdF9yZXN0KSlcbiAgICB8ICctJyB8ICcrJyB8ICcjJyB8ICcgJyB8ICdfJyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgZmxhZyAlQyBpcyBvbmx5IGFsbG93ZWQgYWZ0ZXIgdGhlICclJScsIGJlZm9yZSBwYWRkaW5nIGFuZCBwcmVjaXNpb25cIlxuICAgICAgICBzdHIgcGN0X2luZCBzeW1iXG4gICAgfCBfIC0+XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIFxcXG4gICAgICAgICBpbnZhbGlkIGNvbnZlcnNpb24gXFxcIiUlJWNcXFwiXCIgc3RyIChzdHJfaW5kIC0gMSkgc3ltYlxuICAgIGluXG4gICAgKCogQ2hlY2sgZm9yIHVudXNlZCBvcHRpb25zLCBhbmQgcmVqZWN0IHRoZW0gYXMgaW5jb21wYXRpYmxlLlxuXG4gICAgICAgU3VjaCBjaGVja3MgbmVlZCB0byBiZSBkaXNhYmxlZCBpbiBsZWdhY3kgbW9kZSwgYXMgdGhlIGxlZ2FjeVxuICAgICAgIHBhcnNlciBzaWxlbnRseSBpZ25vcmVkIGluY29tcGF0aWJsZSBmbGFncy4gKilcbiAgICBpZiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW4gYmVnaW5cbiAgICBpZiBub3QgIXBsdXNfdXNlZCAmJiBwbHVzIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCI7XG4gICAgaWYgbm90ICFoYXNoX3VzZWQgJiYgaGFzaCB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicjJ1wiO1xuICAgIGlmIG5vdCAhc3BhY2VfdXNlZCAmJiBzcGFjZSB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicgJ1wiO1xuICAgIGlmIG5vdCAhcGFkX3VzZWQgICYmIFBhZGRpbmdfRUJCIHBhZCA8PiBQYWRkaW5nX0VCQiBOb19wYWRkaW5nIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiYHBhZGRpbmcnXCI7XG4gICAgaWYgbm90ICFwcmVjX3VzZWQgJiYgUHJlY2lzaW9uX0VCQiBwcmVjIDw+IFByZWNpc2lvbl9FQkIgTm9fcHJlY2lzaW9uIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAoaWYgaWduIHRoZW4gJ18nIGVsc2Ugc3ltYilcbiAgICAgICAgXCJgcHJlY2lzaW9uJ1wiO1xuICAgIGlmIGlnbiAmJiBwbHVzIHRoZW4gaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICdfJyBcIicrJ1wiO1xuICAgIGVuZDtcbiAgICAoKiB0aGlzIGxhc3QgdGVzdCBtdXN0IG5vdCBiZSBkaXNhYmxlZCBpbiBsZWdhY3kgbW9kZSxcbiAgICAgICBhcyBpZ25vcmluZyBpdCB3b3VsZCB0eXBpY2FsbHkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHR5cGluZ1xuICAgICAgIHRoYW4gd2hhdCB0aGUgbGVnYWN5IHBhcnNlciB1c2VkICopXG4gICAgaWYgbm90ICFpZ25fdXNlZCAmJiBpZ24gdGhlblxuICAgICAgYmVnaW4gbWF0Y2ggc3ltYiB3aXRoXG4gICAgICAgICgqIGFyZ3VtZW50LWxlc3MgZm9ybWF0cyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgaW4gbGVnYWN5IG1vZGUgKilcbiAgICAgICAgfCAoJ0AnIHwgJyUnIHwgJyEnIHwgJywnKSB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPiAoKVxuICAgICAgICB8IF8gLT5cbiAgICAgICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIidfJ1wiXG4gICAgICBlbmQ7XG4gICAgZm10X3Jlc3VsdFxuXG4gICgqIFBhcnNlIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gKGFmdGVyICdAJykuICopXG4gIGFuZCBwYXJzZV9hZnRlcl9hdCA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoJ0AnLCBFbmRfb2ZfZm9ybWF0KSlcbiAgICBlbHNlXG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ1snIC0+XG4gICAgICAgIHBhcnNlX3RhZyBmYWxzZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV9ib3gsIGZtdF9yZXN0KSlcbiAgICAgIHwgJ3snIC0+XG4gICAgICAgIHBhcnNlX3RhZyB0cnVlIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnfScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKENsb3NlX3RhZywgZm10X3Jlc3QpKVxuICAgICAgfCAnLCcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAsXCIsIDAsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICcgJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQnJlYWsgKFwiQCBcIiwgMSwgMCksIGZtdF9yZXN0KSlcbiAgICAgIHwgJzsnIC0+XG4gICAgICAgIHBhcnNlX2dvb2RfYnJlYWsgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICc/JyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRkZsdXNoLCBmbXRfcmVzdCkpXG4gICAgICB8ICdcXG4nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChGb3JjZV9uZXdsaW5lLCBmbXRfcmVzdCkpXG4gICAgICB8ICcuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRmx1c2hfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgcGFyc2VfbWFnaWNfc2l6ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ0AnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChFc2NhcGVkX2F0LCBmbXRfcmVzdCkpXG4gICAgICB8ICclJyB3aGVuIHN0cl9pbmQgKyAxIDwgZW5kX2luZCAmJiBzdHIuW3N0cl9pbmQgKyAxXSA9ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMikgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9wZXJjZW50LCBmbXRfcmVzdCkpXG4gICAgICB8ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgZm10X3Jlc3QpKVxuICAgICAgfCBjIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljIGMsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPG5hbWU+IGFmdGVyIFwiQHtcIiBvciBcIkBbXCIuICopXG4gIGFuZCBwYXJzZV90YWcgOiB0eXBlIGUgZiAuIGJvb2wgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBpc19vcGVuX3RhZyBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICB0cnlcbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICc8JyAtPlxuICAgICAgICBsZXQgaW5kID0gU3RyaW5nLmluZGV4X2Zyb20gc3RyIChzdHJfaW5kICsgMSkgJz4nIGluXG4gICAgICAgIGlmIGluZCA+PSBlbmRfaW5kIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICBsZXQgc3ViX3N0ciA9IFN0cmluZy5zdWIgc3RyIHN0cl9pbmQgKGluZCAtIHN0cl9pbmQgKyAxKSBpblxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChpbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIChpbmQgKyAxKSBpblxuICAgICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoc3ViX2ZtdCwgc3ViX3N0cikgaW5cbiAgICAgICAgbGV0IGZvcm1hdHRpbmcgPVxuICAgICAgICAgIGlmIGlzX29wZW5fdGFnIHRoZW4gT3Blbl90YWcgc3ViX2Zvcm1hdCBlbHNlIE9wZW5fYm94IHN1Yl9mb3JtYXQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcbiAgICAgIHwgXyAtPlxuICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBzdWJfZm9ybWF0ID0gRm9ybWF0IChFbmRfb2ZfZm9ybWF0LCBcIlwiKSBpblxuICAgICAgbGV0IGZvcm1hdHRpbmcgPVxuICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2dlbiAoZm9ybWF0dGluZywgZm10X3Jlc3QpKVxuXG4gICgqIFRyeSB0byByZWFkIHRoZSBvcHRpb25hbCA8d2lkdGggb2Zmc2V0PiBhZnRlciBcIkA7XCIuICopXG4gIGFuZCBwYXJzZV9nb29kX2JyZWFrIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGxldCBuZXh0X2luZCwgZm9ybWF0dGluZ19saXQgPVxuICAgICAgdHJ5XG4gICAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHx8IHN0ci5bc3RyX2luZF0gPD4gJzwnIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICBsZXQgc3RyX2luZF8xID0gcGFyc2Vfc3BhY2VzIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBtYXRjaCBzdHIuW3N0cl9pbmRfMV0gd2l0aFxuICAgICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gKFxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHdpZHRoID0gcGFyc2VfaW50ZWdlciBzdHJfaW5kXzEgZW5kX2luZCBpblxuICAgICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzNdIHdpdGhcbiAgICAgICAgICAgICAgfCAnPicgLT5cbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzMtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfMyArIDEsIEJyZWFrIChzLCB3aWR0aCwgMClcbiAgICAgICAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHN0cl9pbmRfNCwgb2Zmc2V0ID0gcGFyc2VfaW50ZWdlciBzdHJfaW5kXzMgZW5kX2luZCBpblxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzUgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF80IGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBpZiBzdHIuW3N0cl9pbmRfNV0gPD4gJz4nIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICAgICAgICAgIGxldCBzID0gU3RyaW5nLnN1YiBzdHIgKHN0cl9pbmQtMikgKHN0cl9pbmRfNS1zdHJfaW5kKzMpIGluXG4gICAgICAgICAgICAgICAgc3RyX2luZF81ICsgMSwgQnJlYWsgKHMsIHdpZHRoLCBvZmZzZXQpXG4gICAgICAgICAgICAgIHwgXyAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgKVxuICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB3aXRoIE5vdF9mb3VuZCB8IEZhaWx1cmUgXyAtPlxuICAgICAgICBzdHJfaW5kLCBCcmVhayAoXCJAO1wiLCAxLCAwKVxuICAgIGluXG4gICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBuZXh0X2luZCBlbmRfaW5kIGluXG4gICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCkpXG5cbiAgKCogUGFyc2UgdGhlIHNpemUgaW4gYSA8bj4uICopXG4gIGFuZCBwYXJzZV9tYWdpY19zaXplIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIG1hdGNoXG4gICAgICB0cnlcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+XG4gICAgICAgICAgbGV0IHN0cl9pbmRfMiwgc2l6ZSA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICBsZXQgc3RyX2luZF8zID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfMiBlbmRfaW5kIGluXG4gICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzNdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kIC0gMikgKHN0cl9pbmRfMyAtIHN0cl9pbmQgKyAzKSBpblxuICAgICAgICAgIFNvbWUgKHN0cl9pbmRfMyArIDEsIE1hZ2ljX3NpemUgKHMsIHNpemUpKVxuICAgICAgICB8IF8gLT4gTm9uZVxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgTm9uZVxuICAgIHdpdGhcbiAgICB8IFNvbWUgKG5leHRfaW5kLCBmb3JtYXR0aW5nX2xpdCkgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCkpXG4gICAgfCBOb25lIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKFNjYW5faW5kaWMgJzwnLCBmbXRfcmVzdCkpXG5cbiAgKCogUGFyc2UgYW5kIGNvbnN0cnVjdCBhIGNoYXIgc2V0LiAqKVxuICBhbmQgcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuXG4gICAgbGV0IGNoYXJfc2V0ID0gY3JlYXRlX2NoYXJfc2V0ICgpIGluXG4gICAgbGV0IGFkZF9jaGFyIGMgPVxuICAgICAgYWRkX2luX2NoYXJfc2V0IGNoYXJfc2V0IGM7XG4gICAgaW5cbiAgICBsZXQgYWRkX3JhbmdlIGMgYycgPVxuICAgICAgZm9yIGkgPSBpbnRfb2ZfY2hhciBjIHRvIGludF9vZl9jaGFyIGMnIGRvXG4gICAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCAoY2hhcl9vZl9pbnQgaSk7XG4gICAgICBkb25lO1xuICAgIGluXG5cbiAgICBsZXQgZmFpbF9zaW5nbGVfcGVyY2VudCBzdHJfaW5kID1cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogJyUlJyBhbG9uZSBpcyBub3QgYWNjZXB0ZWQgaW4gY2hhcmFjdGVyIHNldHMsIFxcXG4gICAgICAgICB1c2UgJSUlJSBpbnN0ZWFkIGF0IHBvc2l0aW9uICVkLlwiIHN0ciBzdHJfaW5kXG4gICAgaW5cblxuICAgICgqIFBhcnNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBjaGFyIHNldC4gKilcbiAgICBsZXQgcmVjIHBhcnNlX2NoYXJfc2V0X3N0YXJ0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbGV0IGMgPSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG5cbiAgICAoKiBQYXJzZSB0aGUgY29udGVudCBvZiBhIGNoYXIgc2V0IHVudGlsIHRoZSBmaXJzdCAnXScuICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgc3RyX2luZCBlbmRfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBhZGRfY2hhciAnLSc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMgLT5cbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogVGVzdCBmb3IgcmFuZ2UgaW4gY2hhciBzZXQuICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgYWRkX2NoYXIgYztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJy0nIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG4gICAgICB8ICgnJScgfCAnQCcpIGFzIGMnIHdoZW4gYyA9ICclJyAtPlxuICAgICAgICBhZGRfY2hhciBjJztcbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfY29udGVudCAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgYycgLT5cbiAgICAgICAgaWYgYyA9ICclJyB0aGVuIGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZDtcbiAgICAgICAgKCogbm90ZSB0aGF0ICdAJyBhbG9uZSBpcyBhY2NlcHRlZCwgYXMgZG9uZSBieSB0aGUgbGVnYWN5XG4gICAgICAgICAgIGltcGxlbWVudGF0aW9uOyB0aGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkgcmVxdWlyZXMgJUBcbiAgICAgICAgICAgc28gd2UgY291bGQgd2FybiBvbiB0aGF0ICopXG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGMnXG5cbiAgICAoKiBNYW5hZ2UgcmFuZ2UgaW4gY2hhciBzZXQgKGV4Y2VwdCBpZiB0aGUgJy0nIHRoZSBsYXN0IGNoYXIgYmVmb3JlICddJykgKilcbiAgICBhbmQgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfbWludXMgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgYWRkX2NoYXIgYztcbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDFdIHdpdGhcbiAgICAgICAgICB8ICgnJScgfCAnQCcpIGFzIGMnIC0+XG4gICAgICAgICAgICBhZGRfcmFuZ2UgYyBjJztcbiAgICAgICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kXG4gICAgICAgICAgfCBfIC0+IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZFxuICAgICAgICBlbmRcbiAgICAgIHwgYycgLT5cbiAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgaW5cbiAgICBsZXQgc3RyX2luZCwgcmV2ZXJzZSA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICAgIHwgJ14nIC0+IHN0cl9pbmQgKyAxLCB0cnVlXG4gICAgICAgIHwgXyAtPiBzdHJfaW5kLCBmYWxzZSBpblxuICAgIGxldCBuZXh0X2luZCA9IHBhcnNlX2NoYXJfc2V0X3N0YXJ0IHN0cl9pbmQgZW5kX2luZCBpblxuICAgIGxldCBjaGFyX3NldCA9IGZyZWV6ZV9jaGFyX3NldCBjaGFyX3NldCBpblxuICAgIG5leHRfaW5kLCAoaWYgcmV2ZXJzZSB0aGVuIHJldl9jaGFyX3NldCBjaGFyX3NldCBlbHNlIGNoYXJfc2V0KVxuXG4gICgqIENvbnN1bWUgYWxsIG5leHQgc3BhY2VzLCByYWlzZSBhbiBGYWlsdXJlIGlmIGVuZF9pbmQgaXMgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3NwYWNlcyBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgaWYgc3RyLltzdHJfaW5kXSA9ICcgJyB0aGVuIHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgZWxzZSBzdHJfaW5kXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmUgaWYgZW5kX2luZCBpc1xuICAgICByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIGFjYyA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgYXMgYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBhY2MgKiAxMCArIChpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJzAnKSBpblxuICAgICAgaWYgbmV3X2FjYyA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBpbnRlZ2VyICVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGltaXQgJWRcIlxuICAgICAgICAgIHN0ciBuZXdfYWNjIFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgICAgZWxzZVxuICAgICAgICBwYXJzZV9wb3NpdGl2ZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgbmV3X2FjY1xuICAgIHwgXyAtPiBzdHJfaW5kLCBhY2NcblxuICAoKiBSZWFkIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlciBmcm9tIHRoZSBzdHJpbmcsIHJhaXNlIGEgRmFpbHVyZVxuICAgICBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9pbnRlZ2VyIHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT4gcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIDBcbiAgICB8ICctJyAtPiAoXG4gICAgICBpZiBzdHJfaW5kICsgMSA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZCArIDFdIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyAtPlxuICAgICAgICBsZXQgbmV4dF9pbmQsIG4gPSBwYXJzZV9wb3NpdGl2ZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgMCBpblxuICAgICAgICBuZXh0X2luZCwgLW5cbiAgICAgIHwgYyAtPlxuICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImRpZ2l0XCIgY1xuICAgIClcbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgKCogQWRkIGEgbGl0ZXJhbCB0byBhIGZvcm1hdCBmcm9tIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgc3ViLXNlcXVlbmNlLiAqKVxuICBhbmQgYWRkX2xpdGVyYWwgOiB0eXBlIGEgZCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiAoYSwgXywgXywgZCwgZSwgZikgZm10IC0+XG4gICAgICAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBmbXQgLT4gbWF0Y2ggc3RyX2luZCAtIGxpdF9zdGFydCB3aXRoXG4gICAgfCAwICAgIC0+IEZtdF9FQkIgZm10XG4gICAgfCAxICAgIC0+IEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoc3RyLltsaXRfc3RhcnRdLCBmbXQpKVxuICAgIHwgc2l6ZSAtPiBGbXRfRUJCIChTdHJpbmdfbGl0ZXJhbCAoU3RyaW5nLnN1YiBzdHIgbGl0X3N0YXJ0IHNpemUsIGZtdCkpXG5cbiAgKCogU2VhcmNoIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3ViLWZvcm1hdFxuICAgICAoaS5lLiB0aGUgY29ycmVzcG9uZGluZyBcIiV9XCIgb3IgXCIlKVwiKSAqKVxuICBhbmQgc2VhcmNoX3N1YmZvcm1hdF9lbmQgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogdW5jbG9zZWQgc3ViLWZvcm1hdCwgXFxcbiAgICAgICAgIGV4cGVjdGVkIFxcXCIlJSVjXFxcIiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkXCIgc3RyIGMgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICclJyAtPlxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBpZiBzdHIuW3N0cl9pbmQgKyAxXSA9IGMgdGhlbiAoKiBFbmQgb2YgZm9ybWF0IGZvdW5kICopIHN0cl9pbmQgZWxzZVxuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgIHwgJ18nIC0+XG4gICAgICAgICAgKCogU2VhcmNoIGZvciBcIiVfKFwiIG9yIFwiJV97XCIuICopXG4gICAgICAgICAgaWYgc3RyX2luZCArIDIgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMl0gd2l0aFxuICAgICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnfScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCAnKCcgLT5cbiAgICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAzKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgICB8IF8gLT4gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAzKSBlbmRfaW5kIGNcbiAgICAgICAgICBlbmRcbiAgICAgICAgfCAneycgLT5cbiAgICAgICAgICAoKiAley4uLiV9IHN1Yi1mb3JtYXQgZm91bmQuICopXG4gICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDIpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgfCAnKCcgLT5cbiAgICAgICAgICAoKiAlKC4uLiUpIHN1Yi1mb3JtYXQgZm91bmQuICopXG4gICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDIpIGVuZF9pbmQgJyknIGluXG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgfCAnfScgLT5cbiAgICAgICAgICAoKiBFcnJvcjogJSguLi4lfS4gKilcbiAgICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImNoYXJhY3RlciAnKSdcIiAnfSdcbiAgICAgICAgfCAnKScgLT5cbiAgICAgICAgICAoKiBFcnJvcjogJXsuLi4lKS4gKilcbiAgICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImNoYXJhY3RlciAnfSdcIiAnKSdcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgZW5kXG4gICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG5cbiAgKCogQ2hlY2sgaWYgc3ltYiBpcyBhIHZhbGlkIGludCBjb252ZXJzaW9uIGFmdGVyIFwiJWxcIiwgXCIlblwiIG9yIFwiJUxcIiAqKVxuICBhbmQgaXNfaW50X2Jhc2Ugc3ltYiA9IG1hdGNoIHN5bWIgd2l0aFxuICAgIHwgJ2QnIHwgJ2knIHwgJ3gnIHwgJ1gnIHwgJ28nIHwgJ3UnIC0+IHRydWVcbiAgICB8IF8gLT4gZmFsc2VcblxuICAoKiBDb252ZXJ0IGEgY2hhciAobCwgbiBvciBMKSB0byBpdHMgYXNzb2NpYXRlZCBjb3VudGVyLiAqKVxuICBhbmQgY291bnRlcl9vZl9jaGFyIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdsJyAtPiBMaW5lX2NvdW50ZXIgIHwgJ24nIC0+IENoYXJfY291bnRlclxuICAgIHwgJ0wnIC0+IFRva2VuX2NvdW50ZXIgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIENvbnZlcnQgKHBsdXMsIHN5bWIpIHRvIGl0cyBhc3NvY2lhdGVkIGludF9jb252LiAqKVxuICBhbmQgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIG1hdGNoIHBsdXMsIGhhc2gsIHNwYWNlLCBzeW1iIHdpdGhcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdkJyAtPiBJbnRfZCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnaScgLT4gSW50X2lcbiAgICB8IGZhbHNlLCBmYWxzZSwgIHRydWUsICdkJyAtPiBJbnRfc2QgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnaScgLT4gSW50X3NpXG4gICAgfCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X3BkIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9waVxuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ3gnIC0+IEludF94ICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdYJyAtPiBJbnRfWFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3gnIC0+IEludF9DeCB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdYJyAtPiBJbnRfQ1hcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdvJyAtPiBJbnRfb1xuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ28nIC0+IEludF9Db1xuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ3UnIC0+IEludF91XG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnZCcgLT4gSW50X0NkXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnaScgLT4gSW50X0NpXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAndScgLT4gSW50X0N1XG4gICAgfCBfLCB0cnVlLCBfLCAneCcgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0N4XG4gICAgfCBfLCB0cnVlLCBfLCAnWCcgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0NYXG4gICAgfCBfLCB0cnVlLCBfLCAnbycgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0NvXG4gICAgfCBfLCB0cnVlLCBfLCAoJ2QnIHwgJ2knIHwgJ3UnKSAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgZmFsc2Ugc3BhY2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicjJ1wiXG4gICAgfCB0cnVlLCBfLCB0cnVlLCBfIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICAoKiBwbHVzIGFuZCBzcGFjZTogbGVnYWN5IGltcGxlbWVudGF0aW9uIHByZWZlcnMgcGx1cyAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggZmFsc2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJyAnIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCB0cnVlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIlxuICAgIHwgdHJ1ZSwgXywgZmFsc2UsIF8gICAgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBmYWxzZSBoYXNoIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInKydcIlxuICAgIHwgZmFsc2UsIF8sIGZhbHNlLCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIENvbnZlcnQgKHBsdXMsIHNwYWNlLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBmbG9hdF9jb252LiAqKVxuICBhbmQgY29tcHV0ZV9mbG9hdF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggc3BhY2Ugc3ltYiA9XG4gICAgbGV0IGZsYWcgPSBtYXRjaCBwbHVzLCBzcGFjZSB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19cbiAgICB8IGZhbHNlLCAgdHJ1ZSAtPiBGbG9hdF9mbGFnX3NcbiAgICB8ICB0cnVlLCBmYWxzZSAtPiBGbG9hdF9mbGFnX3BcbiAgICB8ICB0cnVlLCAgdHJ1ZSAtPlxuICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEZsb2F0X2ZsYWdfcFxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJyAnIFwiJysnXCIgaW5cbiAgICBsZXQga2luZCA9IG1hdGNoIGhhc2gsIHN5bWIgd2l0aFxuICAgIHwgXywgJ2YnIC0+IEZsb2F0X2ZcbiAgICB8IF8sICdlJyAtPiBGbG9hdF9lXG4gICAgfCBfLCAnRScgLT4gRmxvYXRfRVxuICAgIHwgXywgJ2cnIC0+IEZsb2F0X2dcbiAgICB8IF8sICdHJyAtPiBGbG9hdF9HXG4gICAgfCBfLCAnaCcgLT4gRmxvYXRfaFxuICAgIHwgXywgJ0gnIC0+IEZsb2F0X0hcbiAgICB8IGZhbHNlLCAnRicgLT4gRmxvYXRfRlxuICAgIHwgdHJ1ZSwgJ0YnIC0+IEZsb2F0X0NGXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZSBpblxuICAgIGZsYWcsIGtpbmRcblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UgYWJvdXQgaW5jb21wYXRpYmxlIG9wdGlvbnMuKilcbiAgYW5kIGluY29tcGF0aWJsZV9mbGFnIDogdHlwZSBhIC4gaW50IC0+IGludCAtPiBjaGFyIC0+IHN0cmluZyAtPiBhID1cbiAgICBmdW4gcGN0X2luZCBzdHJfaW5kIHN5bWIgb3B0aW9uIC0+XG4gICAgICBsZXQgc3ViZm10ID0gU3RyaW5nLnN1YiBzdHIgcGN0X2luZCAoc3RyX2luZCAtIHBjdF9pbmQpIGluXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIFxcXG4gICAgICAgICAlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCAnJWMnIGluIHN1Yi1mb3JtYXQgJVNcIlxuICAgICAgICBzdHIgcGN0X2luZCBvcHRpb24gc3ltYiBzdWJmbXRcblxuICBpbiBwYXJzZSAwIChTdHJpbmcubGVuZ3RoIHN0cilcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICgqIEd1YXJkZWQgc3RyaW5nIHRvIGZvcm1hdCBjb252ZXJzaW9ucyAqKVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGFjY29yZGluZyB0byBhbiBmbXR0eS4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IGZvcm1hdF9vZl9zdHJpbmdfZm10dHkgc3RyIGZtdHR5ID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCBmbXR0eSwgc3RyKVxuICB3aXRoIFR5cGVfbWlzbWF0Y2ggLT5cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImJhZCBpbnB1dDogZm9ybWF0IHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiAlUyBhbmQgJVNcIlxuICAgICAgc3RyIChzdHJpbmdfb2ZfZm10dHkgZm10dHkpXG5cbigqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIGFuIG90aGVyIGZvcm1hdC4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IGZvcm1hdF9vZl9zdHJpbmdfZm9ybWF0IHN0ciAoRm9ybWF0IChmbXQnLCBzdHInKSkgPVxuICBsZXQgRm10X0VCQiBmbXQgPSBmbXRfZWJiX29mX3N0cmluZyBzdHIgaW5cbiAgdHJ5IEZvcm1hdCAodHlwZV9mb3JtYXQgZm10IChmbXR0eV9vZl9mbXQgZm10JyksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCIgc3RyIHN0cidcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBQcmludGZcblxudHlwZSB0ID0gZXhuID0gLi5cblxubGV0IHByaW50ZXJzID0gQXRvbWljLm1ha2UgW11cblxubGV0IGxvY2ZtdCA9IGZvcm1hdF9vZl9zdHJpbmcgXCJGaWxlIFxcXCIlc1xcXCIsIGxpbmUgJWQsIGNoYXJhY3RlcnMgJWQtJWQ6ICVzXCJcblxubGV0IGZpZWxkIHggaSA9XG4gIGxldCBmID0gT2JqLmZpZWxkIHggaSBpblxuICBpZiBub3QgKE9iai5pc19ibG9jayBmKSB0aGVuXG4gICAgc3ByaW50ZiBcIiVkXCIgKE9iai5tYWdpYyBmIDogaW50KSAgICAgICAgICAgKCogY2FuIGFsc28gYmUgYSBjaGFyICopXG4gIGVsc2UgaWYgT2JqLnRhZyBmID0gT2JqLnN0cmluZ190YWcgdGhlblxuICAgIHNwcmludGYgXCIlU1wiIChPYmoubWFnaWMgZiA6IHN0cmluZylcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouZG91YmxlX3RhZyB0aGVuXG4gICAgc3RyaW5nX29mX2Zsb2F0IChPYmoubWFnaWMgZiA6IGZsb2F0KVxuICBlbHNlXG4gICAgXCJfXCJcblxubGV0IHJlYyBvdGhlcl9maWVsZHMgeCBpID1cbiAgaWYgaSA+PSBPYmouc2l6ZSB4IHRoZW4gXCJcIlxuICBlbHNlIHNwcmludGYgXCIsICVzJXNcIiAoZmllbGQgeCBpKSAob3RoZXJfZmllbGRzIHggKGkrMSkpXG5cbmxldCBmaWVsZHMgeCA9XG4gIG1hdGNoIE9iai5zaXplIHggd2l0aFxuICB8IDAgLT4gXCJcIlxuICB8IDEgLT4gXCJcIlxuICB8IDIgLT4gc3ByaW50ZiBcIiglcylcIiAoZmllbGQgeCAxKVxuICB8IF8gLT4gc3ByaW50ZiBcIiglcyVzKVwiIChmaWVsZCB4IDEpIChvdGhlcl9maWVsZHMgeCAyKVxuXG5sZXQgdXNlX3ByaW50ZXJzIHggPVxuICBsZXQgcmVjIGNvbnYgPSBmdW5jdGlvblxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgKG1hdGNoIGhkIHggd2l0aFxuICAgICAgICAgfCBOb25lIHwgZXhjZXB0aW9uIF8gLT4gY29udiB0bFxuICAgICAgICAgfCBTb21lIHMgLT4gU29tZSBzKVxuICAgIHwgW10gLT4gTm9uZSBpblxuICBjb252IChBdG9taWMuZ2V0IHByaW50ZXJzKVxuXG5sZXQgdG9fc3RyaW5nX2RlZmF1bHQgPSBmdW5jdGlvblxuICB8IE91dF9vZl9tZW1vcnkgLT4gXCJPdXQgb2YgbWVtb3J5XCJcbiAgfCBTdGFja19vdmVyZmxvdyAtPiBcIlN0YWNrIG92ZXJmbG93XCJcbiAgfCBNYXRjaF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis1KSBcIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbGVkXCJcbiAgfCBBc3NlcnRfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJBc3NlcnRpb24gZmFpbGVkXCJcbiAgfCBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJVbmRlZmluZWQgcmVjdXJzaXZlIG1vZHVsZVwiXG4gIHwgeCAtPlxuICAgICAgbGV0IHggPSBPYmoucmVwciB4IGluXG4gICAgICBpZiBPYmoudGFnIHggPD4gMCB0aGVuXG4gICAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCB4IDApIDogc3RyaW5nKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgY29uc3RydWN0b3IgPVxuICAgICAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCAoT2JqLmZpZWxkIHggMCkgMCkgOiBzdHJpbmcpIGluXG4gICAgICAgIGNvbnN0cnVjdG9yIF4gKGZpZWxkcyB4KVxuXG5sZXQgdG9fc3RyaW5nIGUgPVxuICBtYXRjaCB1c2VfcHJpbnRlcnMgZSB3aXRoXG4gIHwgU29tZSBzIC0+IHNcbiAgfCBOb25lIC0+IHRvX3N0cmluZ19kZWZhdWx0IGVcblxubGV0IHByaW50IGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGVwcmludGYgXCJVbmNhdWdodCBleGNlcHRpb246ICVzXFxuXCIgKHRvX3N0cmluZyB4KTtcbiAgICBmbHVzaCBzdGRlcnI7XG4gICAgcmFpc2UgeFxuXG5sZXQgY2F0Y2ggZmN0IGFyZyA9XG4gIHRyeVxuICAgIGZjdCBhcmdcbiAgd2l0aCB4IC0+XG4gICAgZmx1c2ggc3Rkb3V0O1xuICAgIGVwcmludGYgXCJVbmNhdWdodCBleGNlcHRpb246ICVzXFxuXCIgKHRvX3N0cmluZyB4KTtcbiAgICBleGl0IDJcblxudHlwZSByYXdfYmFja3RyYWNlX3Nsb3RcbnR5cGUgcmF3X2JhY2t0cmFjZV9lbnRyeSA9IHByaXZhdGUgaW50XG50eXBlIHJhd19iYWNrdHJhY2UgPSByYXdfYmFja3RyYWNlX2VudHJ5IGFycmF5XG5cbmxldCByYXdfYmFja3RyYWNlX2VudHJpZXMgYnQgPSBidFxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZTpcbiAgdW5pdCAtPiByYXdfYmFja3RyYWNlID0gXCJjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZVwiXG5cbmV4dGVybmFsIHJhaXNlX3dpdGhfYmFja3RyYWNlOiBleG4gLT4gcmF3X2JhY2t0cmFjZSAtPiAnYVxuICA9IFwiJXJhaXNlX3dpdGhfYmFja3RyYWNlXCJcblxudHlwZSBiYWNrdHJhY2Vfc2xvdCA9XG4gIHwgS25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgICAgOiBib29sO1xuICAgICAgZmlsZW5hbWUgICAgOiBzdHJpbmc7XG4gICAgICBsaW5lX251bWJlciA6IGludDtcbiAgICAgIHN0YXJ0X2NoYXIgIDogaW50O1xuICAgICAgZW5kX2NoYXIgICAgOiBpbnQ7XG4gICAgICBpc19pbmxpbmUgICA6IGJvb2w7XG4gICAgICBkZWZuYW1lICAgICA6IHN0cmluZztcbiAgICB9XG4gIHwgVW5rbm93bl9sb2NhdGlvbiBvZiB7XG4gICAgICBpc19yYWlzZSA6IGJvb2xcbiAgICB9XG5cbigqIHRvIGF2b2lkIHdhcm5pbmcgKilcbmxldCBfID0gW0tub3duX2xvY2F0aW9uIHsgaXNfcmFpc2UgPSBmYWxzZTsgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciA9IDA7IHN0YXJ0X2NoYXIgPSAwOyBlbmRfY2hhciA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2lubGluZSA9IGZhbHNlOyBkZWZuYW1lID0gXCJcIiB9O1xuICAgICAgICAgVW5rbm93bl9sb2NhdGlvbiB7IGlzX3JhaXNlID0gZmFsc2UgfV1cblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3Q6XG4gIHJhd19iYWNrdHJhY2Vfc2xvdCAtPiBiYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdFwiXG5cbmV4dGVybmFsIGNvbnZlcnRfcmF3X2JhY2t0cmFjZTpcbiAgcmF3X2JhY2t0cmFjZSAtPiBiYWNrdHJhY2Vfc2xvdCBhcnJheSA9IFwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2VcIlxuXG5sZXQgY29udmVydF9yYXdfYmFja3RyYWNlIGJ0ID1cbiAgdHJ5IFNvbWUgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSBidClcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5sZXQgZm9ybWF0X2JhY2t0cmFjZV9zbG90IHBvcyBzbG90ID1cbiAgbGV0IGluZm8gaXNfcmFpc2UgPVxuICAgIGlmIGlzX3JhaXNlIHRoZW5cbiAgICAgIGlmIHBvcyA9IDAgdGhlbiBcIlJhaXNlZCBhdFwiIGVsc2UgXCJSZS1yYWlzZWQgYXRcIlxuICAgIGVsc2VcbiAgICAgIGlmIHBvcyA9IDAgdGhlbiBcIlJhaXNlZCBieSBwcmltaXRpdmUgb3BlcmF0aW9uIGF0XCIgZWxzZSBcIkNhbGxlZCBmcm9tXCJcbiAgaW5cbiAgbWF0Y2ggc2xvdCB3aXRoXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgICBpZiBsLmlzX3JhaXNlIHRoZW5cbiAgICAgICAgKCogY29tcGlsZXItaW5zZXJ0ZWQgcmUtcmFpc2UsIHNraXBwZWQgKikgTm9uZVxuICAgICAgZWxzZVxuICAgICAgICBTb21lIChzcHJpbnRmIFwiJXMgdW5rbm93biBsb2NhdGlvblwiIChpbmZvIGZhbHNlKSlcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgICBTb21lIChzcHJpbnRmIFwiJXMgJXMgaW4gZmlsZSBcXFwiJXNcXFwiJXMsIGxpbmUgJWQsIGNoYXJhY3RlcnMgJWQtJWRcIlxuICAgICAgICAgICAgICAoaW5mbyBsLmlzX3JhaXNlKSBsLmRlZm5hbWUgbC5maWxlbmFtZVxuICAgICAgICAgICAgICAoaWYgbC5pc19pbmxpbmUgdGhlbiBcIiAoaW5saW5lZClcIiBlbHNlIFwiXCIpXG4gICAgICAgICAgICAgIGwubGluZV9udW1iZXIgbC5zdGFydF9jaGFyIGwuZW5kX2NoYXIpXG5cbmxldCBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gYmFja3RyYWNlID1cbiAgbWF0Y2ggYmFja3RyYWNlIHdpdGhcbiAgfCBOb25lIC0+XG4gICAgICBmcHJpbnRmIG91dGNoYW5cbiAgICAgICAgXCIoUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIGNhbm5vdCBwcmludCBzdGFjayBiYWNrdHJhY2UpXFxuXCJcbiAgfCBTb21lIGEgLT5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gZnByaW50ZiBvdXRjaGFuIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmVcblxubGV0IHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiByYXdfYmFja3RyYWNlID1cbiAgcHJpbnRfZXhjZXB0aW9uX2JhY2t0cmFjZSBvdXRjaGFuIChjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSlcblxuKCogY29uZnVzaW5nbHkgbmFtZWQ6IHByaW50cyB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgcHJpbnRfYmFja3RyYWNlIG91dGNoYW4gPVxuICBwcmludF9yYXdfYmFja3RyYWNlIG91dGNoYW4gKGdldF9yYXdfYmFja3RyYWNlICgpKVxuXG5sZXQgYmFja3RyYWNlX3RvX3N0cmluZyBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgXCIoUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIGNhbm5vdCBwcmludCBzdGFjayBiYWNrdHJhY2UpXFxuXCJcbiAgfCBTb21lIGEgLT5cbiAgICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAxMDI0IGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGEgLSAxIGRvXG4gICAgICAgIG1hdGNoIGZvcm1hdF9iYWNrdHJhY2Vfc2xvdCBpIGEuKGkpIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgc3RyIC0+IGJwcmludGYgYiBcIiVzXFxuXCIgc3RyXG4gICAgICBkb25lO1xuICAgICAgQnVmZmVyLmNvbnRlbnRzIGJcblxubGV0IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIHJhd19iYWNrdHJhY2UgPVxuICBiYWNrdHJhY2VfdG9fc3RyaW5nIChjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSlcblxubGV0IGJhY2t0cmFjZV9zbG90X2lzX3JhaXNlID0gZnVuY3Rpb25cbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IGwuaXNfcmFpc2VcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lID0gZnVuY3Rpb25cbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IGwuaXNfaW5saW5lXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IGZhbHNlXG5cbnR5cGUgbG9jYXRpb24gPSB7XG4gIGZpbGVuYW1lIDogc3RyaW5nO1xuICBsaW5lX251bWJlciA6IGludDtcbiAgc3RhcnRfY2hhciA6IGludDtcbiAgZW5kX2NoYXIgOiBpbnQ7XG59XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgU29tZSB7XG4gICAgICBmaWxlbmFtZSAgICA9IGwuZmlsZW5hbWU7XG4gICAgICBsaW5lX251bWJlciA9IGwubGluZV9udW1iZXI7XG4gICAgICBzdGFydF9jaGFyICA9IGwuc3RhcnRfY2hhcjtcbiAgICAgIGVuZF9jaGFyICAgID0gbC5lbmRfY2hhcjtcbiAgICB9XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9kZWZuYW1lID0gZnVuY3Rpb25cbiAgfCBVbmtub3duX2xvY2F0aW9uIF9cbiAgfCBLbm93bl9sb2NhdGlvbiB7IGRlZm5hbWUgPSBcIlwiIH0gLT4gTm9uZVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gU29tZSBsLmRlZm5hbWVcblxubGV0IGJhY2t0cmFjZV9zbG90cyByYXdfYmFja3RyYWNlID1cbiAgKCogVGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgU29tZSBpc1xuICAgICByZXR1cm5lZCBvbmx5IGlmIGEgcGFydCBvZiB0aGUgdHJhY2UgaXMgdXNhYmxlLiBUaGlzIGdpdmVzIHVzXG4gICAgIGEgYml0IG1vcmUgd29yayB0aGFuIGp1c3QgY29udmVydF9yYXdfYmFja3RyYWNlLCBidXQgaXQgbWFrZXMgdGhlXG4gICAgIEFQSSBtb3JlIHVzZXItZnJpZW5kbHkgLS0gb3RoZXJ3aXNlIG1vc3QgdXNlcnMgd291bGQgaGF2ZSB0b1xuICAgICByZWltcGxlbWVudCB0aGUgXCJQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgc29ycnlcIiBsb2dpY1xuICAgICB0aGVtc2VsdmVzLiAqKVxuICBtYXRjaCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgYmFja3RyYWNlIC0+XG4gICAgICBsZXQgdXNhYmxlX3Nsb3QgPSBmdW5jdGlvblxuICAgICAgICB8IFVua25vd25fbG9jYXRpb24gXyAtPiBmYWxzZVxuICAgICAgICB8IEtub3duX2xvY2F0aW9uIF8gLT4gdHJ1ZSBpblxuICAgICAgbGV0IHJlYyBleGlzdHNfdXNhYmxlID0gZnVuY3Rpb25cbiAgICAgICAgfCAoLTEpIC0+IGZhbHNlXG4gICAgICAgIHwgaSAtPiB1c2FibGVfc2xvdCBiYWNrdHJhY2UuKGkpIHx8IGV4aXN0c191c2FibGUgKGkgLSAxKSBpblxuICAgICAgaWYgZXhpc3RzX3VzYWJsZSAoQXJyYXkubGVuZ3RoIGJhY2t0cmFjZSAtIDEpXG4gICAgICB0aGVuIFNvbWUgYmFja3RyYWNlXG4gICAgICBlbHNlIE5vbmVcblxubGV0IGJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkgZW50cnkgPVxuICBiYWNrdHJhY2Vfc2xvdHMgW3wgZW50cnkgfF1cblxubW9kdWxlIFNsb3QgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGZvcm1hdCA9IGZvcm1hdF9iYWNrdHJhY2Vfc2xvdFxuICBsZXQgaXNfcmFpc2UgPSBiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZVxuICBsZXQgaXNfaW5saW5lID0gYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lXG4gIGxldCBsb2NhdGlvbiA9IGJhY2t0cmFjZV9zbG90X2xvY2F0aW9uXG4gIGxldCBuYW1lID0gYmFja3RyYWNlX3Nsb3RfZGVmbmFtZVxuZW5kXG5cbmxldCByYXdfYmFja3RyYWNlX2xlbmd0aCBidCA9IEFycmF5Lmxlbmd0aCBidFxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9zbG90IDpcbiAgcmF3X2JhY2t0cmFjZSAtPiBpbnQgLT4gcmF3X2JhY2t0cmFjZV9zbG90ID0gXCJjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdFwiXG5cbmV4dGVybmFsIGdldF9yYXdfYmFja3RyYWNlX25leHRfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2Vfc2xvdCAtPiByYXdfYmFja3RyYWNlX3Nsb3Qgb3B0aW9uXG4gID0gXCJjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XCJcblxuKCogY29uZnVzaW5nbHkgbmFtZWQ6XG4gICByZXR1cm5zIHRoZSAqc3RyaW5nKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBnZXRfYmFja3RyYWNlICgpID0gcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgKGdldF9yYXdfYmFja3RyYWNlICgpKVxuXG5leHRlcm5hbCByZWNvcmRfYmFja3RyYWNlOiBib29sIC0+IHVuaXQgPSBcImNhbWxfcmVjb3JkX2JhY2t0cmFjZVwiXG5leHRlcm5hbCBiYWNrdHJhY2Vfc3RhdHVzOiB1bml0IC0+IGJvb2wgPSBcImNhbWxfYmFja3RyYWNlX3N0YXR1c1wiXG5cbmxldCByZWMgcmVnaXN0ZXJfcHJpbnRlciBmbiA9XG4gIGxldCBvbGRfcHJpbnRlcnMgPSBBdG9taWMuZ2V0IHByaW50ZXJzIGluXG4gIGxldCBuZXdfcHJpbnRlcnMgPSBmbiA6OiBvbGRfcHJpbnRlcnMgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBBdG9taWMuY29tcGFyZV9hbmRfc2V0IHByaW50ZXJzIG9sZF9wcmludGVycyBuZXdfcHJpbnRlcnMgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiByZWdpc3Rlcl9wcmludGVyIGZuXG5cbmV4dGVybmFsIGdldF9jYWxsc3RhY2s6IGludCAtPiByYXdfYmFja3RyYWNlID0gXCJjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFja1wiXG5cbmxldCBleG5fc2xvdCB4ID1cbiAgbGV0IHggPSBPYmoucmVwciB4IGluXG4gIGlmIE9iai50YWcgeCA9IDAgdGhlbiBPYmouZmllbGQgeCAwIGVsc2UgeFxuXG5sZXQgZXhuX3Nsb3RfaWQgeCA9XG4gIGxldCBzbG90ID0gZXhuX3Nsb3QgeCBpblxuICAoT2JqLm9iaiAoT2JqLmZpZWxkIHNsb3QgMSkgOiBpbnQpXG5cbmxldCBleG5fc2xvdF9uYW1lIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDApIDogc3RyaW5nKVxuXG5leHRlcm5hbCBnZXRfZGVidWdfaW5mb19zdGF0dXMgOiB1bml0IC0+IGludCA9IFwiY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1c1wiXG5cbigqIERlc2NyaXB0aW9ucyBmb3IgZXJyb3JzIGluIHN0YXJ0dXAuaC4gU2VlIGFsc28gYmFja3RyYWNlLmMgKilcbmxldCBlcnJvcnMgPSBbfCBcIlwiO1xuICAoKiBGSUxFX05PVF9GT1VORCAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgbm90IGZvdW5kKVwiO1xuICAoKiBCQURfQllURUNPREUgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdClcIjtcbiAgKCogV1JPTkdfTUFHSUMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGhhcyB3cm9uZyBtYWdpYyBudW1iZXIpXCI7XG4gICgqIE5PX0ZEUyAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgY2Fubm90IGJlIG9wZW5lZDtcXG4gXFxcbiAgICAgIC0tIHRvbyBtYW55IG9wZW4gZmlsZXMuIFRyeSBydW5uaW5nIHdpdGggT0NBTUxSVU5QQVJBTT1iPTIpXCJcbnxdXG5cbmxldCBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlID1cbiAgZXByaW50ZiBcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gJXNcXG5cIiAodG9fc3RyaW5nIGV4bik7XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2U7XG4gIGxldCBzdGF0dXMgPSBnZXRfZGVidWdfaW5mb19zdGF0dXMgKCkgaW5cbiAgaWYgc3RhdHVzIDwgMCB0aGVuXG4gICAgcHJlcnJfZW5kbGluZSBlcnJvcnMuKGFicyBzdGF0dXMpO1xuICBmbHVzaCBzdGRlcnJcblxubGV0IHVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyID0gcmVmIGRlZmF1bHRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXJcblxubGV0IHNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBmbiA9IHVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIDo9IGZuXG5cbmxldCBlbXB0eV9iYWNrdHJhY2UgOiByYXdfYmFja3RyYWNlID0gW3wgfF1cblxubGV0IHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKSA9XG4gIHRyeVxuICAgIGdldF9yYXdfYmFja3RyYWNlICgpXG4gIHdpdGggXyAoKiBPdXRfb2ZfbWVtb3J5PyAqKSAtPlxuICAgIGVtcHR5X2JhY2t0cmFjZVxuXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZSA9XG4gIHRyeVxuICAgICgqIEdldCB0aGUgYmFja3RyYWNlIG5vdywgaW4gY2FzZSBvbmUgb2YgdGhlIFthdF9leGl0XSBmdW5jdGlvblxuICAgICAgIGRlc3Ryb3lzIGl0LiAqKVxuICAgIGxldCByYXdfYmFja3RyYWNlID1cbiAgICAgIGlmIGRlYnVnZ2VyX2luX3VzZSAoKiBTYW1lIHRlc3QgYXMgaW4gW3J1bnRpbWUvcHJpbnRleGMuY10gKikgdGhlblxuICAgICAgICBlbXB0eV9iYWNrdHJhY2VcbiAgICAgIGVsc2VcbiAgICAgICAgdHJ5X2dldF9yYXdfYmFja3RyYWNlICgpXG4gICAgaW5cbiAgICAodHJ5IFN0ZGxpYi5kb19hdF9leGl0ICgpIHdpdGggXyAtPiAoKSk7XG4gICAgdHJ5XG4gICAgICAhdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZXhuIHJhd19iYWNrdHJhY2VcbiAgICB3aXRoIGV4bicgLT5cbiAgICAgIGxldCByYXdfYmFja3RyYWNlJyA9IHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZXByaW50ZiBcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gJXNcXG5cIiAodG9fc3RyaW5nIGV4bik7XG4gICAgICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICAgICAgZXByaW50ZiBcIkZhdGFsIGVycm9yIGluIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyOiBleGNlcHRpb24gJXNcXG5cIlxuICAgICAgICAodG9fc3RyaW5nIGV4bicpO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZSc7XG4gICAgICBmbHVzaCBzdGRlcnJcbiAgd2l0aFxuICAgIHwgT3V0X29mX21lbW9yeSAtPlxuICAgICAgICBwcmVycl9lbmRsaW5lXG4gICAgICAgICAgXCJGYXRhbCBlcnJvcjogb3V0IG9mIG1lbW9yeSBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlclwiXG5cbigqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFtjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbl0gaW5cbiAgIFtydW50aW1lL3ByaW50ZXhjLmNdIHdoaWNoIGV4cGVjdHMgbm8gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcbmxldCBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uJyBleG4gZGVidWdnZXJfaW5fdXNlXG4gIHdpdGggXyAtPlxuICAgICgqIFRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50ICopXG4gICAgKClcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgLT4gdW5pdFxuICA9IFwiY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZVwiXG5cbmxldCAoKSA9XG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIFwiUHJpbnRleGMuaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvblwiXG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvblxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIFhhdmllciBMZXJveSBhbmQgRGFtaWVuIERvbGlnZXosIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5sZXQgZ2VuZXJpY19xdW90ZSBxdW90ZXF1b3RlIHMgPVxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKGwgKyAyMCkgaW5cbiAgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcJyc7XG4gIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgIGlmIHMuW2ldID0gJ1xcJydcbiAgICB0aGVuIEJ1ZmZlci5hZGRfc3RyaW5nIGIgcXVvdGVxdW90ZVxuICAgIGVsc2UgQnVmZmVyLmFkZF9jaGFyIGIgIHMuW2ldXG4gIGRvbmU7XG4gIEJ1ZmZlci5hZGRfY2hhciBiICdcXCcnO1xuICBCdWZmZXIuY29udGVudHMgYlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIE9wZW4gR3JvdXAgc3BlY2lmaWNhdGlvbiBmb3VuZCBoZXJlOlxuICBbWzFdXSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvYmFzZW5hbWUuaHRtbFxuICBJbiBzdGVwIDEgb2YgW1sxXV0sIHdlIGNob29zZSB0byByZXR1cm4gXCIuXCIgZm9yIGVtcHR5IGlucHV0LlxuICAgIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIE9DYW1sKVxuICBJbiBzdGVwIDIsIHdlIGNob29zZSB0byBwcm9jZXNzIFwiLy9cIiBub3JtYWxseS5cbiAgU3RlcCA2IGlzIG5vdCBpbXBsZW1lbnRlZDogd2UgY29uc2lkZXIgdGhhdCB0aGUgW3N1ZmZpeF0gb3BlcmFuZCBpc1xuICAgIGFsd2F5cyBhYnNlbnQuICBTdWZmaXhlcyBhcmUgaGFuZGxlZCBieSBbY2hvcF9zdWZmaXhdIGFuZCBbY2hvcF9leHRlbnNpb25dLlxuKilcbmxldCBnZW5lcmljX2Jhc2VuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZSBuYW1lID1cbiAgbGV0IHJlYyBmaW5kX2VuZCBuID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIDFcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gZmluZF9lbmQgKG4gLSAxKVxuICAgIGVsc2UgZmluZF9iZWcgbiAobiArIDEpXG4gIGFuZCBmaW5kX2JlZyBuIHAgPVxuICAgIGlmIG4gPCAwIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgcFxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiBTdHJpbmcuc3ViIG5hbWUgKG4gKyAxKSAocCAtIG4gLSAxKVxuICAgIGVsc2UgZmluZF9iZWcgKG4gLSAxKSBwXG4gIGluXG4gIGlmIG5hbWUgPSBcIlwiXG4gIHRoZW4gY3VycmVudF9kaXJfbmFtZVxuICBlbHNlIGZpbmRfZW5kIChTdHJpbmcubGVuZ3RoIG5hbWUgLSAxKVxuXG4oKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIE9wZW4gR3JvdXAgc3BlY2lmaWNhdGlvbiBmb3VuZCBoZXJlOlxuICBbWzJdXSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZGlybmFtZS5odG1sXG4gIEluIHN0ZXAgNiBvZiBbWzJdXSwgd2UgY2hvb3NlIHRvIHByb2Nlc3MgXCIvL1wiIG5vcm1hbGx5LlxuKilcbmxldCBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lIG5hbWUgPVxuICBsZXQgcmVjIHRyYWlsaW5nX3NlcCBuID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIDFcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gdHJhaWxpbmdfc2VwIChuIC0gMSlcbiAgICBlbHNlIGJhc2UgblxuICBhbmQgYmFzZSBuID1cbiAgICBpZiBuIDwgMCB0aGVuIGN1cnJlbnRfZGlyX25hbWVcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gaW50ZXJtZWRpYXRlX3NlcCBuXG4gICAgZWxzZSBiYXNlIChuIC0gMSlcbiAgYW5kIGludGVybWVkaWF0ZV9zZXAgbiA9XG4gICAgaWYgbiA8IDAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCAxXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIGludGVybWVkaWF0ZV9zZXAgKG4gLSAxKVxuICAgIGVsc2UgU3RyaW5nLnN1YiBuYW1lIDAgKG4gKyAxKVxuICBpblxuICBpZiBuYW1lID0gXCJcIlxuICB0aGVuIGN1cnJlbnRfZGlyX25hbWVcbiAgZWxzZSB0cmFpbGluZ19zZXAgKFN0cmluZy5sZW5ndGggbmFtZSAtIDEpXG5cbm1vZHVsZSB0eXBlIFNZU0RFUFMgPSBzaWdcbiAgdmFsIG51bGwgOiBzdHJpbmdcbiAgdmFsIGN1cnJlbnRfZGlyX25hbWUgOiBzdHJpbmdcbiAgdmFsIHBhcmVudF9kaXJfbmFtZSA6IHN0cmluZ1xuICB2YWwgZGlyX3NlcCA6IHN0cmluZ1xuICB2YWwgaXNfZGlyX3NlcCA6IHN0cmluZyAtPiBpbnQgLT4gYm9vbFxuICB2YWwgaXNfcmVsYXRpdmUgOiBzdHJpbmcgLT4gYm9vbFxuICB2YWwgaXNfaW1wbGljaXQgOiBzdHJpbmcgLT4gYm9vbFxuICB2YWwgY2hlY2tfc3VmZml4IDogc3RyaW5nIC0+IHN0cmluZyAtPiBib29sXG4gIHZhbCBjaG9wX3N1ZmZpeF9vcHQgOiBzdWZmaXg6c3RyaW5nIC0+IHN0cmluZyAtPiBzdHJpbmcgb3B0aW9uXG4gIHZhbCB0ZW1wX2Rpcl9uYW1lIDogc3RyaW5nXG4gIHZhbCBxdW90ZSA6IHN0cmluZyAtPiBzdHJpbmdcbiAgdmFsIHF1b3RlX2NvbW1hbmQgOlxuICAgIHN0cmluZyAtPiA/c3RkaW46IHN0cmluZyAtPiA/c3Rkb3V0OiBzdHJpbmcgLT4gP3N0ZGVycjogc3RyaW5nXG4gICAgICAgICAgIC0+IHN0cmluZyBsaXN0IC0+IHN0cmluZ1xuICB2YWwgYmFzZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nXG4gIHZhbCBkaXJuYW1lIDogc3RyaW5nIC0+IHN0cmluZ1xuZW5kXG5cbm1vZHVsZSBVbml4IDogU1lTREVQUyA9IHN0cnVjdFxuICBsZXQgbnVsbCA9IFwiL2Rldi9udWxsXCJcbiAgbGV0IGN1cnJlbnRfZGlyX25hbWUgPSBcIi5cIlxuICBsZXQgcGFyZW50X2Rpcl9uYW1lID0gXCIuLlwiXG4gIGxldCBkaXJfc2VwID0gXCIvXCJcbiAgbGV0IGlzX2Rpcl9zZXAgcyBpID0gcy5baV0gPSAnLydcbiAgbGV0IGlzX3JlbGF0aXZlIG4gPSBTdHJpbmcubGVuZ3RoIG4gPCAxIHx8IG4uWzBdIDw+ICcvJ1xuICBsZXQgaXNfaW1wbGljaXQgbiA9XG4gICAgaXNfcmVsYXRpdmUgblxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuL1wiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAzIHx8IFN0cmluZy5zdWIgbiAwIDMgPD4gXCIuLi9cIilcbiAgbGV0IGNoZWNrX3N1ZmZpeCBuYW1lIHN1ZmYgPVxuICAgIFN0cmluZy5lbmRzX3dpdGggfnN1ZmZpeDpzdWZmIG5hbWVcblxuICBsZXQgY2hvcF9zdWZmaXhfb3B0IH5zdWZmaXggZmlsZW5hbWUgPVxuICAgIGxldCBsZW5fcyA9IFN0cmluZy5sZW5ndGggc3VmZml4IGFuZCBsZW5fZiA9IFN0cmluZy5sZW5ndGggZmlsZW5hbWUgaW5cbiAgICBpZiBsZW5fZiA+PSBsZW5fcyB0aGVuXG4gICAgICBsZXQgciA9IFN0cmluZy5zdWIgZmlsZW5hbWUgKGxlbl9mIC0gbGVuX3MpIGxlbl9zIGluXG4gICAgICBpZiByID0gc3VmZml4IHRoZW5cbiAgICAgICAgU29tZSAoU3RyaW5nLnN1YiBmaWxlbmFtZSAwIChsZW5fZiAtIGxlbl9zKSlcbiAgICAgIGVsc2VcbiAgICAgICAgTm9uZVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuICBsZXQgdGVtcF9kaXJfbmFtZSA9XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJUTVBESVJcIiB3aXRoIE5vdF9mb3VuZCAtPiBcIi90bXBcIlxuICBsZXQgcXVvdGUgPSBnZW5lcmljX3F1b3RlIFwiJ1xcXFwnJ1wiXG4gIGxldCBxdW90ZV9jb21tYW5kIGNtZCA/c3RkaW4gP3N0ZG91dCA/c3RkZXJyIGFyZ3MgPVxuICAgIFN0cmluZy5jb25jYXQgXCIgXCIgKExpc3QubWFwIHF1b3RlIChjbWQgOjogYXJncykpXG4gICAgXiAobWF0Y2ggc3RkaW4gIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiIDxcIiBeIHF1b3RlIGYpXG4gICAgXiAobWF0Y2ggc3Rkb3V0IHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiID5cIiBeIHF1b3RlIGYpXG4gICAgXiAobWF0Y2ggc3RkZXJyIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IGlmIHN0ZGVyciA9IHN0ZG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBcIiAyPiYxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXCIgMj5cIiBeIHF1b3RlIGYpXG4gIGxldCBiYXNlbmFtZSA9IGdlbmVyaWNfYmFzZW5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG4gIGxldCBkaXJuYW1lID0gZ2VuZXJpY19kaXJuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZVxuZW5kXG5cbm1vZHVsZSBXaW4zMiA6IFNZU0RFUFMgPSBzdHJ1Y3RcbiAgbGV0IG51bGwgPSBcIk5VTFwiXG4gIGxldCBjdXJyZW50X2Rpcl9uYW1lID0gXCIuXCJcbiAgbGV0IHBhcmVudF9kaXJfbmFtZSA9IFwiLi5cIlxuICBsZXQgZGlyX3NlcCA9IFwiXFxcXFwiXG4gIGxldCBpc19kaXJfc2VwIHMgaSA9IGxldCBjID0gcy5baV0gaW4gYyA9ICcvJyB8fCBjID0gJ1xcXFwnIHx8IGMgPSAnOidcbiAgbGV0IGlzX3JlbGF0aXZlIG4gPVxuICAgIChTdHJpbmcubGVuZ3RoIG4gPCAxIHx8IG4uWzBdIDw+ICcvJylcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMSB8fCBuLlswXSA8PiAnXFxcXCcpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDIgfHwgbi5bMV0gPD4gJzonKVxuICBsZXQgaXNfaW1wbGljaXQgbiA9XG4gICAgaXNfcmVsYXRpdmUgblxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuL1wiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuXFxcXFwiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAzIHx8IFN0cmluZy5zdWIgbiAwIDMgPD4gXCIuLi9cIilcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMyB8fCBTdHJpbmcuc3ViIG4gMCAzIDw+IFwiLi5cXFxcXCIpXG4gIGxldCBjaGVja19zdWZmaXggbmFtZSBzdWZmID1cbiAgIFN0cmluZy5sZW5ndGggbmFtZSA+PSBTdHJpbmcubGVuZ3RoIHN1ZmYgJiZcbiAgIChsZXQgcyA9IFN0cmluZy5zdWIgbmFtZSAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gU3RyaW5nLmxlbmd0aCBzdWZmKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcubGVuZ3RoIHN1ZmYpIGluXG4gICAgU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSBzID0gU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSBzdWZmKVxuXG4gIGxldCBjaG9wX3N1ZmZpeF9vcHQgfnN1ZmZpeCBmaWxlbmFtZSA9XG4gICAgbGV0IGxlbl9zID0gU3RyaW5nLmxlbmd0aCBzdWZmaXggYW5kIGxlbl9mID0gU3RyaW5nLmxlbmd0aCBmaWxlbmFtZSBpblxuICAgIGlmIGxlbl9mID49IGxlbl9zIHRoZW5cbiAgICAgIGxldCByID0gU3RyaW5nLnN1YiBmaWxlbmFtZSAobGVuX2YgLSBsZW5fcykgbGVuX3MgaW5cbiAgICAgIGlmIFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgciA9IFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgc3VmZml4IHRoZW5cbiAgICAgICAgU29tZSAoU3RyaW5nLnN1YiBmaWxlbmFtZSAwIChsZW5fZiAtIGxlbl9zKSlcbiAgICAgIGVsc2VcbiAgICAgICAgTm9uZVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuXG4gIGxldCB0ZW1wX2Rpcl9uYW1lID1cbiAgICB0cnkgU3lzLmdldGVudiBcIlRFTVBcIiB3aXRoIE5vdF9mb3VuZCAtPiBcIi5cIlxuICBsZXQgcXVvdGUgcyA9XG4gICAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKGwgKyAyMCkgaW5cbiAgICBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIic7XG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IGwgdGhlbiBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIicgZWxzZVxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnXFxcIicgLT4gbG9vcF9icyAwIGk7XG4gICAgICB8ICdcXFxcJyAtPiBsb29wX2JzIDAgaTtcbiAgICAgIHwgYyAgICAtPiBCdWZmZXIuYWRkX2NoYXIgYiBjOyBsb29wIChpKzEpO1xuICAgIGFuZCBsb29wX2JzIG4gaSA9XG4gICAgICBpZiBpID0gbCB0aGVuIGJlZ2luXG4gICAgICAgIEJ1ZmZlci5hZGRfY2hhciBiICdcXFwiJztcbiAgICAgICAgYWRkX2JzIG47XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICAgIHwgJ1xcXCInIC0+IGFkZF9icyAoMipuKzEpOyBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIic7IGxvb3AgKGkrMSk7XG4gICAgICAgIHwgJ1xcXFwnIC0+IGxvb3BfYnMgKG4rMSkgKGkrMSk7XG4gICAgICAgIHwgXyAgICAtPiBhZGRfYnMgbjsgbG9vcCBpXG4gICAgICBlbmRcbiAgICBhbmQgYWRkX2JzIG4gPSBmb3IgX2ogPSAxIHRvIG4gZG8gQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXFwnOyBkb25lXG4gICAgaW5cbiAgICBsb29wIDA7XG4gICAgQnVmZmVyLmNvbnRlbnRzIGJcbigqXG5RdW90aW5nIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYnkgY21kLmV4ZSBpcyBkaWZmaWN1bHQuXG4xLSBFYWNoIGFyZ3VtZW50IGlzIGZpcnN0IHF1b3RlZCB1c2luZyB0aGUgXCJxdW90ZVwiIGZ1bmN0aW9uIGFib3ZlLCB0b1xuICAgcHJvdGVjdCBpdCBhZ2FpbnN0IHRoZSBwcm9jZXNzaW5nIHBlcmZvcm1lZCBieSB0aGUgQyBydW50aW1lIHN5c3RlbSxcbiAgIHRoZW4gY21kLmV4ZSdzIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB3aXRoICdeJywgdXNpbmdcbiAgIHRoZSBcInF1b3RlX2NtZFwiIGZ1bmN0aW9uIGJlbG93LiAgRm9yIG1vcmUgZGV0YWlscywgc2VlXG4gICBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS90d2lzdHlsaXR0bGVwYXNzYWdlc2FsbGFsaWtlLzIwMTEvMDQvMjNcbjItIFRoZSBjb21tYW5kIGFuZCB0aGUgcmVkaXJlY3Rpb24gZmlsZXMsIGlmIGFueSwgbXVzdCBiZSBkb3VibGUtcXVvdGVkXG4gICBpbiBjYXNlIHRoZXkgY29udGFpbiBzcGFjZXMuICBUaGlzIHF1b3RpbmcgaXMgaW50ZXJwcmV0ZWQgYnkgY21kLmV4ZSxcbiAgIG5vdCBieSB0aGUgQyBydW50aW1lIHN5c3RlbSwgaGVuY2UgdGhlIFwicXVvdGVcIiBmdW5jdGlvbiBhYm92ZVxuICAgY2Fubm90IGJlIHVzZWQuICBUaGUgdHdvIGNoYXJhY3RlcnMgd2UgZG9uJ3Qga25vdyBob3cgdG8gcXVvdGVcbiAgIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgY21kLmV4ZSBzdHJpbmcgYXJlIGRvdWJsZS1xdW90ZSBhbmQgcGVyY2VudC5cbiAgIFdlIGp1c3QgZmFpbCBpZiB0aGUgY29tbWFuZCBuYW1lIG9yIHRoZSByZWRpcmVjdGlvbiBmaWxlIG5hbWVzXG4gICBjb250YWluIGEgZG91YmxlIHF1b3RlIChub3QgYWxsb3dlZCBpbiBXaW5kb3dzIGZpbGUgbmFtZXMsIGFueXdheSlcbiAgIG9yIGEgcGVyY2VudC4gIFNlZSBmdW5jdGlvbiBcInF1b3RlX2NtZF9maWxlbmFtZVwiIGJlbG93LlxuMy0gVGhlIHdob2xlIHN0cmluZyBwYXNzZWQgdG8gU3lzLmNvbW1hbmQgaXMgdGhlbiBlbmNsb3NlZCBpbiBkb3VibGVcbiAgIHF1b3Rlcywgd2hpY2ggYXJlIGltbWVkaWF0ZWx5IHN0cmlwcGVkIGJ5IGNtZC5leGUuICBPdGhlcndpc2UsXG4gICBzb21lIG9mIHRoZSBkb3VibGUgcXVvdGVzIGZyb20gc3RlcCAyIGFib3ZlIGNhbiBiZSBtaXNwYXJzZWQuXG4gICBTZWUgZS5nLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTk2NTE0MVxuKilcbiAgbGV0IHF1b3RlX2NtZCBzID1cbiAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKFN0cmluZy5sZW5ndGggcyArIDIwKSBpblxuICAgIFN0cmluZy5pdGVyXG4gICAgICAoZnVuIGMgLT5cbiAgICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICAgIHwgJygnIHwgJyknIHwgJyEnIHwgJ14nIHwgJyUnIHwgJ1xcXCInIHwgJzwnIHwgJz4nIHwgJyYnIHwgJ3wnIC0+XG4gICAgICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYiAnXic7IEJ1ZmZlci5hZGRfY2hhciBiIGNcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYiBjKVxuICAgICAgcztcbiAgICBCdWZmZXIuY29udGVudHMgYlxuICBsZXQgcXVvdGVfY21kX2ZpbGVuYW1lIGYgPVxuICAgIGlmIFN0cmluZy5jb250YWlucyBmICdcXFwiJyB8fCBTdHJpbmcuY29udGFpbnMgZiAnJScgdGhlblxuICAgICAgZmFpbHdpdGggKFwiRmlsZW5hbWUucXVvdGVfY29tbWFuZDogYmFkIGZpbGUgbmFtZSBcIiBeIGYpXG4gICAgZWxzZSBpZiBTdHJpbmcuY29udGFpbnMgZiAnICcgdGhlblxuICAgICAgXCJcXFwiXCIgXiBmIF4gXCJcXFwiXCJcbiAgICBlbHNlXG4gICAgICBmXG4gICgqIFJlZGlyZWN0aW9ucyBpbiBjbWQuZXhlOiBzZWUgaHR0cHM6Ly9zczY0LmNvbS9udC9zeW50YXgtcmVkaXJlY3Rpb24uaHRtbFxuICAgICBhbmQgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcHJldmlvdXMtdmVyc2lvbnMvd2luZG93cy9pdC1wcm8vd2luZG93cy14cC9iYjQ5MDk4Mih2PXRlY2huZXQuMTApXG4gICopXG4gIGxldCBxdW90ZV9jb21tYW5kIGNtZCA/c3RkaW4gP3N0ZG91dCA/c3RkZXJyIGFyZ3MgPVxuICAgIFN0cmluZy5jb25jYXQgXCJcIiBbXG4gICAgICBcIlxcXCJcIjtcbiAgICAgIHF1b3RlX2NtZF9maWxlbmFtZSBjbWQ7XG4gICAgICBcIiBcIjtcbiAgICAgIHF1b3RlX2NtZCAoU3RyaW5nLmNvbmNhdCBcIiBcIiAoTGlzdC5tYXAgcXVvdGUgYXJncykpO1xuICAgICAgKG1hdGNoIHN0ZGluICB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBcIiA8XCIgXiBxdW90ZV9jbWRfZmlsZW5hbWUgZik7XG4gICAgICAobWF0Y2ggc3Rkb3V0IHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiID5cIiBeIHF1b3RlX2NtZF9maWxlbmFtZSBmKTtcbiAgICAgIChtYXRjaCBzdGRlcnIgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdGRlcnIgPSBzdGRvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIFwiIDI+JjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXCIgMj5cIiBeIHF1b3RlX2NtZF9maWxlbmFtZSBmKTtcbiAgICAgIFwiXFxcIlwiXG4gICAgXVxuICBsZXQgaGFzX2RyaXZlIHMgPVxuICAgIGxldCBpc19sZXR0ZXIgPSBmdW5jdGlvblxuICAgICAgfCAnQScgLi4gJ1onIHwgJ2EnIC4uICd6JyAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcbiAgICBpblxuICAgIFN0cmluZy5sZW5ndGggcyA+PSAyICYmIGlzX2xldHRlciBzLlswXSAmJiBzLlsxXSA9ICc6J1xuICBsZXQgZHJpdmVfYW5kX3BhdGggcyA9XG4gICAgaWYgaGFzX2RyaXZlIHNcbiAgICB0aGVuIChTdHJpbmcuc3ViIHMgMCAyLCBTdHJpbmcuc3ViIHMgMiAoU3RyaW5nLmxlbmd0aCBzIC0gMikpXG4gICAgZWxzZSAoXCJcIiwgcylcbiAgbGV0IGRpcm5hbWUgcyA9XG4gICAgbGV0IChkcml2ZSwgcGF0aCkgPSBkcml2ZV9hbmRfcGF0aCBzIGluXG4gICAgbGV0IGRpciA9IGdlbmVyaWNfZGlybmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgcGF0aCBpblxuICAgIGRyaXZlIF4gZGlyXG4gIGxldCBiYXNlbmFtZSBzID1cbiAgICBsZXQgKF9kcml2ZSwgcGF0aCkgPSBkcml2ZV9hbmRfcGF0aCBzIGluXG4gICAgZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgcGF0aFxuZW5kXG5cbm1vZHVsZSBDeWd3aW4gOiBTWVNERVBTID0gc3RydWN0XG4gIGxldCBudWxsID0gXCIvZGV2L251bGxcIlxuICBsZXQgY3VycmVudF9kaXJfbmFtZSA9IFwiLlwiXG4gIGxldCBwYXJlbnRfZGlyX25hbWUgPSBcIi4uXCJcbiAgbGV0IGRpcl9zZXAgPSBcIi9cIlxuICBsZXQgaXNfZGlyX3NlcCA9IFdpbjMyLmlzX2Rpcl9zZXBcbiAgbGV0IGlzX3JlbGF0aXZlID0gV2luMzIuaXNfcmVsYXRpdmVcbiAgbGV0IGlzX2ltcGxpY2l0ID0gV2luMzIuaXNfaW1wbGljaXRcbiAgbGV0IGNoZWNrX3N1ZmZpeCA9IFdpbjMyLmNoZWNrX3N1ZmZpeFxuICBsZXQgY2hvcF9zdWZmaXhfb3B0ID0gV2luMzIuY2hvcF9zdWZmaXhfb3B0XG4gIGxldCB0ZW1wX2Rpcl9uYW1lID0gVW5peC50ZW1wX2Rpcl9uYW1lXG4gIGxldCBxdW90ZSA9IFVuaXgucXVvdGVcbiAgbGV0IHF1b3RlX2NvbW1hbmQgPSBVbml4LnF1b3RlX2NvbW1hbmRcbiAgbGV0IGJhc2VuYW1lID0gZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWVcbiAgbGV0IGRpcm5hbWUgPSBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG5lbmRcblxubW9kdWxlIFN5c2RlcHMgPVxuICAodmFsIChtYXRjaCBTeXMub3NfdHlwZSB3aXRoXG4gICAgICAgfCBcIldpbjMyXCIgLT4gKG1vZHVsZSBXaW4zMjogU1lTREVQUylcbiAgICAgICB8IFwiQ3lnd2luXCIgLT4gKG1vZHVsZSBDeWd3aW46IFNZU0RFUFMpXG4gICAgICAgfCBfIC0+IChtb2R1bGUgVW5peDogU1lTREVQUykpKVxuXG5pbmNsdWRlIFN5c2RlcHNcblxubGV0IGNvbmNhdCBkaXJuYW1lIGZpbGVuYW1lID1cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIGRpcm5hbWUgaW5cbiAgaWYgbCA9IDAgfHwgaXNfZGlyX3NlcCBkaXJuYW1lIChsLTEpXG4gIHRoZW4gZGlybmFtZSBeIGZpbGVuYW1lXG4gIGVsc2UgZGlybmFtZSBeIGRpcl9zZXAgXiBmaWxlbmFtZVxuXG5sZXQgY2hvcF9zdWZmaXggbmFtZSBzdWZmID1cbiAgaWYgY2hlY2tfc3VmZml4IG5hbWUgc3VmZlxuICB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBTdHJpbmcubGVuZ3RoIHN1ZmYpXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJGaWxlbmFtZS5jaG9wX3N1ZmZpeFwiXG5cbmxldCBleHRlbnNpb25fbGVuIG5hbWUgPVxuICBsZXQgcmVjIGNoZWNrIGkwIGkgPVxuICAgIGlmIGkgPCAwIHx8IGlzX2Rpcl9zZXAgbmFtZSBpIHRoZW4gMFxuICAgIGVsc2UgaWYgbmFtZS5baV0gPSAnLicgdGhlbiBjaGVjayBpMCAoaSAtIDEpXG4gICAgZWxzZSBTdHJpbmcubGVuZ3RoIG5hbWUgLSBpMFxuICBpblxuICBsZXQgcmVjIHNlYXJjaF9kb3QgaSA9XG4gICAgaWYgaSA8IDAgfHwgaXNfZGlyX3NlcCBuYW1lIGkgdGhlbiAwXG4gICAgZWxzZSBpZiBuYW1lLltpXSA9ICcuJyB0aGVuIGNoZWNrIGkgKGkgLSAxKVxuICAgIGVsc2Ugc2VhcmNoX2RvdCAoaSAtIDEpXG4gIGluXG4gIHNlYXJjaF9kb3QgKFN0cmluZy5sZW5ndGggbmFtZSAtIDEpXG5cbmxldCBleHRlbnNpb24gbmFtZSA9XG4gIGxldCBsID0gZXh0ZW5zaW9uX2xlbiBuYW1lIGluXG4gIGlmIGwgPSAwIHRoZW4gXCJcIiBlbHNlIFN0cmluZy5zdWIgbmFtZSAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gbCkgbFxuXG5sZXQgY2hvcF9leHRlbnNpb24gbmFtZSA9XG4gIGxldCBsID0gZXh0ZW5zaW9uX2xlbiBuYW1lIGluXG4gIGlmIGwgPSAwIHRoZW4gaW52YWxpZF9hcmcgXCJGaWxlbmFtZS5jaG9wX2V4dGVuc2lvblwiXG4gIGVsc2UgU3RyaW5nLnN1YiBuYW1lIDAgKFN0cmluZy5sZW5ndGggbmFtZSAtIGwpXG5cbmxldCByZW1vdmVfZXh0ZW5zaW9uIG5hbWUgPVxuICBsZXQgbCA9IGV4dGVuc2lvbl9sZW4gbmFtZSBpblxuICBpZiBsID0gMCB0aGVuIG5hbWUgZWxzZSBTdHJpbmcuc3ViIG5hbWUgMCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gbClcblxuZXh0ZXJuYWwgb3Blbl9kZXNjOiBzdHJpbmcgLT4gb3Blbl9mbGFnIGxpc3QgLT4gaW50IC0+IGludCA9IFwiY2FtbF9zeXNfb3BlblwiXG5leHRlcm5hbCBjbG9zZV9kZXNjOiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2xvc2VcIlxuXG5sZXQgcHJuZyA9IGxhenkoUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0ICgpKVxuXG5sZXQgdGVtcF9maWxlX25hbWUgdGVtcF9kaXIgcHJlZml4IHN1ZmZpeCA9XG4gIGxldCBybmQgPSAoUmFuZG9tLlN0YXRlLmJpdHMgKExhenkuZm9yY2UgcHJuZykpIGxhbmQgMHhGRkZGRkYgaW5cbiAgY29uY2F0IHRlbXBfZGlyIChQcmludGYuc3ByaW50ZiBcIiVzJTA2eCVzXCIgcHJlZml4IHJuZCBzdWZmaXgpXG5cblxubGV0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZSA9IHJlZiB0ZW1wX2Rpcl9uYW1lXG5cbmxldCBzZXRfdGVtcF9kaXJfbmFtZSBzID0gY3VycmVudF90ZW1wX2Rpcl9uYW1lIDo9IHNcbmxldCBnZXRfdGVtcF9kaXJfbmFtZSAoKSA9ICFjdXJyZW50X3RlbXBfZGlyX25hbWVcblxubGV0IHRlbXBfZmlsZSA/KHRlbXBfZGlyID0gIWN1cnJlbnRfdGVtcF9kaXJfbmFtZSkgcHJlZml4IHN1ZmZpeCA9XG4gIGxldCByZWMgdHJ5X25hbWUgY291bnRlciA9XG4gICAgbGV0IG5hbWUgPSB0ZW1wX2ZpbGVfbmFtZSB0ZW1wX2RpciBwcmVmaXggc3VmZml4IGluXG4gICAgdHJ5XG4gICAgICBjbG9zZV9kZXNjKG9wZW5fZGVzYyBuYW1lIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl9leGNsXSAwbzYwMCk7XG4gICAgICBuYW1lXG4gICAgd2l0aCBTeXNfZXJyb3IgXyBhcyBlIC0+XG4gICAgICBpZiBjb3VudGVyID49IDEwMDAgdGhlbiByYWlzZSBlIGVsc2UgdHJ5X25hbWUgKGNvdW50ZXIgKyAxKVxuICBpbiB0cnlfbmFtZSAwXG5cbmxldCBvcGVuX3RlbXBfZmlsZSA/KG1vZGUgPSBbT3Blbl90ZXh0XSkgPyhwZXJtcyA9IDBvNjAwKVxuICAgICAgICAgICAgICAgICAgID8odGVtcF9kaXIgPSAhY3VycmVudF90ZW1wX2Rpcl9uYW1lKSBwcmVmaXggc3VmZml4ID1cbiAgbGV0IHJlYyB0cnlfbmFtZSBjb3VudGVyID1cbiAgICBsZXQgbmFtZSA9IHRlbXBfZmlsZV9uYW1lIHRlbXBfZGlyIHByZWZpeCBzdWZmaXggaW5cbiAgICB0cnlcbiAgICAgIChuYW1lLFxuICAgICAgIG9wZW5fb3V0X2dlbiAoT3Blbl93cm9ubHk6Ok9wZW5fY3JlYXQ6Ok9wZW5fZXhjbDo6bW9kZSkgcGVybXMgbmFtZSlcbiAgICB3aXRoIFN5c19lcnJvciBfIGFzIGUgLT5cbiAgICAgIGlmIGNvdW50ZXIgPj0gMTAwMCB0aGVuIHJhaXNlIGUgZWxzZSB0cnlfbmFtZSAoY291bnRlciArIDEpXG4gIGluIHRyeV9uYW1lIDBcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQ29tcGxleCBudW1iZXJzICopXG5cbnR5cGUgdCA9IHsgcmU6IGZsb2F0OyBpbTogZmxvYXQgfVxuXG5sZXQgemVybyA9IHsgcmUgPSAwLjA7IGltID0gMC4wIH1cbmxldCBvbmUgPSB7IHJlID0gMS4wOyBpbSA9IDAuMCB9XG5sZXQgaSA9IHsgcmUgPSAwLjA7IGltID0gMS4wIH1cblxubGV0IGFkZCB4IHkgPSB7IHJlID0geC5yZSArLiB5LnJlOyBpbSA9IHguaW0gKy4geS5pbSB9XG5cbmxldCBzdWIgeCB5ID0geyByZSA9IHgucmUgLS4geS5yZTsgaW0gPSB4LmltIC0uIHkuaW0gfVxuXG5sZXQgbmVnIHggPSB7IHJlID0gLS4geC5yZTsgaW0gPSAtLiB4LmltIH1cblxubGV0IGNvbmogeCA9IHsgcmUgPSB4LnJlOyBpbSA9IC0uIHguaW0gfVxuXG5sZXQgbXVsIHggeSA9IHsgcmUgPSB4LnJlICouIHkucmUgLS4geC5pbSAqLiB5LmltO1xuICAgICAgICAgICAgICAgIGltID0geC5yZSAqLiB5LmltICsuIHguaW0gKi4geS5yZSB9XG5cbmxldCBkaXYgeCB5ID1cbiAgaWYgYWJzX2Zsb2F0IHkucmUgPj0gYWJzX2Zsb2F0IHkuaW0gdGhlblxuICAgIGxldCByID0geS5pbSAvLiB5LnJlIGluXG4gICAgbGV0IGQgPSB5LnJlICsuIHIgKi4geS5pbSBpblxuICAgIHsgcmUgPSAoeC5yZSArLiByICouIHguaW0pIC8uIGQ7XG4gICAgICBpbSA9ICh4LmltIC0uIHIgKi4geC5yZSkgLy4gZCB9XG4gIGVsc2VcbiAgICBsZXQgciA9IHkucmUgLy4geS5pbSBpblxuICAgIGxldCBkID0geS5pbSArLiByICouIHkucmUgaW5cbiAgICB7IHJlID0gKHIgKi4geC5yZSArLiB4LmltKSAvLiBkO1xuICAgICAgaW0gPSAociAqLiB4LmltIC0uIHgucmUpIC8uIGQgfVxuXG5sZXQgaW52IHggPSBkaXYgb25lIHhcblxubGV0IG5vcm0yIHggPSB4LnJlICouIHgucmUgKy4geC5pbSAqLiB4LmltXG5cbmxldCBub3JtIHggPVxuICAoKiBXYXRjaCBvdXQgZm9yIG92ZXJmbG93IGluIGNvbXB1dGluZyByZV4yICsgaW1eMiAqKVxuICBsZXQgciA9IGFic19mbG9hdCB4LnJlIGFuZCBpID0gYWJzX2Zsb2F0IHguaW0gaW5cbiAgaWYgciA9IDAuMCB0aGVuIGlcbiAgZWxzZSBpZiBpID0gMC4wIHRoZW4gclxuICBlbHNlIGlmIHIgPj0gaSB0aGVuXG4gICAgbGV0IHEgPSBpIC8uIHIgaW4gciAqLiBzcXJ0KDEuMCArLiBxICouIHEpXG4gIGVsc2VcbiAgICBsZXQgcSA9IHIgLy4gaSBpbiBpICouIHNxcnQoMS4wICsuIHEgKi4gcSlcblxubGV0IGFyZyB4ID0gYXRhbjIgeC5pbSB4LnJlXG5cbmxldCBwb2xhciBuIGEgPSB7IHJlID0gY29zIGEgKi4gbjsgaW0gPSBzaW4gYSAqLiBuIH1cblxubGV0IHNxcnQgeCA9XG4gIGlmIHgucmUgPSAwLjAgJiYgeC5pbSA9IDAuMCB0aGVuIHsgcmUgPSAwLjA7IGltID0gMC4wIH1cbiAgZWxzZSBiZWdpblxuICAgIGxldCByID0gYWJzX2Zsb2F0IHgucmUgYW5kIGkgPSBhYnNfZmxvYXQgeC5pbSBpblxuICAgIGxldCB3ID1cbiAgICAgIGlmIHIgPj0gaSB0aGVuIGJlZ2luXG4gICAgICAgIGxldCBxID0gaSAvLiByIGluXG4gICAgICAgIHNxcnQocikgKi4gc3FydCgwLjUgKi4gKDEuMCArLiBzcXJ0KDEuMCArLiBxICouIHEpKSlcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBxID0gciAvLiBpIGluXG4gICAgICAgIHNxcnQoaSkgKi4gc3FydCgwLjUgKi4gKHEgKy4gc3FydCgxLjAgKy4gcSAqLiBxKSkpXG4gICAgICBlbmQgaW5cbiAgICBpZiB4LnJlID49IDAuMFxuICAgIHRoZW4geyByZSA9IHc7ICBpbSA9IDAuNSAqLiB4LmltIC8uIHcgfVxuICAgIGVsc2UgeyByZSA9IDAuNSAqLiBpIC8uIHc7ICBpbSA9IGlmIHguaW0gPj0gMC4wIHRoZW4gdyBlbHNlIC0uIHcgfVxuICBlbmRcblxubGV0IGV4cCB4ID1cbiAgbGV0IGUgPSBleHAgeC5yZSBpbiB7IHJlID0gZSAqLiBjb3MgeC5pbTsgaW0gPSBlICouIHNpbiB4LmltIH1cblxubGV0IGxvZyB4ID0geyByZSA9IGxvZyAobm9ybSB4KTsgaW0gPSBhdGFuMiB4LmltIHgucmUgfVxuXG5sZXQgcG93IHggeSA9IGV4cCAobXVsIHkgKGxvZyB4KSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUGFkZGluZyBwb3NpdGlvbi4gKilcbnR5cGUgcGFkdHkgPVxuICB8IExlZnQgICAoKiBUZXh0IGlzIGxlZnQganVzdGlmaWVkICgnLScgb3B0aW9uKS4gICAgICAgICAgICAgICAqKVxuICB8IFJpZ2h0ICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCAobm8gJy0nIG9wdGlvbikuICAgICAgICAgICAqKVxuICB8IFplcm9zICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCBieSB6ZXJvcyAoc2VlICcwJyBvcHRpb24pLiAqKVxuXG4oKioqKVxuXG4oKiBJbnRlZ2VyIGNvbnZlcnNpb24uICopXG50eXBlIGludF9jb252ID1cbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCAgICAgICAgKCogICVkIHwgJStkIHwgJSBkICAqKVxuICB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpICAgICAgICAoKiAgJWkgfCAlK2kgfCAlIGkgICopXG4gIHwgSW50X3ggfCBJbnRfQ3ggICAgICAgICAgICAgICAgICgqICAleCB8ICUjeCAgICAgICAgKilcbiAgfCBJbnRfWCB8IEludF9DWCAgICAgICAgICAgICAgICAgKCogICVYIHwgJSNYICAgICAgICAqKVxuICB8IEludF9vIHwgSW50X0NvICAgICAgICAgICAgICAgICAoKiAgJW8gfCAlI28gICAgICAgICopXG4gIHwgSW50X3UgICAgICAgICAgICAgICAgICAgICAgICAgICgqICAldSAgICAgICAgICAgICAgKilcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgICAgICAgKCogICUjZCB8ICUjaSB8ICUjdSAqKVxuXG4oKiBGbG9hdCBjb252ZXJzaW9uLiAqKVxudHlwZSBmbG9hdF9mbGFnX2NvbnYgPVxuICB8IEZsb2F0X2ZsYWdfICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcCAgICAgICAgICAgICAgICAgICAoKiAlK1tmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3MgICAgICAgICAgICAgICAgICAgKCogJSBbZmVFZ0dGaEhdICopXG50eXBlIGZsb2F0X2tpbmRfY29udiA9XG4gIHwgRmxvYXRfZiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZiB8ICUrZiB8ICUgZiAgKilcbiAgfCBGbG9hdF9lICAgICAgICAgICAgICAgICAgICAgICAgKCogICVlIHwgJStlIHwgJSBlICAqKVxuICB8IEZsb2F0X0UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUUgfCAlK0UgfCAlIEUgICopXG4gIHwgRmxvYXRfZyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZyB8ICUrZyB8ICUgZyAgKilcbiAgfCBGbG9hdF9HICAgICAgICAgICAgICAgICAgICAgICAgKCogICVHIHwgJStHIHwgJSBHICAqKVxuICB8IEZsb2F0X0YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUYgfCAlK0YgfCAlIEYgICopXG4gIHwgRmxvYXRfaCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlaCB8ICUraCB8ICUgaCAgKilcbiAgfCBGbG9hdF9IICAgICAgICAgICAgICAgICAgICAgICAgKCogICVIIHwgJStIIHwgJSBIICAqKVxuICB8IEZsb2F0X0NGICAgICAgICAgICAgICAgICAgICAgICAoKiAgJSNGfCAlKyNGfCAlICNGICopXG50eXBlIGZsb2F0X2NvbnYgPSBmbG9hdF9mbGFnX2NvbnYgKiBmbG9hdF9raW5kX2NvbnZcblxuKCoqKilcblxuKCogQ2hhciBzZXRzIChzZWUgJVsuLi5dKSBhcmUgYml0bWFwcyBpbXBsZW1lbnRlZCBhcyAzMi1jaGFyIHN0cmluZ3MuICopXG50eXBlIGNoYXJfc2V0ID0gc3RyaW5nXG5cbigqKiopXG5cbigqIENvdW50ZXIgdXNlZCBpbiBTY2FuZi4gKilcbnR5cGUgY291bnRlciA9XG4gIHwgTGluZV9jb3VudGVyICAgICAoKiAgJWwgICAgICAqKVxuICB8IENoYXJfY291bnRlciAgICAgKCogICVuICAgICAgKilcbiAgfCBUb2tlbl9jb3VudGVyICAgICgqICAlTiwgJUwgICopXG5cbigqKiopXG5cbigqIFBhZGRpbmcgb2Ygc3RyaW5ncyBhbmQgbnVtYmVycy4gKilcbnR5cGUgKCdhLCAnYikgcGFkZGluZyA9XG4gICgqIE5vIHBhZGRpbmcgKGV4OiBcIiVkXCIpICopXG4gIHwgTm9fcGFkZGluZyAgOiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIExpdGVyYWwgcGFkZGluZyAoZXg6IFwiJThkXCIpICopXG4gIHwgTGl0X3BhZGRpbmcgOiBwYWR0eSAqIGludCAtPiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIFBhZGRpbmcgYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqZFwiKSAqKVxuICB8IEFyZ19wYWRkaW5nIDogcGFkdHkgLT4gKGludCAtPiAnYSwgJ2EpIHBhZGRpbmdcblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZCxcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwYWRkaW5nIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHBhZF9vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIFByZWNpc2lvbiBvZiBmbG9hdHMgYW5kICcwJy1wYWRkaW5nIG9mIGludGVnZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwcmVjaXNpb24gPVxuICAoKiBObyBwcmVjaXNpb24gKGV4OiBcIiVmXCIpICopXG4gIHwgTm9fcHJlY2lzaW9uIDogKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIExpdGVyYWwgcHJlY2lzaW9uIChleDogXCIlLjNmXCIpICopXG4gIHwgTGl0X3ByZWNpc2lvbiA6IGludCAtPiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogUHJlY2lzaW9uIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpICopXG4gIHwgQXJnX3ByZWNpc2lvbiA6IChpbnQgLT4gJ2EsICdhKSBwcmVjaXNpb25cblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZixcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwcmVjaXNpb24gb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcHJlY19vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIHNlZSB0aGUgQ3VzdG9tIGZvcm1hdCBjb21iaW5hdG9yICopXG50eXBlICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgPVxuICB8IEN1c3RvbV96ZXJvIDogKCdhLCBzdHJpbmcsICdhKSBjdXN0b21fYXJpdHlcbiAgfCBDdXN0b21fc3VjYyA6ICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgLT5cbiAgICAoJ2EsICd4IC0+ICdiLCAneCAtPiAnYykgY3VzdG9tX2FyaXR5XG5cbigqKiopXG5cbigqICAgICAgICBSZWxhdGlvbmFsIGZvcm1hdCB0eXBlc1xuXG5JbiB0aGUgZmlyc3QgZm9ybWF0K2dhZHRzIGltcGxlbWVudGF0aW9uLCB0aGUgdHlwZSBmb3IgJSguLiUpIGluIHRoZVxuZm10IEdBRFQgd2FzIGFzIGZvbGxvd3M6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKiAoJ2QxLCAncTEsICdkMiwgJ3EyKSByZWFkZXJfbmJfdW5pZmllciAqXG4gICAgKCd4LCAnYiwgJ2MsICdkMSwgJ3ExLCAndSkgZm10dHkgKlxuICAgICgndSwgJ2IsICdjLCAncTEsICdlMSwgJ2YpIGZtdCAtPlxuICAgICAgKCgneCwgJ2IsICdjLCAnZDIsICdxMiwgJ3UpIGZvcm1hdDYgLT4gJ3gsICdiLCAnYywgJ2QxLCAnZTEsICdmKSBmbXRcblxuTm90aWNlIHRoYXQgdGhlICd1IHBhcmFtZXRlciBpbiAnZiBwb3NpdGlvbiBpbiB0aGUgZm9ybWF0IGFyZ3VtZW50XG4oKCd4LCAuLiwgJ3UpIGZvcm1hdDYgLT4gLi4pIGlzIGVxdWFsIHRvIHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2FcbnBvc2l0aW9uIGluIHRoZSBmb3JtYXQgdGFpbCAoKCd1LCAuLiwgJ2YpIGZtdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbnR5cGUgb2YgdGhlIGV4cGVjdGVkIGZvcm1hdCBwYXJhbWV0ZXIgZGVwZW5kcyBvZiB3aGVyZSB0aGUgJSguLi4lKVxuYXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nOlxuXG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSlcIlxuICAtIDogKHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IHVuaXRcbiAgPSA8ZnVuPlxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpJWRcIlxuICAtIDogKGludCAtPiB1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIGludCAtPiB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gaW50IC0+IHVuaXRcbiAgPSA8ZnVuPlxuXG5PbiB0aGUgY29udHJhcnksIHRoZSBsZWdhY3kgdHlwZXIgZ2l2ZXMgYSBjbGV2ZXIgdHlwZSB0aGF0IGRvZXMgbm90XG5kZXBlbmQgb24gdGhlIHBvc2l0aW9uIG9mICUoLi4lKSBpbiB0aGUgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGUsXG4lKCUpIHdpbGwgaGF2ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSk6IGl0IGNhblxuYmUgY29uY2F0ZW5hdGVkIHRvIGFueSBmb3JtYXQgdHlwZSwgYW5kIG9ubHkgZW5mb3JjZXMgdGhlIGNvbnN0cmFpbnRcbnRoYXQgaXRzICdhIGFuZCAnZiBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAobm8gZm9ybWF0IGFyZ3VtZW50cykgYW5kICdkXG5hbmQgJ2UgYXJlIGVxdWFsIChubyByZWFkZXIgYXJndW1lbnQpLlxuXG5UaGUgd2Vha2VuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIEdBRFQgdmVyc2lvbiBicm9rZSB1c2VyXG5jb2RlIChpbiBmYWN0IGl0IGVzc2VudGlhbGx5IG1hZGUgJSguLi4lKSB1bnVzYWJsZSBleGNlcHQgYXQgdGhlIGxhc3RcbnBvc2l0aW9uIG9mIGEgZm9ybWF0KS4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB3b3VsZCBub3Qgd29ya1xuYW55bW9yZTpcblxuICBmdW4gc2VwIC0+XG4gICAgRm9ybWF0LnByaW50ZiBcImZvbyUoJSliYXIlKCUpYmF6XCIgc2VwIHNlcFxuXG5BcyB0aGUgdHlwZS1jaGVja2VyIHdvdWxkIHJlcXVpcmUgdHdvICppbmNvbXBhdGlibGUqIHR5cGVzIGZvciB0aGUgJSglKVxuaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cblxuVGhlIHNvbHV0aW9uIHRvIHJlZ2FpbiBhIGdlbmVyYWwgdHlwZSBmb3IgJSguLiUpIGlzIHRvIGdlbmVyYWxpemUgdGhpc1xudGVjaG5pcXVlLCBub3Qgb25seSBvbiB0aGUgJ2QsICdlIHBhcmFtZXRlcnMsIGJ1dCBvbiBhbGwgc2l4XG5wYXJhbWV0ZXJzIG9mIGEgZm9ybWF0OiB3ZSBpbnRyb2R1Y2UgYSBcInJlbGF0aW9uYWxcIiB0eXBlXG4gICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG53aG9zZSB2YWx1ZXMgYXJlIHByb29mcyB0aGF0ICgnYTEsIC4uLCAnZjEpIGFuZCAoJ2EyLCAuLiwgJ2YyKSBtb3JhbGx5XG5jb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvcm1hdCB0eXBlOiAnYTEgaXMgb2J0YWluZWQgZnJvbSAnZjEsJ2IxLCdjMVxuaW4gdGhlIGV4YWN0IHNhbWUgd2F5IHRoYXQgJ2EyIGlzIG9idGFpbmVkIGZyb20gJ2YyLCdiMiwnYzIsIGV0Yy5cblxuRm9yIGV4YW1wbGUsIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHR3byBmb3JtYXQgdHlwZXMgYmVnaW5uaW5nIHdpdGggYSBDaGFyXG5wYXJhbWV0ZXIgaXMgYXMgZm9sbG93czpcblxufCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbkluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB0ZXJtIHN0cnVjdHVyZSBvZiBmbXR0eV9yZWwgaXMgKGFsbW9zdFsxXSlcbmlzb21vcnBoaWMgdG8gdGhlIGZtdHR5IG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbjogZXZlcnlcbmNvbnN0cnVjdG9yIGlzIHJlLXJlYWQgd2l0aCBhIGJpbmFyeSwgcmVsYXRpb25hbCB0eXBlLCBpbnN0ZWFkIG9mIHRoZVxucHJldmlvdXMgdW5hcnkgdHlwaW5nLiBmbXR0eSBjYW4gdGhlbiBiZSByZS1kZWZpbmVkIGFzIHRoZSBkaWFnb25hbCBvZlxuZm10dHlfcmVsOlxuXG4gIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5cbk9uY2Ugd2UgaGF2ZSB0aGlzIGZtdHR5X3JlbCB0eXBlIGluIHBsYWNlLCB3ZSBjYW4gZ2l2ZSB0aGUgbW9yZVxuZ2VuZXJhbCB0eXBlIHRvICUoLi4uJSk6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG5XZSBhY2NlcHQgYW55IGZvcm1hdCAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYpICh0aGlzIGlzXG5jb21wbGV0ZWx5IHVucmVsYXRlZCB0byB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmb3JtYXQpLCBidXQgYWxzb1xucmVxdWlyZSBhIHByb29mIHRoYXQgdGhpcyBmb3JtYXQgaXMgaW4gcmVsYXRpb24gdG8gYW5vdGhlciBmb3JtYXQgdGhhdFxuaXMgY29uY2F0ZW5hYmxlIHRvIHRoZSBmb3JtYXQgdGFpbC4gV2hlbiBleGVjdXRpbmcgYSAlKC4uLiUpIGZvcm1hdFxuKGluIGNhbWxpbnRlcm5hbEZvcm1hdC5tbDptYWtlX3ByaW50ZiBvciBzY2FuZi5tbDptYWtlX3NjYW5mKSwgd2VcbnRyYW5zdHlwZSB0aGUgZm9ybWF0IGFsb25nIHRoaXMgcmVsYXRpb24gdXNpbmcgdGhlICdyZWNhc3QnIGZ1bmN0aW9uXG50byB0cmFuc3Bvc2UgYmV0d2VlbiByZWxhdGVkIGZvcm1hdCB0eXBlcy5cblxuICB2YWwgcmVjYXN0IDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEpIGZtdFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10XG5cbk5PVEUgWzFdOiB0aGUgdHlwaW5nIG9mIEZvcm1hdF9zdWJzdF90eSByZXF1aXJlcyBub3Qgb25lIGZvcm1hdCB0eXBlLCBidXRcbnR3bywgb25lIHRvIGVzdGFibGlzaCB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXQgYXJndW1lbnQgYW5kIHRoZVxuZmlyc3Qgc2l4IHBhcmFtZXRlcnMsIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdFxuYXJndW1lbnQgYW5kIHRoZSBsYXN0IHNpeCBwYXJhbWV0ZXJzLlxuXG58IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuV2hlbiB3ZSBnZW5lcmF0ZSBhIGZvcm1hdCBBU1QsIHdlIGdlbmVyYXRlIGV4YWN0bHkgdGhlIHNhbWUgd2l0bmVzc1xuZm9yIGJvdGggcmVsYXRpb25zLCBhbmQgdGhlIHdpdG5lc3MtY29udmVyc2lvbiBmdW5jdGlvbnMgaW5cbmNhbWxpbnRlcm5hbEZvcm1hdCBkbyByZWx5IG9uIHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSwgdGhlXG5mdW5jdGlvbiB0aGF0IHByb3ZlcyB0aGF0IHRoZSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlXG5cbiAgdmFsIHRyYW5zIDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcblxuZG9lcyBhc3N1bWUgdGhhdCB0aGUgdHdvIGlucHV0cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdGVybSBzdHJ1Y3R1cmVcbihhbmQgaXMgb25seSBldmVyeSB1c2VkIGZvciBhcmd1bWVudCB3aXRuZXNzZXMgb2YgdGhlXG5Gb3JtYXRfc3Vic3RfdHkgY29uc3RydWN0b3IpLlxuKilcblxuKCogVHlwZSBvZiBhIGJsb2NrIHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCAgICgqIEhvcml6b250YWwgYmxvY2sgbm8gbGluZSBicmVha2luZyAqKVxuICB8IFBwX3Zib3ggICAoKiBWZXJ0aWNhbCBibG9jayBlYWNoIGJyZWFrIGxlYWRzIHRvIGEgbmV3IGxpbmUgKilcbiAgfCBQcF9odmJveCAgKCogSG9yaXpvbnRhbC12ZXJ0aWNhbCBibG9jazogc2FtZSBhcyB2Ym94LCBleGNlcHQgaWYgdGhpcyBibG9ja1xuICAgICAgICAgICAgICAgICBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUgKilcbiAgfCBQcF9ob3Zib3ggKCogSG9yaXpvbnRhbCBvciBWZXJ0aWNhbCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgKilcbiAgfCBQcF9ib3ggICAgKCogSG9yaXpvbnRhbCBvciBJbmRlbnQgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrLCBvclxuICAgICAgICAgICAgICAgICB3aGVuIGl0IGxlYWRzIHRvIGEgbmV3IGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgKilcbiAgfCBQcF9maXRzICAgKCogSW50ZXJuYWwgdXNhZ2U6IHdoZW4gYSBibG9jayBmaXRzIG9uIGEgc2luZ2xlIGxpbmUgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgZm9ybWF0dGluZ19saXQgPVxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXSAgICopXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEB9ICAgKilcbiAgfCBCcmVhayBvZiBzdHJpbmcgKiBpbnQgKiBpbnQgICAgICAgICAgKCogQCwgfCBAICB8IEA7IHwgQDs8PiAqKVxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPyAgICopXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBcXG4gICopXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAuICAgKilcbiAgfCBNYWdpY19zaXplIG9mIHN0cmluZyAqIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQDxuPiAqKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAQCAgICopXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAlJSAgKilcbiAgfCBTY2FuX2luZGljIG9mIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFggICAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW4gPVxuICB8IE9wZW5fdGFnIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAeyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG4gIHwgT3Blbl9ib3ggOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEBbICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgdHlwZSBlbGVtZW50cy4gKilcbigqIEluIHBhcnRpY3VsYXIgdXNlZCB0byByZXByZXNlbnQgJSguLi4lKSBhbmQgJXsuLi4lfSBjb250ZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuYW5kICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgPVxuICB8IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFN0cmluZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKHN0cmluZyAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIHN0cmluZyAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50MzJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50MzIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQzMiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBOYXRpdmVpbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5kICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChuYXRpdmVpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBuYXRpdmVpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50NjRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50NjQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQ2NCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBGbG9hdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWYgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChmbG9hdCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGZsb2F0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEJvb2xfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGJvb2wgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBib29sIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRm9ybWF0X2FyZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuICB8IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzLiAqKVxuICB8IEFscGhhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ3ggLT4gJ2MxKSAtPiAneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ3ggLT4gJ2MyKSAtPiAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBUaGV0YV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICdjMSkgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICdjMikgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQW55X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBVc2VkIGZvciBjdXN0b20gZm9ybWF0cyAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRW5kX29mX2ZtdHR5IDpcbiAgICAgICgnZjEsICdiMSwgJ2MxLCAnZDEsICdkMSwgJ2YxLFxuICAgICAgICdmMiwgJ2IyLCAnYzIsICdkMiwgJ2QyLCAnZjIpIGZtdHR5X3JlbFxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCBlbGVtZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ID1cbiAgfCBDaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlUyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQzMiAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IE5hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgbmF0aXZlaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQ2NCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gICAgICBmbG9hdF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgZmxvYXQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBCb29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2JCXSAqKVxuICAgICAgKCd4LCBib29sIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmx1c2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogYWJjICopXG4gICAgICBzdHJpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDaGFyX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiB4ICopXG4gICAgICBjaGFyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBGb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgQWxwaGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAneCAtPiAnYykgLT4gJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgVGhldGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAnYykgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICBmb3JtYXR0aW5nX2xpdCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdHRpbmdfZ2VuIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgKCdhMSwgJ2IsICdjLCAnZDEsICdlMSwgJ2YxKSBmb3JtYXR0aW5nX2dlbiAqXG4gICAgICAoJ2YxLCAnYiwgJ2MsICdlMSwgJ2UyLCAnZjIpIGZtdCAtPiAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UyLCAnZjIpIGZtdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3ggLT4gJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKHN0cmluZyAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW25sTkxdICopXG4gICAgICBjb3VudGVyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoaW50IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUwYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSWdub3JlZF9wYXJhbSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8gKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBpZ25vcmVkICogKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogQ3VzdG9tIHByaW50aW5nIGZvcm1hdCAoUFIjNjQ1MiwgR1BSIzE0MClcblxuICAgICBXZSBpbmNsdWRlIGEgdHlwZSBDdXN0b20gb2YgXCJjdXN0b20gY29udmVydGVyc1wiLCB3aGVyZSBhblxuICAgICBhcmJpdHJhcnkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgb3IgbW9yZVxuICAgICBhcmd1bWVudHMuIFRoZXJlIGlzIG5vIHN5bnRheCBmb3IgY3VzdG9tIGNvbnZlcnRlcnMsIGl0IGlzIG9ubHlcbiAgICAgaW50ZW5kZWQgZm9yIGN1c3RvbSBwcm9jZXNzb3JzIHRoYXQgd2lzaCB0byByZWx5IG9uIHRoZVxuICAgICBzdGRsaWItZGVmaW5lZCBmb3JtYXQgR0FEVHMuXG5cbiAgICAgRm9yIGluc3RhbmNlIGEgcHJlLXByb2Nlc3NvciBjb3VsZCBjaG9vc2UgdG8gaW50ZXJwcmV0IHN0cmluZ3NcbiAgICAgcHJlZml4ZWQgd2l0aCBbXCIhXCJdIGFzIGZvcm1hdCBzdHJpbmdzIHdoZXJlIFsle3sgLi4uIH19XSBpc1xuICAgICBhIHNwZWNpYWwgZm9ybSB0byBwYXNzIGEgdG9fc3RyaW5nIGZ1bmN0aW9uLCBzbyB0aGF0IG9uZSBjb3VsZFxuICAgICB3cml0ZTpcblxuICAgICB7W1xuICAgICAgIHR5cGUgdCA9IHsgeCA6IGludDsgeSA6IGludCB9XG5cbiAgICAgICBsZXQgc3RyaW5nX29mX3QgdCA9IFByaW50Zi5zcHJpbnRmIFwieyB4ID0gJWQ7IHkgPSAlZCB9XCIgdC54IHQueVxuXG4gICAgICAgUHJpbnRmLnByaW50ZiAhXCJ0ID0gJXt7c3RyaW5nX29mX3R9fVwiIHsgeCA9IDQyOyB5ID0gNDIgfVxuICAgICBdfVxuICAqKVxuICB8IEN1c3RvbSA6XG4gICAgICAoJ2EsICd4LCAneSkgY3VzdG9tX2FyaXR5ICogKHVuaXQgLT4gJ3gpICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIGVuZCBvZiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICopXG4gIHwgRW5kX29mX2Zvcm1hdCA6XG4gICAgICAgICgnZiwgJ2IsICdjLCAnZSwgJ2UsICdmKSBmbXRcblxuKCoqKilcblxuKCogVHlwZSBmb3IgaWdub3JlZCBwYXJhbWV0ZXJzIChzZWUgXCIlX1wiKS4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZCA9XG4gIHwgSWdub3JlZF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9jICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2QgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfbmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbmQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfTGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZiAqKVxuICAgICAgcGFkX29wdGlvbiAqIHByZWNfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9ib29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9CICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV97Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZFxuICB8IElnbm9yZWRfcmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfW25sTkxdICopXG4gICAgICBjb3VudGVyIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8wYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcblxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgKiBzdHJpbmdcblxubGV0IHJlYyBlcmFzZV9yZWwgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYsXG4gICBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5XG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCBfdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTEsIGVyYXNlX3JlbCByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBlIGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdCB0eXBlcy4gKilcbigqIFVzZWQgYnk6XG4gICAqIHJlYWRlcl9uYl91bmlmaWVyX29mX2ZtdHR5IHRvIGNvdW50IHJlYWRlcnMgaW4gYW4gZm10dHksXG4gICAqIFNjYW5mLnRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgdG8gZXh0cmFjdCByZWFkZXJzIGluc2lkZSAlKC4uLiUpLFxuICAgKiBDYW1saW50ZXJuYWxGb3JtYXQuZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgdG8gZXh0cmFjdCBmb3JtYXQgdHlwZS4gKilcblxuKCpcbmxldCByZWMgY29uY2F0X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXR0eSA9XG4qKVxubGV0IHJlYyBjb25jYXRfZm10dHkgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgICAgICBnMSBqMSBnMiBqMlxuICAuXG4gICAgKGcxLCBiMSwgYzEsIGoxLCBkMSwgYTEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBkMiwgYTIpIGZtdHR5X3JlbCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGUxLCBmMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGUyLCBmMikgZm10dHlfcmVsID1cbmZ1biBmbXR0eTEgZm10dHkyIC0+IG1hdGNoIGZtdHR5MSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBFbmRfb2ZfZm10dHkgLT4gZm10dHkyXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0cy4gKilcbmxldCByZWMgY29uY2F0X2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXQgPVxuZnVuIGZtdDEgZm10MiAtPiBtYXRjaCBmbXQxIHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBTdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBDYW1sX3N0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDMyIChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgQ2hhciAocmVzdCkgLT5cbiAgICBDaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIENhbWxfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIEJvb2wgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIEFscGhhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgVGhldGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgQ3VzdG9tIChhcml0eSwgZiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgUmVhZGVyIHJlc3QgLT5cbiAgICBSZWFkZXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBGbHVzaCAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZ19saXRlcmFsIChzdHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIENoYXJfbGl0ZXJhbCAgIChjaHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnICAgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fbmV4dF9jaGFyIChyZXN0KSAtPlxuICAgIFNjYW5fbmV4dF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgSWdub3JlZF9wYXJhbSAoaWduLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgZm10MlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgR2FicmllbCBTY2hlcmVyLCBwcm9qZXQgUGFydG91dCwgSU5SSUEgUGFyaXMtU2FjbGF5ICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDYW1saW50ZXJuYWxBdG9taWMgaXMgYSBkZXBlbmRlbmN5IG9mIFN0ZGxpYiwgc28gaXQgaXMgY29tcGlsZWQgd2l0aFxuICAgLW5vcGVydmFzaXZlcy4gKilcbmV4dGVybmFsICggPT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcVwiXG5leHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiBXZSBhcmUgbm90IHJldXNpbmcgKCdhIHJlZikgZGlyZWN0bHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhc29uXG4gICBhYm91dCBhdG9taWNpdHkgaWYgd2Ugd2lzaCB0bzogZXZlbiBpbiBhIHNlcXVlbnRpYWwgaW1wbGVtZW50YXRpb24sXG4gICBzaWduYWxzIGFuZCBvdGhlciBhc3luY2hyb25vdXMgY2FsbGJhY2tzIG1pZ2h0IGJyZWFrIGF0b21pY2l0eS4gKilcbnR5cGUgJ2EgdCA9IHttdXRhYmxlIHY6ICdhfVxuXG5sZXQgbWFrZSB2ID0ge3Z9XG5sZXQgZ2V0IHIgPSByLnZcbmxldCBzZXQgciB2ID0gci52IDwtIHZcblxuKCogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHNldCB0byBuZXZlciBiZSBpbmxpbmVkOiBGbGFtYmRhIGlzXG4gICBhbGxvd2VkIHRvIG1vdmUgc3Vycm91bmRpbmcgY29kZSBpbnNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24sXG4gICBpbmNsdWRpbmcgYWxsb2NhdGlvbnMuICopXG5cbmxldFtAaW5saW5lIG5ldmVyXSBleGNoYW5nZSByIHYgPVxuICAoKiBCRUdJTiBBVE9NSUMgKilcbiAgbGV0IGN1ciA9IHIudiBpblxuICByLnYgPC0gdjtcbiAgKCogRU5EIEFUT01JQyAqKVxuICBjdXJcblxubGV0W0BpbmxpbmUgbmV2ZXJdIGNvbXBhcmVfYW5kX3NldCByIHNlZW4gdiA9XG4gICgqIEJFR0lOIEFUT01JQyAqKVxuICBsZXQgY3VyID0gci52IGluXG4gIGlmIGN1ciA9PSBzZWVuIHRoZW4gKFxuICAgIHIudiA8LSB2O1xuICAgICgqIEVORCBBVE9NSUMgKilcbiAgICB0cnVlXG4gICkgZWxzZVxuICAgIGZhbHNlXG5cbmxldFtAaW5saW5lIG5ldmVyXSBmZXRjaF9hbmRfYWRkIHIgbiA9XG4gICgqIEJFR0lOIEFUT01JQyAqKVxuICBsZXQgY3VyID0gci52IGluXG4gIHIudiA8LSAoY3VyICsgbik7XG4gICgqIEVORCBBVE9NSUMgKilcbiAgY3VyXG5cbmxldCBpbmNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAxKVxubGV0IGRlY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByICgtMSkpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEV4Y2VwdGlvbnMgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICAoKiBmb3IgcnVudGltZS9mYWlsX25hdC5jICopXG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIFwiUGVydmFzaXZlcy5hcnJheV9ib3VuZF9lcnJvclwiXG4gICAgKEludmFsaWRfYXJndW1lbnQgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpXG5cbmV4dGVybmFsIHJhaXNlIDogZXhuIC0+ICdhID0gXCIlcmFpc2VcIlxuZXh0ZXJuYWwgcmFpc2Vfbm90cmFjZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlX25vdHJhY2VcIlxuXG5sZXQgZmFpbHdpdGggcyA9IHJhaXNlKEZhaWx1cmUgcylcbmxldCBpbnZhbGlkX2FyZyBzID0gcmFpc2UoSW52YWxpZF9hcmd1bWVudCBzKVxuXG5leGNlcHRpb24gRXhpdFxuZXhjZXB0aW9uIE1hdGNoX2ZhaWx1cmUgPSBNYXRjaF9mYWlsdXJlXG5leGNlcHRpb24gQXNzZXJ0X2ZhaWx1cmUgPSBBc3NlcnRfZmFpbHVyZVxuZXhjZXB0aW9uIEludmFsaWRfYXJndW1lbnQgPSBJbnZhbGlkX2FyZ3VtZW50XG5leGNlcHRpb24gRmFpbHVyZSA9IEZhaWx1cmVcbmV4Y2VwdGlvbiBOb3RfZm91bmQgPSBOb3RfZm91bmRcbmV4Y2VwdGlvbiBPdXRfb2ZfbWVtb3J5ID0gT3V0X29mX21lbW9yeVxuZXhjZXB0aW9uIFN0YWNrX292ZXJmbG93ID0gU3RhY2tfb3ZlcmZsb3dcbmV4Y2VwdGlvbiBTeXNfZXJyb3IgPSBTeXNfZXJyb3JcbmV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSA9IEVuZF9vZl9maWxlXG5leGNlcHRpb24gRGl2aXNpb25fYnlfemVybyA9IERpdmlzaW9uX2J5X3plcm9cbmV4Y2VwdGlvbiBTeXNfYmxvY2tlZF9pbyA9IFN5c19ibG9ja2VkX2lvXG5leGNlcHRpb24gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgPSBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuXG4oKiBDb21wb3NpdGlvbiBvcGVyYXRvcnMgKilcblxuZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcbmV4dGVybmFsICggQEAgKSA6ICgnYSAtPiAnYikgLT4gJ2EgLT4gJ2IgPSBcIiVhcHBseVwiXG5cbigqIERlYnVnZ2luZyAqKVxuXG5leHRlcm5hbCBfX0xPQ19fIDogc3RyaW5nID0gXCIlbG9jX0xPQ1wiXG5leHRlcm5hbCBfX0ZJTEVfXyA6IHN0cmluZyA9IFwiJWxvY19GSUxFXCJcbmV4dGVybmFsIF9fTElORV9fIDogaW50ID0gXCIlbG9jX0xJTkVcIlxuZXh0ZXJuYWwgX19NT0RVTEVfXyA6IHN0cmluZyA9IFwiJWxvY19NT0RVTEVcIlxuZXh0ZXJuYWwgX19QT1NfXyA6IHN0cmluZyAqIGludCAqIGludCAqIGludCA9IFwiJWxvY19QT1NcIlxuZXh0ZXJuYWwgX19GVU5DVElPTl9fIDogc3RyaW5nID0gXCIlbG9jX0ZVTkNUSU9OXCJcblxuZXh0ZXJuYWwgX19MT0NfT0ZfXyA6ICdhIC0+IHN0cmluZyAqICdhID0gXCIlbG9jX0xPQ1wiXG5leHRlcm5hbCBfX0xJTkVfT0ZfXyA6ICdhIC0+IGludCAqICdhID0gXCIlbG9jX0xJTkVcIlxuZXh0ZXJuYWwgX19QT1NfT0ZfXyA6ICdhIC0+IChzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQpICogJ2EgPSBcIiVsb2NfUE9TXCJcblxuKCogQ29tcGFyaXNvbnMgKilcblxuZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZXh0ZXJuYWwgKCA8PiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcbmV4dGVybmFsICggPCApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbmV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbmV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuZXh0ZXJuYWwgKCA+PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5leHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbmxldCBtaW4geCB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuZXh0ZXJuYWwgKCA9PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxXCJcbmV4dGVybmFsICggIT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcVwiXG5cbigqIEJvb2xlYW4gb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcbmV4dGVybmFsICggJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5leHRlcm5hbCAoIG9yICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG5leHRlcm5hbCAoIHx8ICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG5cbigqIEludGVnZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tICkgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcbmV4dGVybmFsICggfisgKSA6IGludCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBzdWNjIDogaW50IC0+IGludCA9IFwiJXN1Y2NpbnRcIlxuZXh0ZXJuYWwgcHJlZCA6IGludCAtPiBpbnQgPSBcIiVwcmVkaW50XCJcbmV4dGVybmFsICggKyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgKCAtICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXN1YmludFwiXG5leHRlcm5hbCAoICogKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbmV4dGVybmFsICggLyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgKCBtb2QgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbW9kaW50XCJcblxubGV0IGFicyB4ID0gaWYgeCA+PSAwIHRoZW4geCBlbHNlIC14XG5cbmV4dGVybmFsICggbGFuZCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgKCBsb3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlb3JpbnRcIlxuZXh0ZXJuYWwgKCBseG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXhvcmludFwiXG5cbmxldCBsbm90IHggPSB4IGx4b3IgKC0xKVxuXG5leHRlcm5hbCAoIGxzbCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuZXh0ZXJuYWwgKCBsc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNyaW50XCJcbmV4dGVybmFsICggYXNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5cbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuXG4oKiBGbG9hdGluZy1wb2ludCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsICggfi0uICkgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJW5lZ2Zsb2F0XCJcbmV4dGVybmFsICggfisuICkgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsICggKy4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWRkZmxvYXRcIlxuZXh0ZXJuYWwgKCAtLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVzdWJmbG9hdFwiXG5leHRlcm5hbCAoICouICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJW11bGZsb2F0XCJcbmV4dGVybmFsICggLy4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlZGl2ZmxvYXRcIlxuZXh0ZXJuYWwgKCAqKiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBfZmxvYXRcIiBcImV4cFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zX2Zsb2F0XCIgXCJhY29zXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luX2Zsb2F0XCIgXCJhc2luXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuX2Zsb2F0XCIgXCJhdGFuXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbjJfZmxvYXRcIiBcImF0YW4yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGh5cG90IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgICAgICAgICAgICAgID0gXCJjYW1sX2h5cG90X2Zsb2F0XCIgXCJjYW1sX2h5cG90XCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc19mbG9hdFwiIFwiY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NoX2Zsb2F0XCIgXCJjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc2hfZmxvYXRcIiBcImNhbWxfYWNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMXAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxcF9mbG9hdFwiIFwiY2FtbF9sb2cxcFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5fZmxvYXRcIiBcInNpblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luaF9mbG9hdFwiIFwic2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNxcnQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zcXJ0X2Zsb2F0XCIgXCJzcXJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Rhbl9mbG9hdFwiIFwidGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5oX2Zsb2F0XCIgXCJ0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2VpbCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NlaWxfZmxvYXRcIiBcImNlaWxcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvb3IgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9vcl9mbG9hdFwiIFwiZmxvb3JcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5leHRlcm5hbCBjb3B5c2lnbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICAgICA9IFwiY2FtbF9jb3B5c2lnbl9mbG9hdFwiIFwiY2FtbF9jb3B5c2lnblwiXG4gICAgICAgICAgICAgICAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbW9kX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZm1vZF9mbG9hdFwiIFwiZm1vZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmcmV4cCA6IGZsb2F0IC0+IGZsb2F0ICogaW50ID0gXCJjYW1sX2ZyZXhwX2Zsb2F0XCJcbmV4dGVybmFsIGxkZXhwIDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IChpbnQgW0B1bnRhZ2dlZF0pIC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9sZGV4cF9mbG9hdFwiIFwiY2FtbF9sZGV4cF9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZGYgOiBmbG9hdCAtPiBmbG9hdCAqIGZsb2F0ID0gXCJjYW1sX21vZGZfZmxvYXRcIlxuZXh0ZXJuYWwgZmxvYXQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIGZsb2F0X29mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdHJ1bmNhdGUgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGludF9vZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuZXh0ZXJuYWwgZmxvYXRfb2ZfYml0cyA6IGludDY0IC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNcIiBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c191bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmxldCBpbmZpbml0eSA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMExcbmxldCBuZWdfaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4RkZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmFuID1cbiAgZmxvYXRfb2ZfYml0cyAweDdGX0YwXzAwXzAwXzAwXzAwXzAwXzAxTFxubGV0IG1heF9mbG9hdCA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9FRl9GRl9GRl9GRl9GRl9GRl9GRkxcbmxldCBtaW5fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4MDBfMTBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgZXBzaWxvbl9mbG9hdCA9XG4gIGZsb2F0X29mX2JpdHMgMHgzQ19CMF8wMF8wMF8wMF8wMF8wMF8wMExcblxudHlwZSBmcGNsYXNzID1cbiAgICBGUF9ub3JtYWxcbiAgfCBGUF9zdWJub3JtYWxcbiAgfCBGUF96ZXJvXG4gIHwgRlBfaW5maW5pdGVcbiAgfCBGUF9uYW5cbmV4dGVybmFsIGNsYXNzaWZ5X2Zsb2F0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGZwY2xhc3MgPVxuICBcImNhbWxfY2xhc3NpZnlfZmxvYXRcIiBcImNhbWxfY2xhc3NpZnlfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5cbigqIFN0cmluZyBhbmQgYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlcyBTdHJpbmcgYW5kIEJ5dGVzICopXG5cbmV4dGVybmFsIHN0cmluZ19sZW5ndGggOiBzdHJpbmcgLT4gaW50ID0gXCIlc3RyaW5nX2xlbmd0aFwiXG5leHRlcm5hbCBieXRlc19sZW5ndGggOiBieXRlcyAtPiBpbnQgPSBcIiVieXRlc19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBzdHJpbmdfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X3N0cmluZ1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBieXRlc19ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBieXRlc191bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcblxubGV0ICggXiApIHMxIHMyID1cbiAgbGV0IGwxID0gc3RyaW5nX2xlbmd0aCBzMSBhbmQgbDIgPSBzdHJpbmdfbGVuZ3RoIHMyIGluXG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIChsMSArIGwyKSBpblxuICBzdHJpbmdfYmxpdCBzMSAwIHMgMCBsMTtcbiAgc3RyaW5nX2JsaXQgczIgMCBzIGwxIGwyO1xuICBieXRlc191bnNhZmVfdG9fc3RyaW5nIHNcblxuKCogQ2hhcmFjdGVyIG9wZXJhdGlvbnMgLS0gbW9yZSBpbiBtb2R1bGUgQ2hhciAqKVxuXG5leHRlcm5hbCBpbnRfb2ZfY2hhciA6IGNoYXIgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdW5zYWZlX2NoYXJfb2ZfaW50IDogaW50IC0+IGNoYXIgPSBcIiVpZGVudGl0eVwiXG5sZXQgY2hhcl9vZl9pbnQgbiA9XG4gIGlmIG4gPCAwIHx8IG4gPiAyNTUgdGhlbiBpbnZhbGlkX2FyZyBcImNoYXJfb2ZfaW50XCIgZWxzZSB1bnNhZmVfY2hhcl9vZl9pbnQgblxuXG4oKiBVbml0IG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgaWdub3JlIDogJ2EgLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbigqIFBhaXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBmc3QgOiAnYSAqICdiIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsIHNuZCA6ICdhICogJ2IgLT4gJ2IgPSBcIiVmaWVsZDFcIlxuXG4oKiBSZWZlcmVuY2VzICopXG5cbnR5cGUgJ2EgcmVmID0geyBtdXRhYmxlIGNvbnRlbnRzIDogJ2EgfVxuZXh0ZXJuYWwgcmVmIDogJ2EgLT4gJ2EgcmVmID0gXCIlbWFrZW11dGFibGVcIlxuZXh0ZXJuYWwgKCAhICkgOiAnYSByZWYgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuZXh0ZXJuYWwgKCA6PSApIDogJ2EgcmVmIC0+ICdhIC0+IHVuaXQgPSBcIiVzZXRmaWVsZDBcIlxuZXh0ZXJuYWwgaW5jciA6IGludCByZWYgLT4gdW5pdCA9IFwiJWluY3JcIlxuZXh0ZXJuYWwgZGVjciA6IGludCByZWYgLT4gdW5pdCA9IFwiJWRlY3JcIlxuXG4oKiBSZXN1bHQgdHlwZSAqKVxuXG50eXBlICgnYSwnYikgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnYlxuXG4oKiBTdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMgKilcblxuZXh0ZXJuYWwgZm9ybWF0X2ludCA6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2Zsb2F0IDogc3RyaW5nIC0+IGZsb2F0IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfZmxvYXRcIlxuXG5sZXQgc3RyaW5nX29mX2Jvb2wgYiA9XG4gIGlmIGIgdGhlbiBcInRydWVcIiBlbHNlIFwiZmFsc2VcIlxubGV0IGJvb2xfb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgfCBcInRydWVcIiAtPiB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IGZhbHNlXG4gIHwgXyAtPiBpbnZhbGlkX2FyZyBcImJvb2xfb2Zfc3RyaW5nXCJcblxubGV0IGJvb2xfb2Zfc3RyaW5nX29wdCA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gU29tZSB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IFNvbWUgZmFsc2VcbiAgfCBfIC0+IE5vbmVcblxubGV0IHN0cmluZ19vZl9pbnQgbiA9XG4gIGZvcm1hdF9pbnQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5cbmxldCBpbnRfb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogcHJvdmlkZSB0aGlzIGRpcmVjdGx5IGFzIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlLiAqKVxuICB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmV4dGVybmFsIHN0cmluZ19nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuXG5sZXQgdmFsaWRfZmxvYXRfbGV4ZW0gcyA9XG4gIGxldCBsID0gc3RyaW5nX2xlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID49IGwgdGhlbiBzIF4gXCIuXCIgZWxzZVxuICAgIG1hdGNoIHN0cmluZ19nZXQgcyBpIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gbG9vcCAoaSArIDEpXG4gICAgfCBfIC0+IHNcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBzdHJpbmdfb2ZfZmxvYXQgZiA9IHZhbGlkX2Zsb2F0X2xleGVtIChmb3JtYXRfZmxvYXQgXCIlLjEyZ1wiIGYpXG5cbmV4dGVybmFsIGZsb2F0X29mX3N0cmluZyA6IHN0cmluZyAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdF9vZl9zdHJpbmdcIlxuXG5sZXQgZmxvYXRfb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogcHJvdmlkZSB0aGlzIGRpcmVjdGx5IGFzIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlLiAqKVxuICB0cnkgU29tZSAoZmxvYXRfb2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuKCogTGlzdCBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIExpc3QgKilcblxubGV0IHJlYyAoIEAgKSBsMSBsMiA9XG4gIG1hdGNoIGwxIHdpdGhcbiAgICBbXSAtPiBsMlxuICB8IGhkIDo6IHRsIC0+IGhkIDo6ICh0bCBAIGwyKVxuXG4oKiBJL08gb3BlcmF0aW9ucyAqKVxuXG50eXBlIGluX2NoYW5uZWxcbnR5cGUgb3V0X2NoYW5uZWxcblxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX291dCA6IGludCAtPiBvdXRfY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XCJcbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9pbiA6IGludCAtPiBpbl9jaGFubmVsID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblwiXG5cbmxldCBzdGRpbiA9IG9wZW5fZGVzY3JpcHRvcl9pbiAwXG5sZXQgc3Rkb3V0ID0gb3Blbl9kZXNjcmlwdG9yX291dCAxXG5sZXQgc3RkZXJyID0gb3Blbl9kZXNjcmlwdG9yX291dCAyXG5cbigqIEdlbmVyYWwgb3V0cHV0IGZ1bmN0aW9ucyAqKVxuXG50eXBlIG9wZW5fZmxhZyA9XG4gICAgT3Blbl9yZG9ubHkgfCBPcGVuX3dyb25seSB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdCB8IE9wZW5fdHJ1bmMgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeSB8IE9wZW5fdGV4dCB8IE9wZW5fbm9uYmxvY2tcblxuZXh0ZXJuYWwgb3Blbl9kZXNjIDogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuXG5leHRlcm5hbCBzZXRfb3V0X2NoYW5uZWxfbmFtZTogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX291dF9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9vdXQob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfb3V0X2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5fb3V0IG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX3RleHRdIDBvNjY2IG5hbWVcblxubGV0IG9wZW5fb3V0X2JpbiBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl9iaW5hcnldIDBvNjY2IG5hbWVcblxuZXh0ZXJuYWwgZmx1c2ggOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2ZsdXNoXCJcblxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxzX2xpc3QgOiB1bml0IC0+IG91dF9jaGFubmVsIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dF9jaGFubmVsc19saXN0XCJcblxubGV0IGZsdXNoX2FsbCAoKSA9XG4gIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICBbXSAtPiAoKVxuICAgIHwgYTo6bCAtPlxuICAgICAgICBiZWdpbiB0cnlcbiAgICAgICAgICAgIGZsdXNoIGFcbiAgICAgICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgICAgICgpICgqIGlnbm9yZSBjaGFubmVscyBjbG9zZWQgZHVyaW5nIGEgcHJlY2VkaW5nIGZsdXNoLiAqKVxuICAgICAgICBlbmQ7XG4gICAgICAgIGl0ZXIgbFxuICBpbiBpdGVyIChvdXRfY2hhbm5lbHNfbGlzdCAoKSlcblxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dCA6IG91dF9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dF9zdHJpbmcgOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBvdXRwdXRfY2hhciA6IG91dF9jaGFubmVsIC0+IGNoYXIgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5cbmxldCBvdXRwdXRfYnl0ZXMgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXQgb2MgcyAwIChieXRlc19sZW5ndGggcylcblxubGV0IG91dHB1dF9zdHJpbmcgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgMCAoc3RyaW5nX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0IG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0XCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0IG9jIHMgb2ZzIGxlblxuXG5sZXQgb3V0cHV0X3N1YnN0cmluZyBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gc3RyaW5nX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRfc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIG9mcyBsZW5cblxuZXh0ZXJuYWwgb3V0cHV0X2J5dGUgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5leHRlcm5hbCBvdXRwdXRfYmluYXJ5X2ludCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9pbnRcIlxuXG5leHRlcm5hbCBtYXJzaGFsX3RvX2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiB1bml0IGxpc3QgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxubGV0IG91dHB1dF92YWx1ZSBjaGFuIHYgPSBtYXJzaGFsX3RvX2NoYW5uZWwgY2hhbiB2IFtdXG5cbmV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRcIlxuZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3Nfb3V0XCJcbmV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2Vfb3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX291dCBvYyA9IGZsdXNoIG9jOyBjbG9zZV9vdXRfY2hhbm5lbCBvY1xubGV0IGNsb3NlX291dF9ub2VyciBvYyA9XG4gICh0cnkgZmx1c2ggb2Mgd2l0aCBfIC0+ICgpKTtcbiAgKHRyeSBjbG9zZV9vdXRfY2hhbm5lbCBvYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfb3V0IDogb3V0X2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIEdlbmVyYWwgaW5wdXQgZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIHNldF9pbl9jaGFubmVsX25hbWU6IGluX2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX2luX2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX2luKG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X2luX2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5faW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl90ZXh0XSAwIG5hbWVcblxubGV0IG9wZW5faW5fYmluIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fYmluYXJ5XSAwIG5hbWVcblxuZXh0ZXJuYWwgaW5wdXRfY2hhciA6IGluX2NoYW5uZWwgLT4gY2hhciA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2lucHV0IDogaW5fY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2lucHV0XCJcblxubGV0IGlucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYyB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gKCkgZWxzZSBiZWdpblxuICAgIGxldCByID0gdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlbiBpblxuICAgIGlmIHIgPSAwXG4gICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIChvZnMgKyByKSAobGVuIC0gcilcbiAgZW5kXG5cbmxldCByZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJyZWFsbHlfaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIGxlbiBpblxuICByZWFsbHlfaW5wdXQgaWMgcyAwIGxlbjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbmV4dGVybmFsIGlucHV0X3NjYW5fbGluZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X3NjYW5fbGluZVwiXG5cbmxldCBpbnB1dF9saW5lIGNoYW4gPVxuICBsZXQgcmVjIGJ1aWxkX3Jlc3VsdCBidWYgcG9zID0gZnVuY3Rpb25cbiAgICBbXSAtPiBidWZcbiAgfCBoZCA6OiB0bCAtPlxuICAgICAgbGV0IGxlbiA9IGJ5dGVzX2xlbmd0aCBoZCBpblxuICAgICAgYnl0ZXNfYmxpdCBoZCAwIGJ1ZiAocG9zIC0gbGVuKSBsZW47XG4gICAgICBidWlsZF9yZXN1bHQgYnVmIChwb3MgLSBsZW4pIHRsIGluXG4gIGxldCByZWMgc2NhbiBhY2N1IGxlbiA9XG4gICAgbGV0IG4gPSBpbnB1dF9zY2FuX2xpbmUgY2hhbiBpblxuICAgIGlmIG4gPSAwIHRoZW4gYmVnaW4gICAgICAgICAgICAgICAgICAgKCogbiA9IDA6IHdlIGFyZSBhdCBFT0YgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgfCBfICAtPiBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiBhY2N1XG4gICAgZW5kIGVsc2UgaWYgbiA+IDAgdGhlbiBiZWdpbiAgICAgICAgICAoKiBuID4gMDogbmV3bGluZSBmb3VuZCBpbiBidWZmZXIgKilcbiAgICAgIGxldCByZXMgPSBieXRlc19jcmVhdGUgKG4gLSAxKSBpblxuICAgICAgaWdub3JlICh1bnNhZmVfaW5wdXQgY2hhbiByZXMgMCAobiAtIDEpKTtcbiAgICAgIGlnbm9yZSAoaW5wdXRfY2hhciBjaGFuKTsgICAgICAgICAgICgqIHNraXAgdGhlIG5ld2xpbmUgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByZXNcbiAgICAgIHwgIF8gLT4gbGV0IGxlbiA9IGxlbiArIG4gLSAxIGluXG4gICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIChyZXMgOjogYWNjdSlcbiAgICBlbmQgZWxzZSBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICgqIG4gPCAwOiBuZXdsaW5lIG5vdCBmb3VuZCAqKVxuICAgICAgbGV0IGJlZyA9IGJ5dGVzX2NyZWF0ZSAoLW4pIGluXG4gICAgICBpZ25vcmUodW5zYWZlX2lucHV0IGNoYW4gYmVnIDAgKC1uKSk7XG4gICAgICBzY2FuIChiZWcgOjogYWNjdSkgKGxlbiAtIG4pXG4gICAgZW5kXG4gIGluIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgKHNjYW4gW10gMClcblxuZXh0ZXJuYWwgaW5wdXRfYnl0ZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuZXh0ZXJuYWwgaW5wdXRfYmluYXJ5X2ludCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2ludFwiXG5leHRlcm5hbCBpbnB1dF92YWx1ZSA6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pblwiXG5leHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3NfaW5cIlxuZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2VfaW5fbm9lcnIgaWMgPSAodHJ5IGNsb3NlX2luIGljIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9pbiA6IGluX2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBvdXRwdXQgKilcblxubGV0IHByaW50X2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZG91dCBjXG5sZXQgcHJpbnRfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzXG5sZXQgcHJpbnRfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRvdXQgc1xubGV0IHByaW50X2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmludF9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByaW50X2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3Rkb3V0IHM7IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5sZXQgcHJpbnRfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgZXJyb3IgKilcblxubGV0IHByZXJyX2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZGVyciBjXG5sZXQgcHJlcnJfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzXG5sZXQgcHJlcnJfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRlcnIgc1xubGV0IHByZXJyX2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmVycl9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByZXJyX2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3RkZXJyIHM7IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5sZXQgcHJlcnJfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5cbigqIElucHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBpbnB1dCAqKVxuXG5sZXQgcmVhZF9saW5lICgpID0gZmx1c2ggc3Rkb3V0OyBpbnB1dF9saW5lIHN0ZGluXG5sZXQgcmVhZF9pbnQgKCkgPSBpbnRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfaW50X29wdCAoKSA9IGludF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXQgKCkgPSBmbG9hdF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdF9vcHQgKCkgPSBmbG9hdF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxuXG4oKiBPcGVyYXRpb25zIG9uIGxhcmdlIGZpbGVzICopXG5cbm1vZHVsZSBMYXJnZUZpbGUgPVxuICBzdHJ1Y3RcbiAgICBleHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRfNjRcIlxuICAgIGV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3Nfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICAgIGV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pbl82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3NfaW5fNjRcIlxuICAgIGV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICBlbmRcblxuKCogRm9ybWF0cyAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuICAgPSBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mbXRcbiAgICAgICAgICAgICAgICogc3RyaW5nXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdjLCAnYywgJ2QpIGZvcm1hdDZcblxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5cbmxldCBzdHJpbmdfb2ZfZm9ybWF0IChGb3JtYXQgKF9mbXQsIHN0cikpID0gc3RyXG5cbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSBcIiVpZGVudGl0eVwiXG5cbmxldCAoIF5eICkgKEZvcm1hdCAoZm10MSwgc3RyMSkpIChGb3JtYXQgKGZtdDIsIHN0cjIpKSA9XG4gIEZvcm1hdCAoQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmNvbmNhdF9mbXQgZm10MSBmbXQyLFxuICAgICAgICAgIHN0cjEgXiBcIiUsXCIgXiBzdHIyKVxuXG4oKiBNaXNjZWxsYW5lb3VzICopXG5cbmV4dGVybmFsIHN5c19leGl0IDogaW50IC0+ICdhID0gXCJjYW1sX3N5c19leGl0XCJcblxubGV0IGV4aXRfZnVuY3Rpb24gPSBDYW1saW50ZXJuYWxBdG9taWMubWFrZSBmbHVzaF9hbGxcblxubGV0IHJlYyBhdF9leGl0IGYgPVxuICBsZXQgbW9kdWxlIEF0b21pYyA9IENhbWxpbnRlcm5hbEF0b21pYyBpblxuICAoKiBNUFIjNzI1MywgTVBSIzc3OTY6IG1ha2Ugc3VyZSBcImZcIiBpcyBleGVjdXRlZCBvbmx5IG9uY2UgKilcbiAgbGV0IGZfeWV0X3RvX3J1biA9IEF0b21pYy5tYWtlIHRydWUgaW5cbiAgbGV0IG9sZF9leGl0ID0gQXRvbWljLmdldCBleGl0X2Z1bmN0aW9uIGluXG4gIGxldCBuZXdfZXhpdCAoKSA9XG4gICAgaWYgQXRvbWljLmNvbXBhcmVfYW5kX3NldCBmX3lldF90b19ydW4gdHJ1ZSBmYWxzZSB0aGVuIGYgKCkgO1xuICAgIG9sZF9leGl0ICgpXG4gIGluXG4gIGxldCBzdWNjZXNzID0gQXRvbWljLmNvbXBhcmVfYW5kX3NldCBleGl0X2Z1bmN0aW9uIG9sZF9leGl0IG5ld19leGl0IGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gYXRfZXhpdCBmXG5cbmxldCBkb19hdF9leGl0ICgpID0gKENhbWxpbnRlcm5hbEF0b21pYy5nZXQgZXhpdF9mdW5jdGlvbikgKClcblxubGV0IGV4aXQgcmV0Y29kZSA9XG4gIGRvX2F0X2V4aXQgKCk7XG4gIHN5c19leGl0IHJldGNvZGVcblxubGV0IF8gPSByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuZG9fYXRfZXhpdFwiIGRvX2F0X2V4aXRcblxuZXh0ZXJuYWwgbWFqb3IgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfbWFqb3JcIlxuZXh0ZXJuYWwgbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCA6IHVuaXQgLT4gYm9vbFxuICA9IFwiY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZFwiXG5sZXQgKCkgPSBpZiBuYWtlZF9wb2ludGVyc19jaGVja2VkICgpIHRoZW4gYXRfZXhpdCBtYWpvclxuXG4oKk1PRFVMRV9BTElBU0VTKilcbm1vZHVsZSBBcmcgICAgICAgICAgPSBBcmdcbm1vZHVsZSBBcnJheSAgICAgICAgPSBBcnJheVxubW9kdWxlIEFycmF5TGFiZWxzICA9IEFycmF5TGFiZWxzXG5tb2R1bGUgQXRvbWljICAgICAgID0gQXRvbWljXG5tb2R1bGUgQmlnYXJyYXkgICAgID0gQmlnYXJyYXlcbm1vZHVsZSBCb29sICAgICAgICAgPSBCb29sXG5tb2R1bGUgQnVmZmVyICAgICAgID0gQnVmZmVyXG5tb2R1bGUgQnl0ZXMgICAgICAgID0gQnl0ZXNcbm1vZHVsZSBCeXRlc0xhYmVscyAgPSBCeXRlc0xhYmVsc1xubW9kdWxlIENhbGxiYWNrICAgICA9IENhbGxiYWNrXG5tb2R1bGUgQ2hhciAgICAgICAgID0gQ2hhclxubW9kdWxlIENvbXBsZXggICAgICA9IENvbXBsZXhcbm1vZHVsZSBEaWdlc3QgICAgICAgPSBEaWdlc3Rcbm1vZHVsZSBFaXRoZXIgICAgICAgPSBFaXRoZXJcbm1vZHVsZSBFcGhlbWVyb24gICAgPSBFcGhlbWVyb25cbm1vZHVsZSBGaWxlbmFtZSAgICAgPSBGaWxlbmFtZVxubW9kdWxlIEZsb2F0ICAgICAgICA9IEZsb2F0XG5tb2R1bGUgRm9ybWF0ICAgICAgID0gRm9ybWF0XG5tb2R1bGUgRnVuICAgICAgICAgID0gRnVuXG5tb2R1bGUgR2MgICAgICAgICAgID0gR2Ncbm1vZHVsZSBHZW5sZXggICAgICAgPSBHZW5sZXhcbm1vZHVsZSBIYXNodGJsICAgICAgPSBIYXNodGJsXG5tb2R1bGUgSW5fY2hhbm5lbCAgID0gSW5fY2hhbm5lbFxubW9kdWxlIEludCAgICAgICAgICA9IEludFxubW9kdWxlIEludDMyICAgICAgICA9IEludDMyXG5tb2R1bGUgSW50NjQgICAgICAgID0gSW50NjRcbm1vZHVsZSBMYXp5ICAgICAgICAgPSBMYXp5XG5tb2R1bGUgTGV4aW5nICAgICAgID0gTGV4aW5nXG5tb2R1bGUgTGlzdCAgICAgICAgID0gTGlzdFxubW9kdWxlIExpc3RMYWJlbHMgICA9IExpc3RMYWJlbHNcbm1vZHVsZSBNYXAgICAgICAgICAgPSBNYXBcbm1vZHVsZSBNYXJzaGFsICAgICAgPSBNYXJzaGFsXG5tb2R1bGUgTW9yZUxhYmVscyAgID0gTW9yZUxhYmVsc1xubW9kdWxlIE5hdGl2ZWludCAgICA9IE5hdGl2ZWludFxubW9kdWxlIE9iaiAgICAgICAgICA9IE9ialxubW9kdWxlIE9vICAgICAgICAgICA9IE9vXG5tb2R1bGUgT3B0aW9uICAgICAgID0gT3B0aW9uXG5tb2R1bGUgT3V0X2NoYW5uZWwgID0gT3V0X2NoYW5uZWxcbm1vZHVsZSBQYXJzaW5nICAgICAgPSBQYXJzaW5nXG5tb2R1bGUgUGVydmFzaXZlcyAgID0gUGVydmFzaXZlc1xubW9kdWxlIFByaW50ZXhjICAgICA9IFByaW50ZXhjXG5tb2R1bGUgUHJpbnRmICAgICAgID0gUHJpbnRmXG5tb2R1bGUgUXVldWUgICAgICAgID0gUXVldWVcbm1vZHVsZSBSYW5kb20gICAgICAgPSBSYW5kb21cbm1vZHVsZSBSZXN1bHQgICAgICAgPSBSZXN1bHRcbm1vZHVsZSBTY2FuZiAgICAgICAgPSBTY2FuZlxubW9kdWxlIFNlcSAgICAgICAgICA9IFNlcVxubW9kdWxlIFNldCAgICAgICAgICA9IFNldFxubW9kdWxlIFN0YWNrICAgICAgICA9IFN0YWNrXG5tb2R1bGUgU3RkTGFiZWxzICAgID0gU3RkTGFiZWxzXG5tb2R1bGUgU3RyZWFtICAgICAgID0gU3RyZWFtXG5tb2R1bGUgU3RyaW5nICAgICAgID0gU3RyaW5nXG5tb2R1bGUgU3RyaW5nTGFiZWxzID0gU3RyaW5nTGFiZWxzXG5tb2R1bGUgU3lzICAgICAgICAgID0gU3lzXG5tb2R1bGUgVWNoYXIgICAgICAgID0gVWNoYXJcbm1vZHVsZSBVbml0ICAgICAgICAgPSBVbml0XG5tb2R1bGUgV2VhayAgICAgICAgID0gV2Vha1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgSmVyZW1pZSBEaW1pbm8sIEphbmUgU3RyZWV0IEV1cm9wZSAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNyBKYW5lIFN0cmVldCBHcm91cCBMTEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiogQGRlcHJlY2F0ZWQgVXNlIHshU3RkbGlifSAqKVxuXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlXCJcbmV4dGVybmFsIHJhaXNlX25vdHJhY2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZV9ub3RyYWNlXCJcbmxldCBpbnZhbGlkX2FyZyA9IGludmFsaWRfYXJnXG5sZXQgZmFpbHdpdGggPSBmYWlsd2l0aFxuZXhjZXB0aW9uIEV4aXRcbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxubGV0IG1pbiA9IG1pblxubGV0IG1heCA9IG1heFxuZXh0ZXJuYWwgKCA9PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxXCJcbmV4dGVybmFsICggIT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcVwiXG5leHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5leHRlcm5hbCAoICYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG4gIFtAQG9jYW1sLmRlcHJlY2F0ZWQgXCJVc2UgKCYmKSBpbnN0ZWFkLlwiXVxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuZXh0ZXJuYWwgKCBvciApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuICBbQEBvY2FtbC5kZXByZWNhdGVkIFwiVXNlICh8fCkgaW5zdGVhZC5cIl1cbmV4dGVybmFsIF9fTE9DX18gOiBzdHJpbmcgPSBcIiVsb2NfTE9DXCJcbmV4dGVybmFsIF9fRklMRV9fIDogc3RyaW5nID0gXCIlbG9jX0ZJTEVcIlxuZXh0ZXJuYWwgX19MSU5FX18gOiBpbnQgPSBcIiVsb2NfTElORVwiXG5leHRlcm5hbCBfX01PRFVMRV9fIDogc3RyaW5nID0gXCIlbG9jX01PRFVMRVwiXG5leHRlcm5hbCBfX1BPU19fIDogc3RyaW5nICogaW50ICogaW50ICogaW50ID0gXCIlbG9jX1BPU1wiXG5leHRlcm5hbCBfX0xPQ19PRl9fIDogJ2EgLT4gc3RyaW5nICogJ2EgPSBcIiVsb2NfTE9DXCJcbmV4dGVybmFsIF9fTElORV9PRl9fIDogJ2EgLT4gaW50ICogJ2EgPSBcIiVsb2NfTElORVwiXG5leHRlcm5hbCBfX1BPU19PRl9fIDogJ2EgLT4gKHN0cmluZyAqIGludCAqIGludCAqIGludCkgKiAnYSA9IFwiJWxvY19QT1NcIlxuZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcbmV4dGVybmFsICggQEAgKSA6ICgnYSAtPiAnYikgLT4gJ2EgLT4gJ2IgPSBcIiVhcHBseVwiXG5leHRlcm5hbCAoIH4tICkgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcbmV4dGVybmFsICggfisgKSA6IGludCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBzdWNjIDogaW50IC0+IGludCA9IFwiJXN1Y2NpbnRcIlxuZXh0ZXJuYWwgcHJlZCA6IGludCAtPiBpbnQgPSBcIiVwcmVkaW50XCJcbmV4dGVybmFsICggKyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgKCAtICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXN1YmludFwiXG5leHRlcm5hbCAoICogKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbmV4dGVybmFsICggLyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgKCBtb2QgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbW9kaW50XCJcbmxldCBhYnMgPSBhYnNcbmxldCBtYXhfaW50ID0gbWF4X2ludFxubGV0IG1pbl9pbnQgPSBtaW5faW50XG5leHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxubGV0IGxub3QgPSBsbm90XG5leHRlcm5hbCAoIGxzbCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuZXh0ZXJuYWwgKCBsc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNyaW50XCJcbmV4dGVybmFsICggYXNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5leHRlcm5hbCAoIH4tLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCAoIH4rLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoICsuICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsICggLS4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgKCAqLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCAoIC8uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsICggKiogKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc3FydCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NxcnRfZmxvYXRcIiBcInNxcnRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cxcCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzFwX2Zsb2F0XCIgXCJjYW1sX2xvZzFwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc19mbG9hdFwiIFwiY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Npbl9mbG9hdFwiIFwic2luXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Rhbl9mbG9hdFwiIFwidGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zX2Zsb2F0XCIgXCJhY29zXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luX2Zsb2F0XCIgXCJhc2luXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuX2Zsb2F0XCIgXCJhdGFuXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbjJfZmxvYXRcIiBcImF0YW4yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGh5cG90IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2VpbCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NlaWxfZmxvYXRcIiBcImNlaWxcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvb3IgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9vcl9mbG9hdFwiIFwiZmxvb3JcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5leHRlcm5hbCBjb3B5c2lnbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICAgICA9IFwiY2FtbF9jb3B5c2lnbl9mbG9hdFwiIFwiY2FtbF9jb3B5c2lnblwiXG4gICAgICAgICAgICAgICAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbW9kX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZm1vZF9mbG9hdFwiIFwiZm1vZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmcmV4cCA6IGZsb2F0IC0+IGZsb2F0ICogaW50ID0gXCJjYW1sX2ZyZXhwX2Zsb2F0XCJcbmV4dGVybmFsIGxkZXhwIDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IChpbnQgW0B1bnRhZ2dlZF0pIC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9sZGV4cF9mbG9hdFwiIFwiY2FtbF9sZGV4cF9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZGYgOiBmbG9hdCAtPiBmbG9hdCAqIGZsb2F0ID0gXCJjYW1sX21vZGZfZmxvYXRcIlxuZXh0ZXJuYWwgZmxvYXQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIGZsb2F0X29mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdHJ1bmNhdGUgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGludF9vZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxubGV0IGluZmluaXR5ID0gaW5maW5pdHlcbmxldCBuZWdfaW5maW5pdHkgPSBuZWdfaW5maW5pdHlcbmxldCBuYW4gPSBuYW5cbmxldCBtYXhfZmxvYXQgPSBtYXhfZmxvYXRcbmxldCBtaW5fZmxvYXQgPSBtaW5fZmxvYXRcbmxldCBlcHNpbG9uX2Zsb2F0ID0gZXBzaWxvbl9mbG9hdFxudHlwZSBub25yZWMgZnBjbGFzcyA9IGZwY2xhc3MgPVxuICAgIEZQX25vcm1hbFxuICB8IEZQX3N1Ym5vcm1hbFxuICB8IEZQX3plcm9cbiAgfCBGUF9pbmZpbml0ZVxuICB8IEZQX25hblxuZXh0ZXJuYWwgY2xhc3NpZnlfZmxvYXQgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gZnBjbGFzcyA9XG4gIFwiY2FtbF9jbGFzc2lmeV9mbG9hdFwiIFwiY2FtbF9jbGFzc2lmeV9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmxldCAoIF4gKSA9ICggXiApXG5leHRlcm5hbCBpbnRfb2ZfY2hhciA6IGNoYXIgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxubGV0IGNoYXJfb2ZfaW50ID0gY2hhcl9vZl9pbnRcbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxubGV0IHN0cmluZ19vZl9ib29sID0gc3RyaW5nX29mX2Jvb2xcbmxldCBib29sX29mX3N0cmluZyA9IGJvb2xfb2Zfc3RyaW5nXG5sZXQgYm9vbF9vZl9zdHJpbmdfb3B0ID0gYm9vbF9vZl9zdHJpbmdfb3B0XG5sZXQgc3RyaW5nX29mX2ludCA9IHN0cmluZ19vZl9pbnRcbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxubGV0IGludF9vZl9zdHJpbmdfb3B0ID0gaW50X29mX3N0cmluZ19vcHRcbmxldCBzdHJpbmdfb2ZfZmxvYXQgPSBzdHJpbmdfb2ZfZmxvYXRcbmV4dGVybmFsIGZsb2F0X29mX3N0cmluZyA6IHN0cmluZyAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdF9vZl9zdHJpbmdcIlxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgPSBmbG9hdF9vZl9zdHJpbmdfb3B0XG5leHRlcm5hbCBmc3QgOiAnYSAqICdiIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsIHNuZCA6ICdhICogJ2IgLT4gJ2IgPSBcIiVmaWVsZDFcIlxubGV0ICggQCApICA9ICggQCApXG50eXBlIG5vbnJlYyBpbl9jaGFubmVsID0gaW5fY2hhbm5lbFxudHlwZSBub25yZWMgb3V0X2NoYW5uZWwgPSBvdXRfY2hhbm5lbFxubGV0IHN0ZGluID0gc3RkaW5cbmxldCBzdGRvdXQgPSBzdGRvdXRcbmxldCBzdGRlcnIgPSBzdGRlcnJcbmxldCBwcmludF9jaGFyID0gcHJpbnRfY2hhclxubGV0IHByaW50X3N0cmluZyA9IHByaW50X3N0cmluZ1xubGV0IHByaW50X2J5dGVzID0gcHJpbnRfYnl0ZXNcbmxldCBwcmludF9pbnQgPSBwcmludF9pbnRcbmxldCBwcmludF9mbG9hdCA9IHByaW50X2Zsb2F0XG5sZXQgcHJpbnRfZW5kbGluZSA9IHByaW50X2VuZGxpbmVcbmxldCBwcmludF9uZXdsaW5lID0gcHJpbnRfbmV3bGluZVxubGV0IHByZXJyX2NoYXIgPSBwcmVycl9jaGFyXG5sZXQgcHJlcnJfc3RyaW5nID0gcHJlcnJfc3RyaW5nXG5sZXQgcHJlcnJfYnl0ZXMgPSBwcmVycl9ieXRlc1xubGV0IHByZXJyX2ludCA9IHByZXJyX2ludFxubGV0IHByZXJyX2Zsb2F0ID0gcHJlcnJfZmxvYXRcbmxldCBwcmVycl9lbmRsaW5lID0gcHJlcnJfZW5kbGluZVxubGV0IHByZXJyX25ld2xpbmUgPSBwcmVycl9uZXdsaW5lXG5sZXQgcmVhZF9saW5lID0gcmVhZF9saW5lXG5sZXQgcmVhZF9pbnQgPSByZWFkX2ludFxubGV0IHJlYWRfaW50X29wdCA9IHJlYWRfaW50X29wdFxubGV0IHJlYWRfZmxvYXQgPSByZWFkX2Zsb2F0XG5sZXQgcmVhZF9mbG9hdF9vcHQgPSByZWFkX2Zsb2F0X29wdFxudHlwZSBub25yZWMgb3Blbl9mbGFnID0gb3Blbl9mbGFnID1cbiAgICBPcGVuX3Jkb25seVxuICB8IE9wZW5fd3Jvbmx5XG4gIHwgT3Blbl9hcHBlbmRcbiAgfCBPcGVuX2NyZWF0XG4gIHwgT3Blbl90cnVuY1xuICB8IE9wZW5fZXhjbFxuICB8IE9wZW5fYmluYXJ5XG4gIHwgT3Blbl90ZXh0XG4gIHwgT3Blbl9ub25ibG9ja1xubGV0IG9wZW5fb3V0ID0gb3Blbl9vdXRcbmxldCBvcGVuX291dF9iaW4gPSBvcGVuX291dF9iaW5cbmxldCBvcGVuX291dF9nZW4gPSBvcGVuX291dF9nZW5cbmxldCBmbHVzaCA9IGZsdXNoXG5sZXQgZmx1c2hfYWxsID0gZmx1c2hfYWxsXG5sZXQgb3V0cHV0X2NoYXIgPSBvdXRwdXRfY2hhclxubGV0IG91dHB1dF9zdHJpbmcgPSBvdXRwdXRfc3RyaW5nXG5sZXQgb3V0cHV0X2J5dGVzID0gb3V0cHV0X2J5dGVzXG5sZXQgb3V0cHV0ID0gb3V0cHV0XG5sZXQgb3V0cHV0X3N1YnN0cmluZyA9IG91dHB1dF9zdWJzdHJpbmdcbmxldCBvdXRwdXRfYnl0ZSA9IG91dHB1dF9ieXRlXG5sZXQgb3V0cHV0X2JpbmFyeV9pbnQgPSBvdXRwdXRfYmluYXJ5X2ludFxubGV0IG91dHB1dF92YWx1ZSA9IG91dHB1dF92YWx1ZVxubGV0IHNlZWtfb3V0ID0gc2Vla19vdXRcbmxldCBwb3Nfb3V0ID0gcG9zX291dFxubGV0IG91dF9jaGFubmVsX2xlbmd0aCA9IG91dF9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlX291dCA9IGNsb3NlX291dFxubGV0IGNsb3NlX291dF9ub2VyciA9IGNsb3NlX291dF9ub2VyclxubGV0IHNldF9iaW5hcnlfbW9kZV9vdXQgPSBzZXRfYmluYXJ5X21vZGVfb3V0XG5sZXQgb3Blbl9pbiA9IG9wZW5faW5cbmxldCBvcGVuX2luX2JpbiA9IG9wZW5faW5fYmluXG5sZXQgb3Blbl9pbl9nZW4gPSBvcGVuX2luX2dlblxubGV0IGlucHV0X2NoYXIgPSBpbnB1dF9jaGFyXG5sZXQgaW5wdXRfbGluZSA9IGlucHV0X2xpbmVcbmxldCBpbnB1dCA9IGlucHV0XG5sZXQgcmVhbGx5X2lucHV0ID0gcmVhbGx5X2lucHV0XG5sZXQgcmVhbGx5X2lucHV0X3N0cmluZyA9IHJlYWxseV9pbnB1dF9zdHJpbmdcbmxldCBpbnB1dF9ieXRlID0gaW5wdXRfYnl0ZVxubGV0IGlucHV0X2JpbmFyeV9pbnQgPSBpbnB1dF9iaW5hcnlfaW50XG5sZXQgaW5wdXRfdmFsdWUgPSBpbnB1dF92YWx1ZVxubGV0IHNlZWtfaW4gPSBzZWVrX2luXG5sZXQgcG9zX2luID0gcG9zX2luXG5sZXQgaW5fY2hhbm5lbF9sZW5ndGggPSBpbl9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlX2luID0gY2xvc2VfaW5cbmxldCBjbG9zZV9pbl9ub2VyciA9IGNsb3NlX2luX25vZXJyXG5sZXQgc2V0X2JpbmFyeV9tb2RlX2luID0gc2V0X2JpbmFyeV9tb2RlX2luXG5tb2R1bGUgTGFyZ2VGaWxlID0gTGFyZ2VGaWxlXG50eXBlIG5vbnJlYyAnYSByZWYgPSAnYSByZWYgPSB7IG11dGFibGUgY29udGVudHMgOiAnYSB9XG5leHRlcm5hbCByZWYgOiAnYSAtPiAnYSByZWYgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCAoICEgKSA6ICdhIHJlZiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCAoIDo9ICkgOiAnYSByZWYgLT4gJ2EgLT4gdW5pdCA9IFwiJXNldGZpZWxkMFwiXG5leHRlcm5hbCBpbmNyIDogaW50IHJlZiAtPiB1bml0ID0gXCIlaW5jclwiXG5leHRlcm5hbCBkZWNyIDogaW50IHJlZiAtPiB1bml0ID0gXCIlZGVjclwiXG50eXBlIG5vbnJlYyAoJ2EsJ2IpIHJlc3VsdCA9ICgnYSwnYikgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnYlxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9XG4gICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxudHlwZSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDQgPSAoJ2EsICdiLCAnYywgJ2MsICdjLCAnZCkgZm9ybWF0NlxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5sZXQgc3RyaW5nX29mX2Zvcm1hdCA9IHN0cmluZ19vZl9mb3JtYXRcbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPlxuICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9IFwiJWlkZW50aXR5XCJcbmxldCAoIF5eICkgPSAoIF5eIClcbmxldCBleGl0ID0gZXhpdFxubGV0IGF0X2V4aXQgPSBhdF9leGl0XG5sZXQgdmFsaWRfZmxvYXRfbGV4ZW0gPSB2YWxpZF9mbG9hdF9sZXhlbVxubGV0IGRvX2F0X2V4aXQgPSBkb19hdF9leGl0XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgT2plZGEgQmFyLCBMZXhpRmkgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIG5lZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgYWRkIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCBzdWIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsIG11bCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgZGl2IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCByZW0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZtYSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2ZtYV9mbG9hdFwiIFwiY2FtbF9mbWFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IGluZmluaXR5ID0gU3RkbGliLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gU3RkbGliLm5lZ19pbmZpbml0eVxubGV0IG5hbiA9IFN0ZGxpYi5uYW5cbmxldCBpc19maW5pdGUgKHg6IGZsb2F0KSA9IHggLS4geCA9IDAuXG5sZXQgaXNfaW5maW5pdGUgKHg6IGZsb2F0KSA9IDEuIC8uIHggPSAwLlxubGV0IGlzX25hbiAoeDogZmxvYXQpID0geCA8PiB4XG5cbmxldCBwaSA9IDB4MS45MjFmYjU0NDQyZDE4cCsxXG5sZXQgbWF4X2Zsb2F0ID0gU3RkbGliLm1heF9mbG9hdFxubGV0IG1pbl9mbG9hdCA9IFN0ZGxpYi5taW5fZmxvYXRcbmxldCBlcHNpbG9uID0gU3RkbGliLmVwc2lsb25fZmxvYXRcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmdfb3B0ID0gU3RkbGliLmZsb2F0X29mX3N0cmluZ19vcHRcbmxldCB0b19zdHJpbmcgPSBTdGRsaWIuc3RyaW5nX29mX2Zsb2F0XG50eXBlIGZwY2xhc3MgPSBTdGRsaWIuZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjYnJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2JydF9mbG9hdFwiIFwiY2FtbF9jYnJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cDIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHAyX2Zsb2F0XCIgXCJjYW1sX2V4cDJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzJfZmxvYXRcIiBcImNhbWxfbG9nMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmX2Zsb2F0XCIgXCJjYW1sX2VyZlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmZjIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmY19mbG9hdFwiIFwiY2FtbF9lcmZjXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRydW5jIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdHJ1bmNfZmxvYXRcIiBcImNhbWxfdHJ1bmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9yb3VuZF9mbG9hdFwiIFwiY2FtbF9yb3VuZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG5bQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgaXNfaW50ZWdlciB4ID0geCA9IHRydW5jIHggJiYgaXNfZmluaXRlIHhcblxuZXh0ZXJuYWwgbmV4dF9hZnRlciA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gID0gXCJjYW1sX25leHRhZnRlcl9mbG9hdFwiIFwiY2FtbF9uZXh0YWZ0ZXJcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgc3VjYyB4ID0gbmV4dF9hZnRlciB4IGluZmluaXR5XG5sZXQgcHJlZCB4ID0gbmV4dF9hZnRlciB4IG5lZ19pbmZpbml0eVxuXG5leHRlcm5hbCBjb3B5X3NpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpZ25fYml0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGJvb2xcbiAgPSBcImNhbWxfc2lnbmJpdF9mbG9hdFwiIFwiY2FtbF9zaWduYml0XCIgW0BAbm9hbGxvY11cblxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbnR5cGUgdCA9IGZsb2F0XG5leHRlcm5hbCBjb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5sZXQgZXF1YWwgeCB5ID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldFtAaW5saW5lXSBtaW4gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB8fCBpc19uYW4geSB0aGVuIChuYW4sIG5hbilcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgsIHkpIGVsc2UgKHksIHgpXG5cbmxldFtAaW5saW5lXSBtaW5fbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB0aGVuICh5LHkpXG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiAoeCx4KVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCx5KSBlbHNlICh5LHgpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDogaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgLT4gaW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IGZsb2F0YXJyYXlcblxuICBleHRlcm5hbCBsZW5ndGggOiB0IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcblxuICBsZXQgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGZvciBpID0gb2ZzIHRvIG9mcyArIGxlbiAtIDEgZG8gdW5zYWZlX3NldCBhIGkgdiBkb25lXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXQ6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID1cbiAgICBcImNhbWxfZmxvYXRhcnJheV9ibGl0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY2hlY2sgYSBvZnMgbGVuIG1zZyA9XG4gICAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyArIGxlbiA8IDAgfHwgb2ZzICsgbGVuID4gbGVuZ3RoIGEgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgbGV0IG1ha2UgbiB2ID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIG4gaW5cbiAgICB1bnNhZmVfZmlsbCByZXN1bHQgMCBuIHY7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGluaXQgbCBmID1cbiAgICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaW5pdFwiXG4gICAgZWxzZVxuICAgICAgbGV0IHJlcyA9IGNyZWF0ZSBsIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgICAgZG9uZTtcbiAgICAgIHJlc1xuXG4gIGxldCBhcHBlbmQgYTEgYTIgPVxuICAgIGxldCBsMSA9IGxlbmd0aCBhMSBpblxuICAgIGxldCBsMiA9IGxlbmd0aCBhMiBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgKGwxICsgbDIpIGluXG4gICAgdW5zYWZlX2JsaXQgYTEgMCByZXN1bHQgMCBsMTtcbiAgICB1bnNhZmVfYmxpdCBhMiAwIHJlc3VsdCBsMSBsMjtcbiAgICByZXN1bHRcblxuICAoKiBuZXh0IDMgZnVuY3Rpb25zOiBtb2RpZmllZCBjb3B5IG9mIGNvZGUgZnJvbSBzdHJpbmcubWwgKilcbiAgbGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPVxuICAgIGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmNvbmNhdFwiXG5cbiAgbGV0IHJlYyBzdW1fbGVuZ3RocyBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjXG4gICAgfCBoZCA6OiB0bCAtPiBzdW1fbGVuZ3RocyAoZW5zdXJlX2dlIChsZW5ndGggaGQgKyBhY2MpIGFjYykgdGxcblxuICBsZXQgY29uY2F0IGwgPVxuICAgIGxldCBsZW4gPSBzdW1fbGVuZ3RocyAwIGwgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgbG9vcCBsIGkgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCAoaSA9IGxlbilcbiAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgbGV0IGhsZW4gPSBsZW5ndGggaGQgaW5cbiAgICAgICAgdW5zYWZlX2JsaXQgaGQgMCByZXN1bHQgaSBobGVuO1xuICAgICAgICBsb29wIHRsIChpICsgaGxlbilcbiAgICBpblxuICAgIGxvb3AgbCAwO1xuICAgIHJlc3VsdFxuXG4gIGxldCBzdWIgYSBvZnMgbGVuID1cbiAgICBjaGVjayBhIG9mcyBsZW4gXCJGbG9hdC5BcnJheS5zdWJcIjtcbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGxlbiBpblxuICAgIHVuc2FmZV9ibGl0IGEgb2ZzIHJlc3VsdCAwIGxlbjtcbiAgICByZXN1bHRcblxuICBsZXQgY29weSBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSBsIGluXG4gICAgdW5zYWZlX2JsaXQgYSAwIHJlc3VsdCAwIGw7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LmZpbGxcIjtcbiAgICB1bnNhZmVfZmlsbCBhIG9mcyBsZW4gdlxuXG4gIGxldCBibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlbiA9XG4gICAgY2hlY2sgc3JjIHNvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIGNoZWNrIGRzdCBkb2ZzIGxlbiBcIkZsb2F0LmFycmF5LmJsaXRcIjtcbiAgICB1bnNhZmVfYmxpdCBzcmMgc29mcyBkc3QgZG9mcyBsZW5cblxuICBsZXQgdG9fbGlzdCBhID1cbiAgICBMaXN0LmluaXQgKGxlbmd0aCBhKSAodW5zYWZlX2dldCBhKVxuXG4gIGxldCBvZl9saXN0IGwgPVxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgKExpc3QubGVuZ3RoIGwpIGluXG4gICAgbGV0IHJlYyBmaWxsIGkgbCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gcmVzdWx0XG4gICAgICB8IGggOjogdCAtPiB1bnNhZmVfc2V0IHJlc3VsdCBpIGg7IGZpbGwgKGkgKyAxKSB0XG4gICAgaW5cbiAgICBmaWxsIDAgbFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlciBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXIyIGYgYSBiID1cbiAgICBpZiBsZW5ndGggYSA8PiBsZW5ndGggYiB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSBkb25lXG5cbiAgbGV0IG1hcCBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gIGxldCBtYXAyIGYgYSBiID1cbiAgICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICAgIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gICAgaWYgbGEgPD4gbGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXJpIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgbGV0IG1hcGkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgICBsZXQgciA9IHJlZiB4IGluXG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgICBkb25lO1xuICAgICFyXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgICBsZXQgciA9IHJlZiB4IGluXG4gICAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDAgZG9cbiAgICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZXhpc3RzIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvcl9hbGwgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKGkgKyAxKVxuICAgICAgZWxzZSBmYWxzZSBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgbWVtIHggYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhIGkpIHggPSAwIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwsIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgKilcbiAgbGV0IG1lbV9pZWVlIHggYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgeCA9ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgICBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGV4Y2VwdGlvbiBCb3R0b20gb2YgaW50XG4gIGxldCBzb3J0IGNtcCBhID1cbiAgICBsZXQgbWF4c29uIGwgaSA9XG4gICAgICBsZXQgaTMxID0gaStpK2krMSBpblxuICAgICAgbGV0IHggPSByZWYgaTMxIGluXG4gICAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgICBpZiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMCB0aGVuIHggOj0gaTMxKzE7XG4gICAgICAgIGlmIGNtcCAoZ2V0IGEgIXgpIChnZXQgYSAoaTMxKzIpKSA8IDAgdGhlbiB4IDo9IGkzMSsyO1xuICAgICAgICAheFxuICAgICAgZW5kIGVsc2VcbiAgICAgICAgaWYgaTMxKzEgPCBsICYmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwXG4gICAgICAgIHRoZW4gaTMxKzFcbiAgICAgICAgZWxzZSBpZiBpMzEgPCBsIHRoZW4gaTMxIGVsc2UgcmFpc2UgKEJvdHRvbSBpKVxuICAgIGluXG4gICAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICAgIGlmIGNtcCAoZ2V0IGEgaikgZSA+IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgICAgdHJpY2tsZWRvd24gbCBqIGU7XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgYSBpIGU7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICAgIGxldCByZWMgYnViYmxlZG93biBsIGkgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIGJ1YmJsZWRvd24gbCBqXG4gICAgaW5cbiAgICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgICBsZXQgcmVjIHRyaWNrbGV1cCBpIGUgPVxuICAgICAgbGV0IGZhdGhlciA9IChpIC0gMSkgLyAzIGluXG4gICAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICAgIGlmIGNtcCAoZ2V0IGEgZmF0aGVyKSBlIDwgMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBhIGkgKGdldCBhIGZhdGhlcik7XG4gICAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgYSBpIGU7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICAgIGZvciBpID0gbCAtIDEgZG93bnRvIDIgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIGkpIGluXG4gICAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICAgIHRyaWNrbGV1cCAoYnViYmxlIGkgMCkgZTtcbiAgICBkb25lO1xuICAgIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBleGNlcHQgZm9yIHRoZSBjYWxsIHRvIFtjcmVhdGVdICopXG4gIGxldCBjdXRvZmYgPSA1XG4gIGxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gICAgbGV0IG1lcmdlIHNyYzFvZnMgc3JjMWxlbiBzcmMyIHNyYzJvZnMgc3JjMmxlbiBkc3QgZHN0b2ZzID1cbiAgICAgIGxldCBzcmMxciA9IHNyYzFvZnMgKyBzcmMxbGVuIGFuZCBzcmMyciA9IHNyYzJvZnMgKyBzcmMybGVuIGluXG4gICAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICAgIGlmIGNtcCBzMSBzMiA8PSAwIHRoZW4gYmVnaW5cbiAgICAgICAgICBzZXQgZHN0IGQgczE7XG4gICAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgICAgaWYgaTEgPCBzcmMxciB0aGVuXG4gICAgICAgICAgICBsb29wIGkxIChnZXQgYSBpMSkgaTIgczIgKGQgKyAxKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJsaXQgc3JjMiBpMiBkc3QgKGQgKyAxKSAoc3JjMnIgLSBpMilcbiAgICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgICAgbGV0IGkyID0gaTIgKyAxIGluXG4gICAgICAgICAgaWYgaTIgPCBzcmMyciB0aGVuXG4gICAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJsaXQgYSBpMSBkc3QgKGQgKyAxKSAoc3JjMXIgLSBpMSlcbiAgICAgICAgZW5kXG4gICAgICBpbiBsb29wIHNyYzFvZnMgKGdldCBhIHNyYzFvZnMpIHNyYzJvZnMgKGdldCBzcmMyIHNyYzJvZnMpIGRzdG9mcztcbiAgICBpblxuICAgIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgICBsZXQgZSA9IChnZXQgYSAoc3Jjb2ZzICsgaSkpIGluXG4gICAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgICAgd2hpbGUgKCFqID49IGRzdG9mcyAmJiBjbXAgKGdldCBkc3QgIWopIGUgPiAwKSBkb1xuICAgICAgICAgIHNldCBkc3QgKCFqICsgMSkgKGdldCBkc3QgIWopO1xuICAgICAgICAgIGRlY3IgajtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSBlO1xuICAgICAgZG9uZTtcbiAgICBpblxuICAgIGxldCByZWMgc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgICBsZXQgbDEgPSBsZW4gLyAyIGluXG4gICAgICAgIGxldCBsMiA9IGxlbiAtIGwxIGluXG4gICAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgICBzb3J0dG8gc3Jjb2ZzIGEgKHNyY29mcyArIGwyKSBsMTtcbiAgICAgICAgbWVyZ2UgKHNyY29mcyArIGwyKSBsMSBkc3QgKGRzdG9mcyArIGwxKSBsMiBkc3QgZHN0b2ZzO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICAgIGxldCBsMSA9IGwgLyAyIGluXG4gICAgICBsZXQgbDIgPSBsIC0gbDEgaW5cbiAgICAgIGxldCB0ID0gY3JlYXRlIGwyIGluXG4gICAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgICAgc29ydHRvIDAgYSBsMiBsMTtcbiAgICAgIG1lcmdlIGwyIGwxIHQgMCBsMiBhIDA7XG4gICAgZW5kXG5cbiAgbGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCB0b19zZXEgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICAgICAgZWxzZSBTZXEuTmlsXG4gICAgaW5cbiAgICBhdXggMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxaSBhID1cbiAgICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAgIGlmIGkgPCBsZW5ndGggYVxuICAgICAgdGhlblxuICAgICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICAgICAgZWxzZSBTZXEuTmlsXG4gICAgaW5cbiAgICBhdXggMFxuXG4gICgqIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG9mX3Jldl9saXN0IGwgPVxuICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBsIGluXG4gICAgbGV0IGEgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICBbXSAtPiBhXG4gICAgICB8IGhkOjp0bCAtPiB1bnNhZmVfc2V0IGEgaSBoZDsgZmlsbCAoaS0xKSB0bFxuICAgIGluXG4gICAgZmlsbCAobGVuLTEpIGxcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG9mX3NlcSBpID1cbiAgICBsZXQgbCA9IFNlcS5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiB4OjphY2MpIFtdIGkgaW5cbiAgICBvZl9yZXZfbGlzdCBsXG5cblxuICBsZXQgbWFwX3RvX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGlmIGwgPSAwIHRoZW4gW3wgfF0gZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBBcnJheS5tYWtlIGwgKGYgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICAgIGZvciBpID0gMSB0byBsIC0gMSBkb1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICBsZXQgbWFwX2Zyb21fYXJyYXkgZiBhID1cbiAgICBsZXQgbCA9IEFycmF5Lmxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgKEFycmF5LnVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcblxuZW5kXG5cbm1vZHVsZSBBcnJheUxhYmVscyA9IEFycmF5XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICAgVGhpcyBpcyBhIGxhZ2dlZC1GaWJvbmFjY2kgRig1NSwgMjQsICspIHdpdGggYSBtb2RpZmllZCBhZGRpdGlvblxuICAgZnVuY3Rpb24gdG8gZW5oYW5jZSB0aGUgbWl4aW5nIG9mIGJpdHMuXG4gICBJZiB3ZSB1c2Ugbm9ybWFsIGFkZGl0aW9uLCB0aGUgbG93LW9yZGVyIGJpdCBmYWlscyB0ZXN0cyAxIGFuZCA3XG4gICBvZiB0aGUgRGllaGFyZCB0ZXN0IHN1aXRlLCBhbmQgYml0cyAxIGFuZCAyIGFsc28gZmFpbCB0ZXN0IDcuXG4gICBJZiB3ZSB1c2UgbXVsdGlwbGljYXRpb24gYXMgc3VnZ2VzdGVkIGJ5IE1hcnNhZ2xpYSwgaXQgZG9lc24ndCBmYXJlXG4gICBtdWNoIGJldHRlci5cbiAgIEJ5IG1peGluZyB0aGUgYml0cyBvZiBvbmUgb2YgdGhlIG51bWJlcnMgYmVmb3JlIGFkZGl0aW9uIChYT1IgdGhlXG4gICA1IGhpZ2gtb3JkZXIgYml0cyBpbnRvIHRoZSBsb3ctb3JkZXIgYml0cyksIHdlIGdldCBhIGdlbmVyYXRvciB0aGF0XG4gICBwYXNzZXMgYWxsIHRoZSBEaWVoYXJkIHRlc3RzLlxuKilcblxuZXh0ZXJuYWwgcmFuZG9tX3NlZWQ6IHVuaXQgLT4gaW50IGFycmF5ID0gXCJjYW1sX3N5c19yYW5kb21fc2VlZFwiXG5cbm1vZHVsZSBTdGF0ZSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IHsgc3QgOiBpbnQgYXJyYXk7IG11dGFibGUgaWR4IDogaW50IH1cblxuICBsZXQgbmV3X3N0YXRlICgpID0geyBzdCA9IEFycmF5Lm1ha2UgNTUgMDsgaWR4ID0gMCB9XG4gIGxldCBhc3NpZ24gc3QxIHN0MiA9XG4gICAgQXJyYXkuYmxpdCBzdDIuc3QgMCBzdDEuc3QgMCA1NTtcbiAgICBzdDEuaWR4IDwtIHN0Mi5pZHhcblxuXG4gIGxldCBmdWxsX2luaXQgcyBzZWVkID1cbiAgICBsZXQgY29tYmluZSBhY2N1IHggPSBEaWdlc3Quc3RyaW5nIChhY2N1IF4gSW50LnRvX3N0cmluZyB4KSBpblxuICAgIGxldCBleHRyYWN0IGQgPVxuICAgICAgQ2hhci5jb2RlIGQuWzBdICsgKENoYXIuY29kZSBkLlsxXSBsc2wgOCkgKyAoQ2hhci5jb2RlIGQuWzJdIGxzbCAxNilcbiAgICAgICsgKENoYXIuY29kZSBkLlszXSBsc2wgMjQpXG4gICAgaW5cbiAgICBsZXQgc2VlZCA9IGlmIEFycmF5Lmxlbmd0aCBzZWVkID0gMCB0aGVuIFt8IDAgfF0gZWxzZSBzZWVkIGluXG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGggc2VlZCBpblxuICAgIGZvciBpID0gMCB0byA1NCBkb1xuICAgICAgcy5zdC4oaSkgPC0gaTtcbiAgICBkb25lO1xuICAgIGxldCBhY2N1ID0gcmVmIFwieFwiIGluXG4gICAgZm9yIGkgPSAwIHRvIDU0ICsgSW50Lm1heCA1NSBsIGRvXG4gICAgICBsZXQgaiA9IGkgbW9kIDU1IGluXG4gICAgICBsZXQgayA9IGkgbW9kIGwgaW5cbiAgICAgIGFjY3UgOj0gY29tYmluZSAhYWNjdSBzZWVkLihrKTtcbiAgICAgIHMuc3QuKGopIDwtIChzLnN0LihqKSBseG9yIGV4dHJhY3QgIWFjY3UpIGxhbmQgMHgzRkZGRkZGRjsgICgqIFBSIzU1NzUgKilcbiAgICBkb25lO1xuICAgIHMuaWR4IDwtIDBcblxuXG4gIGxldCBtYWtlIHNlZWQgPVxuICAgIGxldCByZXN1bHQgPSBuZXdfc3RhdGUgKCkgaW5cbiAgICBmdWxsX2luaXQgcmVzdWx0IHNlZWQ7XG4gICAgcmVzdWx0XG5cblxuICBsZXQgbWFrZV9zZWxmX2luaXQgKCkgPSBtYWtlIChyYW5kb21fc2VlZCAoKSlcblxuICBsZXQgY29weSBzID1cbiAgICBsZXQgcmVzdWx0ID0gbmV3X3N0YXRlICgpIGluXG4gICAgYXNzaWduIHJlc3VsdCBzO1xuICAgIHJlc3VsdFxuXG5cbiAgKCogUmV0dXJucyAzMCByYW5kb20gYml0cyBhcyBhbiBpbnRlZ2VyIDAgPD0geCA8IDEwNzM3NDE4MjQgKilcbiAgbGV0IGJpdHMgcyA9XG4gICAgcy5pZHggPC0gKHMuaWR4ICsgMSkgbW9kIDU1O1xuICAgIGxldCBjdXJ2YWwgPSBzLnN0LihzLmlkeCkgaW5cbiAgICBsZXQgbmV3dmFsID0gcy5zdC4oKHMuaWR4ICsgMjQpIG1vZCA1NSlcbiAgICAgICAgICAgICAgICAgKyAoY3VydmFsIGx4b3IgKChjdXJ2YWwgbHNyIDI1KSBsYW5kIDB4MUYpKSBpblxuICAgIGxldCBuZXd2YWwzMCA9IG5ld3ZhbCBsYW5kIDB4M0ZGRkZGRkYgaW4gICgqIFBSIzU1NzUgKilcbiAgICBzLnN0LihzLmlkeCkgPC0gbmV3dmFsMzA7XG4gICAgbmV3dmFsMzBcblxuXG4gIGxldCByZWMgaW50YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBiaXRzIHMgaW5cbiAgICBsZXQgdiA9IHIgbW9kIG4gaW5cbiAgICBpZiByIC0gdiA+IDB4M0ZGRkZGRkYgLSBuICsgMSB0aGVuIGludGF1eCBzIG4gZWxzZSB2XG5cbiAgbGV0IGludCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA+IDB4M0ZGRkZGRkYgfHwgYm91bmQgPD0gMFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50XCJcbiAgICBlbHNlIGludGF1eCBzIGJvdW5kXG5cbiAgbGV0IHJlYyBpbnQ2M2F1eCBzIG4gPVxuICAgIGxldCBtYXhfaW50XzMyID0gKDEgbHNsIDMwKSArIDB4M0ZGRkZGRkYgaW4gKCogMHg3RkZGRkZGRiAqKVxuICAgIGxldCBiMSA9IGJpdHMgcyBpblxuICAgIGxldCBiMiA9IGJpdHMgcyBpblxuICAgIGxldCAociwgbWF4X2ludCkgPVxuICAgICAgaWYgbiA8PSBtYXhfaW50XzMyIHRoZW5cbiAgICAgICAgKCogMzEgcmFuZG9tIGJpdHMgb24gYm90aCA2NC1iaXQgT0NhbWwgYW5kIEphdmFTY3JpcHQuXG4gICAgICAgICAgIFVzZSB1cHBlciAxNSBiaXRzIG9mIGIxIGFuZCAxNiBiaXRzIG9mIGIyLiAqKVxuICAgICAgICBsZXQgYnBvcyA9XG4gICAgICAgICAgKCgoYjIgbGFuZCAweDNGRkZDMDAwKSBsc2wgMSkgbG9yIChiMSBsc3IgMTUpKVxuICAgICAgICBpblxuICAgICAgICAgIChicG9zLCBtYXhfaW50XzMyKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgYjMgPSBiaXRzIHMgaW5cbiAgICAgICAgKCogNjIgcmFuZG9tIGJpdHMgb24gNjQtYml0IE9DYW1sOyB1bnJlYWNoYWJsZSBvbiBKYXZhU2NyaXB0LlxuICAgICAgICAgICBVc2UgdXBwZXIgMjAgYml0cyBvZiBiMSBhbmQgMjEgYml0cyBvZiBiMiBhbmQgYjMuICopXG4gICAgICAgIGxldCBicG9zID1cbiAgICAgICAgICAoKCgoYjMgbGFuZCAweDNGRkZGRTAwKSBsc2wgMTIpIGxvciAoYjIgbHNyIDkpKSBsc2wgMjApXG4gICAgICAgICAgICBsb3IgKGIxIGxzciAxMClcbiAgICAgICAgaW5cbiAgICAgICAgICAoYnBvcywgbWF4X2ludClcbiAgICBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgIGlmIHIgLSB2ID4gbWF4X2ludCAtIG4gKyAxIHRoZW4gaW50NjNhdXggcyBuIGVsc2UgdlxuXG4gIGxldCBmdWxsX2ludCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiUmFuZG9tLmZ1bGxfaW50XCJcbiAgICBlbHNlIGlmIGJvdW5kID4gMHgzRkZGRkZGRiB0aGVuXG4gICAgICBpbnQ2M2F1eCBzIGJvdW5kXG4gICAgZWxzZVxuICAgICAgaW50YXV4IHMgYm91bmRcblxuXG4gIGxldCByZWMgaW50MzJhdXggcyBuID1cbiAgICBsZXQgYjEgPSBJbnQzMi5vZl9pbnQgKGJpdHMgcykgaW5cbiAgICBsZXQgYjIgPSBJbnQzMi5zaGlmdF9sZWZ0IChJbnQzMi5vZl9pbnQgKGJpdHMgcyBsYW5kIDEpKSAzMCBpblxuICAgIGxldCByID0gSW50MzIubG9nb3IgYjEgYjIgaW5cbiAgICBsZXQgdiA9IEludDMyLnJlbSByIG4gaW5cbiAgICBpZiBJbnQzMi5zdWIgciB2ID4gSW50MzIuYWRkIChJbnQzMi5zdWIgSW50MzIubWF4X2ludCBuKSAxbFxuICAgIHRoZW4gaW50MzJhdXggcyBuXG4gICAgZWxzZSB2XG5cbiAgbGV0IGludDMyIHMgYm91bmQgPVxuICAgIGlmIGJvdW5kIDw9IDBsXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlJhbmRvbS5pbnQzMlwiXG4gICAgZWxzZSBpbnQzMmF1eCBzIGJvdW5kXG5cblxuICBsZXQgcmVjIGludDY0YXV4IHMgbiA9XG4gICAgbGV0IGIxID0gSW50NjQub2ZfaW50IChiaXRzIHMpIGluXG4gICAgbGV0IGIyID0gSW50NjQuc2hpZnRfbGVmdCAoSW50NjQub2ZfaW50IChiaXRzIHMpKSAzMCBpblxuICAgIGxldCBiMyA9IEludDY0LnNoaWZ0X2xlZnQgKEludDY0Lm9mX2ludCAoYml0cyBzIGxhbmQgNykpIDYwIGluXG4gICAgbGV0IHIgPSBJbnQ2NC5sb2dvciBiMSAoSW50NjQubG9nb3IgYjIgYjMpIGluXG4gICAgbGV0IHYgPSBJbnQ2NC5yZW0gciBuIGluXG4gICAgaWYgSW50NjQuc3ViIHIgdiA+IEludDY0LmFkZCAoSW50NjQuc3ViIEludDY0Lm1heF9pbnQgbikgMUxcbiAgICB0aGVuIGludDY0YXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQ2NCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwTFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50NjRcIlxuICAgIGVsc2UgaW50NjRhdXggcyBib3VuZFxuXG5cbiAgbGV0IG5hdGl2ZWludCA9XG4gICAgaWYgTmF0aXZlaW50LnNpemUgPSAzMlxuICAgIHRoZW4gZnVuIHMgYm91bmQgLT4gTmF0aXZlaW50Lm9mX2ludDMyIChpbnQzMiBzIChOYXRpdmVpbnQudG9faW50MzIgYm91bmQpKVxuICAgIGVsc2UgZnVuIHMgYm91bmQgLT4gSW50NjQudG9fbmF0aXZlaW50IChpbnQ2NCBzIChJbnQ2NC5vZl9uYXRpdmVpbnQgYm91bmQpKVxuXG5cbiAgKCogUmV0dXJucyBhIGZsb2F0IDAgPD0geCA8PSAxIHdpdGggYXQgbW9zdCA2MCBiaXRzIG9mIHByZWNpc2lvbi4gKilcbiAgbGV0IHJhd2Zsb2F0IHMgPVxuICAgIGxldCBzY2FsZSA9IDEwNzM3NDE4MjQuMCAgKCogMl4zMCAqKVxuICAgIGFuZCByMSA9IFN0ZGxpYi5mbG9hdCAoYml0cyBzKVxuICAgIGFuZCByMiA9IFN0ZGxpYi5mbG9hdCAoYml0cyBzKVxuICAgIGluIChyMSAvLiBzY2FsZSArLiByMikgLy4gc2NhbGVcblxuXG4gIGxldCBmbG9hdCBzIGJvdW5kID0gcmF3ZmxvYXQgcyAqLiBib3VuZFxuXG4gIGxldCBib29sIHMgPSAoYml0cyBzIGxhbmQgMSA9IDApXG5cbiAgbGV0IGJpdHMzMiBzID1cbiAgICBsZXQgYjEgPSBJbnQzMi4oc2hpZnRfcmlnaHRfbG9naWNhbCAob2ZfaW50IChiaXRzIHMpKSAxNCkgaW4gICgqIDE2IGJpdHMgKilcbiAgICBsZXQgYjIgPSBJbnQzMi4oc2hpZnRfcmlnaHRfbG9naWNhbCAob2ZfaW50IChiaXRzIHMpKSAxNCkgaW4gICgqIDE2IGJpdHMgKilcbiAgICBJbnQzMi4obG9nb3IgYjEgKHNoaWZ0X2xlZnQgYjIgMTYpKVxuXG4gIGxldCBiaXRzNjQgcyA9XG4gICAgbGV0IGIxID0gSW50NjQuKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKG9mX2ludCAoYml0cyBzKSkgOSkgaW4gICgqIDIxIGJpdHMgKilcbiAgICBsZXQgYjIgPSBJbnQ2NC4oc2hpZnRfcmlnaHRfbG9naWNhbCAob2ZfaW50IChiaXRzIHMpKSA5KSBpbiAgKCogMjEgYml0cyAqKVxuICAgIGxldCBiMyA9IEludDY0LihzaGlmdF9yaWdodF9sb2dpY2FsIChvZl9pbnQgKGJpdHMgcykpIDgpIGluICAoKiAyMiBiaXRzICopXG4gICAgSW50NjQuKGxvZ29yIGIxIChsb2dvciAoc2hpZnRfbGVmdCBiMiAyMSkgKHNoaWZ0X2xlZnQgYjMgNDIpKSlcblxuICBsZXQgbmF0aXZlYml0cyA9XG4gICAgaWYgTmF0aXZlaW50LnNpemUgPSAzMlxuICAgIHRoZW4gZnVuIHMgLT4gTmF0aXZlaW50Lm9mX2ludDMyIChiaXRzMzIgcylcbiAgICBlbHNlIGZ1biBzIC0+IEludDY0LnRvX25hdGl2ZWludCAoYml0czY0IHMpXG5cbmVuZFxuXG4oKiBUaGlzIGlzIHRoZSBzdGF0ZSB5b3UgZ2V0IHdpdGggW2luaXQgMjcxODI4MThdIGFuZCB0aGVuIGFwcGx5aW5nXG4gICB0aGUgXCJsYW5kIDB4M0ZGRkZGRkZcIiBmaWx0ZXIgdG8gdGhlbS4gIFNlZSAjNTU3NSwgIzU3OTMsICM1OTc3LiAqKVxubGV0IGRlZmF1bHQgPSB7XG4gIFN0YXRlLnN0ID0gW3xcbiAgICAgIDB4M2FlMjUyMmI7IDB4MWQ4ZDQ2MzQ7IDB4MTViNGZhZDA7IDB4MThiMTRhY2U7IDB4MTJmOGEzYzQ7IDB4M2IwODZjNDc7XG4gICAgICAweDE2ZDQ2N2Q2OyAweDEwMWQ5MWM3OyAweDMyMWRmMTc3OyAweDAxNzZjMTkzOyAweDFmZjcyYmYxOyAweDFlODg5MTA5O1xuICAgICAgMHgwYjQ2NGIxODsgMHgyYjg2Yjk3YzsgMHgwODkxZGE0ODsgMHgwMzEzNzQ2MzsgMHgwODVhYzVhMTsgMHgxNWQ2MWYyZjtcbiAgICAgIDB4M2JjZWQzNTk7IDB4MjljMWMxMzI7IDB4M2E4Njc2NmU7IDB4MzY2ZDhjODY7IDB4MWY1YjYyMjI7IDB4M2NlMWI1OWY7XG4gICAgICAweDJlYmY3OGUxOyAweDI3Y2QxYjg2OyAweDI1OGYzZGMzOyAweDM4OWE4MTk0OyAweDAyZTRjNDRjOyAweDE4YzQzZjdkO1xuICAgICAgMHgwZjZlNTM0ZjsgMHgxZTdkZjM1OTsgMHgwNTVkMGI3ZTsgMHgxMGU4NGU3ZTsgMHgxMjYxOThlNDsgMHgwZTc3MjJjYjtcbiAgICAgIDB4MWNiZWRlMjg7IDB4MzM5MWI5NjQ7IDB4M2Q0MGU5MmE7IDB4MGM1OTkzM2Q7IDB4MGI4Y2QwYjc7IDB4MjRlZmZmMWM7XG4gICAgICAweDI4MDNmZGFhOyAweDA4ZWJjNzJlOyAweDBmNTIyZTMyOyAweDA1Mzk4ZWRjOyAweDIxNDRhMDRjOyAweDBhZWYzY2JkO1xuICAgICAgMHgwMWFkNDcxOTsgMHgzNWI5M2NkNjsgMHgyYTU1OWQ0ZjsgMHgxZTZmZDc2ODsgMHgyNmUyN2YzNjsgMHgxODZmMThjMztcbiAgICAgIDB4MmZiZjk2N2E7XG4gICAgfF07XG4gIFN0YXRlLmlkeCA9IDA7XG59XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyBkZWZhdWx0XG5sZXQgaW50IGJvdW5kID0gU3RhdGUuaW50IGRlZmF1bHQgYm91bmRcbmxldCBmdWxsX2ludCBib3VuZCA9IFN0YXRlLmZ1bGxfaW50IGRlZmF1bHQgYm91bmRcbmxldCBpbnQzMiBib3VuZCA9IFN0YXRlLmludDMyIGRlZmF1bHQgYm91bmRcbmxldCBuYXRpdmVpbnQgYm91bmQgPSBTdGF0ZS5uYXRpdmVpbnQgZGVmYXVsdCBib3VuZFxubGV0IGludDY0IGJvdW5kID0gU3RhdGUuaW50NjQgZGVmYXVsdCBib3VuZFxubGV0IGZsb2F0IHNjYWxlID0gU3RhdGUuZmxvYXQgZGVmYXVsdCBzY2FsZVxubGV0IGJvb2wgKCkgPSBTdGF0ZS5ib29sIGRlZmF1bHRcbmxldCBiaXRzMzIgKCkgPSBTdGF0ZS5iaXRzMzIgZGVmYXVsdFxubGV0IGJpdHM2NCAoKSA9IFN0YXRlLmJpdHM2NCBkZWZhdWx0XG5sZXQgbmF0aXZlYml0cyAoKSA9IFN0YXRlLm5hdGl2ZWJpdHMgZGVmYXVsdFxuXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5mdWxsX2luaXQgZGVmYXVsdCBzZWVkXG5sZXQgaW5pdCBzZWVkID0gU3RhdGUuZnVsbF9pbml0IGRlZmF1bHQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQoKSlcblxuKCogTWFuaXB1bGF0aW5nIHRoZSBjdXJyZW50IHN0YXRlLiAqKVxuXG5sZXQgZ2V0X3N0YXRlICgpID0gU3RhdGUuY29weSBkZWZhdWx0XG5sZXQgc2V0X3N0YXRlIHMgPSBTdGF0ZS5hc3NpZ24gZGVmYXVsdCBzXG5cbigqKioqKioqKioqKioqKioqKioqKlxuXG4oKiBUZXN0IGZ1bmN0aW9ucy4gIE5vdCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeS5cbiAgIFRoZSBbY2hpc3F1YXJlXSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggbiA+IDEwci5cbiAgIEl0IHJldHVybnMgYSB0cmlwbGUgKGxvdywgYWN0dWFsLCBoaWdoKS5cbiAgIElmIGxvdyA8PSBhY3R1YWwgPD0gaGlnaCwgdGhlIFtnXSBmdW5jdGlvbiBwYXNzZWQgdGhlIHRlc3QsXG4gICBvdGhlcndpc2UgaXQgZmFpbGVkLlxuXG4gIFNvbWUgcmVzdWx0czpcblxuaW5pdCAyNzE4MjgxODsgY2hpc3F1YXJlIGludCAxMDAwMDAgMTAwMFxuaW5pdCAyNzE4MjgxODsgY2hpc3F1YXJlIGludCAxMDAwMDAgMTAwXG5pbml0IDI3MTgyODE4OyBjaGlzcXVhcmUgaW50IDEwMDAwMCA1MDAwXG5pbml0IDI3MTgyODE4OyBjaGlzcXVhcmUgaW50IDEwMDAwMDAgMTAwMFxuaW5pdCAyNzE4MjgxODsgY2hpc3F1YXJlIGludCAxMDAwMDAgMTAyNFxuaW5pdCAyOTk3OTI2NDM7IGNoaXNxdWFyZSBpbnQgMTAwMDAwIDEwMjRcbmluaXQgMTQxNDIxMzY7IGNoaXNxdWFyZSBpbnQgMTAwMDAwIDEwMjRcbmluaXQgMjcxODI4MTg7IGluaXRfZGlmZiAxMDI0OyBjaGlzcXVhcmUgZGlmZiAxMDAwMDAgMTAyNFxuaW5pdCAyNzE4MjgxODsgaW5pdF9kaWZmIDEwMDsgY2hpc3F1YXJlIGRpZmYgMTAwMDAwIDEwMFxuaW5pdCAyNzE4MjgxODsgaW5pdF9kaWZmMiAxMDI0OyBjaGlzcXVhcmUgZGlmZjIgMTAwMDAwIDEwMjRcbmluaXQgMjcxODI4MTg7IGluaXRfZGlmZjIgMTAwOyBjaGlzcXVhcmUgZGlmZjIgMTAwMDAwIDEwMFxuaW5pdCAxNDE0MjEzNjsgaW5pdF9kaWZmMiAxMDA7IGNoaXNxdWFyZSBkaWZmMiAxMDAwMDAgMTAwXG5pbml0IDI5OTc5MjY0MzsgaW5pdF9kaWZmMiAxMDA7IGNoaXNxdWFyZSBkaWZmMiAxMDAwMDAgMTAwXG4tIDogZmxvYXQgKiBmbG9hdCAqIGZsb2F0ID0gKDkzNi43NTQ0NDY3OTY2MzI0NjUsIDk5Ny41LCAxMDYzLjI0NTU1MzIwMzM2NzU0KVxuIyAtIDogZmxvYXQgKiBmbG9hdCAqIGZsb2F0ID0gKDgwLiwgODkuNzQwMDAwMDAwMDA1MjM4NywgMTIwLilcbiMgLSA6IGZsb2F0ICogZmxvYXQgKiBmbG9hdCA9ICg0ODU4LjU3ODY0Mzc2MjY5LCA1MDQ1LjUsIDUxNDEuNDIxMzU2MjM3MzEpXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPVxuKDkzNi43NTQ0NDY3OTY2MzI0NjUsIDk0NC44MDU5OTk5OTk5ODIzMDUsIDEwNjMuMjQ1NTUzMjAzMzY3NTQpXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoOTYwLiwgMTAxOS4xOTc0NDAwMDAwMDM1NSwgMTA4OC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoOTYwLiwgMTA1OS4zMTc3NjAwMDAwMDUzNiwgMTA4OC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoOTYwLiwgMTAzOS45ODQ2Mzk5OTk5OTUxMiwgMTA4OC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoOTYwLiwgMTA1NC4zODIwNzk5OTk5OTU3NywgMTA4OC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoODAuLCA5MC4wOTYwMDAwMDAwMDUsIDEyMC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoOTYwLiwgMTA3Ni43ODcyMDAwMDAwMDYxMiwgMTA4OC4pXG4jIC0gOiBmbG9hdCAqIGZsb2F0ICogZmxvYXQgPSAoODAuLCA4NS4xNzYwMDAwMDAwMDY3NTIxLCAxMjAuKVxuIyAtIDogZmxvYXQgKiBmbG9hdCAqIGZsb2F0ID0gKDgwLiwgODUuMjE2MDAwMDAwMDAwMzQ5MiwgMTIwLilcbiMgLSA6IGZsb2F0ICogZmxvYXQgKiBmbG9hdCA9ICg4MC4sIDgwLjYyMjAwMDAwMDAwMzAyNjgsIDEyMC4pXG5cbiopXG5cbigqIFJldHVybiB0aGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIHZbaTAsaTFbICopXG5sZXQgcmVjIHN1bXNxIHYgaTAgaTEgPVxuICBpZiBpMCA+PSBpMSB0aGVuIDAuMFxuICBlbHNlIGlmIGkxID0gaTAgKyAxIHRoZW4gU3RkbGliLmZsb2F0IHYuKGkwKSAqLiBTdGRsaWIuZmxvYXQgdi4oaTApXG4gIGVsc2Ugc3Vtc3EgdiBpMCAoKGkwK2kxKS8yKSArLiBzdW1zcSB2ICgoaTAraTEpLzIpIGkxXG5cblxubGV0IGNoaXNxdWFyZSBnIG4gciA9XG4gIGlmIG4gPD0gMTAgKiByIHRoZW4gaW52YWxpZF9hcmcgXCJjaGlzcXVhcmVcIjtcbiAgbGV0IGYgPSBBcnJheS5tYWtlIHIgMCBpblxuICBmb3IgaSA9IDEgdG8gbiBkb1xuICAgIGxldCB0ID0gZyByIGluXG4gICAgZi4odCkgPC0gZi4odCkgKyAxXG4gIGRvbmU7XG4gIGxldCB0ID0gc3Vtc3EgZiAwIHJcbiAgYW5kIHIgPSBTdGRsaWIuZmxvYXQgclxuICBhbmQgbiA9IFN0ZGxpYi5mbG9hdCBuIGluXG4gIGxldCBzciA9IDIuMCAqLiBzcXJ0IHIgaW5cbiAgKHIgLS4gc3IsICAgKHIgKi4gdCAvLiBuKSAtLiBuLCAgIHIgKy4gc3IpXG5cblxuKCogVGhpcyBpcyB0byB0ZXN0IGZvciBsaW5lYXIgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3VjY2Vzc2l2ZSByYW5kb20gbnVtYmVycy5cbiopXG5sZXQgc3QgPSByZWYgMFxubGV0IGluaXRfZGlmZiByID0gc3QgOj0gaW50IHJcbmxldCBkaWZmIHIgPVxuICBsZXQgeDEgPSAhc3RcbiAgYW5kIHgyID0gaW50IHJcbiAgaW5cbiAgc3QgOj0geDI7XG4gIGlmIHgxID49IHgyIHRoZW5cbiAgICB4MSAtIHgyXG4gIGVsc2VcbiAgICByICsgeDEgLSB4MlxuXG5cbmxldCBzdDEgPSByZWYgMFxuYW5kIHN0MiA9IHJlZiAwXG5cblxuKCogVGhpcyBpcyB0byB0ZXN0IGZvciBxdWFkcmF0aWMgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3VjY2Vzc2l2ZSByYW5kb21cbiAgIG51bWJlcnMuXG4qKVxubGV0IGluaXRfZGlmZjIgciA9IHN0MSA6PSBpbnQgcjsgc3QyIDo9IGludCByXG5sZXQgZGlmZjIgciA9XG4gIGxldCB4MSA9ICFzdDFcbiAgYW5kIHgyID0gIXN0MlxuICBhbmQgeDMgPSBpbnQgclxuICBpblxuICBzdDEgOj0geDI7XG4gIHN0MiA6PSB4MztcbiAgKHgzIC0geDIgLSB4MiArIHgxICsgMipyKSBtb2QgclxuXG5cbioqKioqKioqKioqKioqKioqKioqKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgbGlzdHMuICopXG50eXBlICdhIHQgPSAnYSBsaXN0ID0gW10gfCAoOjopIG9mICdhICogJ2EgbGlzdFxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJlYyBsZW5ndGhfYXV4IGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gbGVuXG4gIHwgXzo6bCAtPiBsZW5ndGhfYXV4IChsZW4gKyAxKSBsXG5cbmxldCBsZW5ndGggbCA9IGxlbmd0aF9hdXggMCBsXG5cbmxldCBjb25zIGEgbCA9IGE6OmxcblxubGV0IGhkID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcImhkXCJcbiAgfCBhOjpfIC0+IGFcblxubGV0IHRsID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcInRsXCJcbiAgfCBfOjpsIC0+IGxcblxubGV0IG50aCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gZmFpbHdpdGggXCJudGhcIlxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IG50aF9vcHQgbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IGFwcGVuZCA9IChAKVxuXG5sZXQgcmVjIHJldl9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBhIDo6IGwgLT4gcmV2X2FwcGVuZCBsIChhIDo6IGwyKVxuXG5sZXQgcmV2IGwgPSByZXZfYXBwZW5kIGwgW11cblxubGV0IHJlYyBpbml0X3RhaWxyZWNfYXV4IGFjYyBpIG4gZiA9XG4gIGlmIGkgPj0gbiB0aGVuIGFjY1xuICBlbHNlIGluaXRfdGFpbHJlY19hdXggKGYgaSA6OiBhY2MpIChpKzEpIG4gZlxuXG5sZXQgcmVjIGluaXRfYXV4IGkgbiBmID1cbiAgaWYgaSA+PSBuIHRoZW4gW11cbiAgZWxzZVxuICAgIGxldCByID0gZiBpIGluXG4gICAgciA6OiBpbml0X2F1eCAoaSsxKSBuIGZcblxubGV0IHJldl9pbml0X3RocmVzaG9sZCA9XG4gIG1hdGNoIFN5cy5iYWNrZW5kX3R5cGUgd2l0aFxuICB8IFN5cy5OYXRpdmUgfCBTeXMuQnl0ZWNvZGUgLT4gMTBfMDAwXG4gICgqIFdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN0YWNrLCBiZXR0ZXIgYmUgc2FmZSBhbmQgYXNzdW1lIGl0J3NcbiAgICAgc21hbGwuICopXG4gIHwgU3lzLk90aGVyIF8gLT4gNTBcblxubGV0IGluaXQgbGVuIGYgPVxuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LmluaXRcIiBlbHNlXG4gIGlmIGxlbiA+IHJldl9pbml0X3RocmVzaG9sZCB0aGVuIHJldiAoaW5pdF90YWlscmVjX2F1eCBbXSAwIGxlbiBmKVxuICBlbHNlIGluaXRfYXV4IDAgbGVuIGZcblxubGV0IHJlYyBmbGF0dGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IGw6OnIgLT4gbCBAIGZsYXR0ZW4gclxuXG5sZXQgY29uY2F0ID0gZmxhdHRlblxuXG5sZXQgcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IGE6OmwgLT4gbGV0IHIgPSBmIGEgaW4gciA6OiBtYXAgZiBsXG5cbmxldCByZWMgbWFwaSBpIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgYTo6bCAtPiBsZXQgciA9IGYgaSBhIGluIHIgOjogbWFwaSAoaSArIDEpIGYgbFxuXG5sZXQgbWFwaSBmIGwgPSBtYXBpIDAgZiBsXG5cbmxldCByZXZfbWFwIGYgbCA9XG4gIGxldCByZWMgcm1hcF9mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgYTo6bCAtPiBybWFwX2YgKGYgYSA6OiBhY2N1KSBsXG4gIGluXG4gIHJtYXBfZiBbXSBsXG5cblxubGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGE7IGl0ZXIgZiBsXG5cbmxldCByZWMgaXRlcmkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBpIGE7IGl0ZXJpIChpICsgMSkgZiBsXG5cbmxldCBpdGVyaSBmIGwgPSBpdGVyaSAwIGYgbFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjY3UgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGZvbGRfbGVmdCBmIChmIGFjY3UgYSkgbFxuXG5sZXQgcmVjIGZvbGRfcmlnaHQgZiBsIGFjY3UgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmIGEgKGZvbGRfcmlnaHQgZiBsIGFjY3UpXG5cbmxldCByZWMgbWFwMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IFtdXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBsZXQgciA9IGYgYTEgYTIgaW4gciA6OiBtYXAyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lm1hcDJcIlxuXG5sZXQgcmV2X21hcDIgZiBsMSBsMiA9XG4gIGxldCByZWMgcm1hcDJfZiBhY2N1IGwxIGwyID1cbiAgICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgfCAoW10sIFtdKSAtPiBhY2N1XG4gICAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHJtYXAyX2YgKGYgYTEgYTIgOjogYWNjdSkgbDEgbDJcbiAgICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmV2X21hcDJcIlxuICBpblxuICBybWFwMl9mIFtdIGwxIGwyXG5cblxubGV0IHJlYyBpdGVyMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+ICgpXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyOyBpdGVyMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5pdGVyMlwiXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZm9sZF9sZWZ0MiBmIChmIGFjY3UgYTEgYTIpIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX2xlZnQyXCJcblxubGV0IHJlYyBmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMiAoZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1KVxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9yaWdodDJcIlxuXG5sZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gdHJ1ZVxuICB8IGE6OmwgLT4gcCBhICYmIGZvcl9hbGwgcCBsXG5cbmxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBwIGEgfHwgZXhpc3RzIHAgbFxuXG5sZXQgcmVjIGZvcl9hbGwyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gdHJ1ZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiAmJiBmb3JfYWxsMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb3JfYWxsMlwiXG5cbmxldCByZWMgZXhpc3RzMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGZhbHNlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyIHx8IGV4aXN0czIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZXhpc3RzMlwiXG5cbmxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtIHggbFxuXG5sZXQgcmVjIG1lbXEgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGEgPT0geCB8fCBtZW1xIHggbFxuXG5sZXQgcmVjIGFzc29jIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGIgZWxzZSBhc3NvYyB4IGxcblxubGV0IHJlYyBhc3NvY19vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIFNvbWUgYiBlbHNlIGFzc29jX29wdCB4IGxcblxubGV0IHJlYyBhc3NxIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIGIgZWxzZSBhc3NxIHggbFxuXG5sZXQgcmVjIGFzc3Ffb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBTb21lIGIgZWxzZSBhc3NxX29wdCB4IGxcblxubGV0IHJlYyBtZW1fYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtX2Fzc29jIHggbFxuXG5sZXQgcmVjIG1lbV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gYSA9PSB4IHx8IG1lbV9hc3NxIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NvYyB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT4gaWYgYSA9PSB4IHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc3EgeCBsXG5cbmxldCByZWMgZmluZCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4geCBlbHNlIGZpbmQgcCBsXG5cbmxldCByZWMgZmluZF9vcHQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kX29wdCBwIGxcblxubGV0IHJlYyBmaW5kX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCBmIGxcbiAgICAgZW5kXG5cbmxldCBmaW5kX2FsbCBwID1cbiAgbGV0IHJlYyBmaW5kIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IHJldiBhY2N1XG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIGZpbmQgKHggOjogYWNjdSkgbCBlbHNlIGZpbmQgYWNjdSBsIGluXG4gIGZpbmQgW11cblxubGV0IGZpbHRlciA9IGZpbmRfYWxsXG5cbmxldCBmaWx0ZXJpIHAgbCA9XG4gIGxldCByZWMgYXV4IGkgYWNjID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByZXYgYWNjXG4gIHwgeDo6bCAtPiBhdXggKGkgKyAxKSAoaWYgcCBpIHggdGhlbiB4OjphY2MgZWxzZSBhY2MpIGxcbiAgaW5cbiAgYXV4IDAgW10gbFxuXG5sZXQgZmlsdGVyX21hcCBmID1cbiAgbGV0IHJlYyBhdXggYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjdVxuICAgIHwgeCA6OiBsIC0+XG4gICAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBhdXggYWNjdSBsXG4gICAgICAgIHwgU29tZSB2IC0+IGF1eCAodiA6OiBhY2N1KSBsXG4gIGluXG4gIGF1eCBbXVxuXG5sZXQgY29uY2F0X21hcCBmIGwgPVxuICBsZXQgcmVjIGF1eCBmIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjXG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICBsZXQgeHMgPSBmIHggaW5cbiAgICAgICBhdXggZiAocmV2X2FwcGVuZCB4cyBhY2MpIGxcbiAgaW4gYXV4IGYgW10gbFxuXG5sZXQgZm9sZF9sZWZ0X21hcCBmIGFjY3UgbCA9XG4gIGxldCByZWMgYXV4IGFjY3UgbF9hY2N1ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY3UsIHJldiBsX2FjY3VcbiAgICB8IHggOjogbCAtPlxuICAgICAgICBsZXQgYWNjdSwgeCA9IGYgYWNjdSB4IGluXG4gICAgICAgIGF1eCBhY2N1ICh4IDo6IGxfYWNjdSkgbCBpblxuICBhdXggYWNjdSBbXSBsXG5cbmxldCBwYXJ0aXRpb24gcCBsID1cbiAgbGV0IHJlYyBwYXJ0IHllcyBubyA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gKHJldiB5ZXMsIHJldiBubylcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4gcGFydCAoeCA6OiB5ZXMpIG5vIGwgZWxzZSBwYXJ0IHllcyAoeCA6OiBubykgbCBpblxuICBwYXJ0IFtdIFtdIGxcblxubGV0IHBhcnRpdGlvbl9tYXAgcCBsID1cbiAgbGV0IHJlYyBwYXJ0IGxlZnQgcmlnaHQgPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgbGVmdCwgcmV2IHJpZ2h0KVxuICB8IHggOjogbCAtPlxuICAgICBiZWdpbiBtYXRjaCBwIHggd2l0aFxuICAgICAgIHwgRWl0aGVyLkxlZnQgdiAtPiBwYXJ0ICh2IDo6IGxlZnQpIHJpZ2h0IGxcbiAgICAgICB8IEVpdGhlci5SaWdodCB2IC0+IHBhcnQgbGVmdCAodiA6OiByaWdodCkgbFxuICAgICBlbmRcbiAgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCByZWMgc3BsaXQgPSBmdW5jdGlvblxuICAgIFtdIC0+IChbXSwgW10pXG4gIHwgKHgseSk6OmwgLT5cbiAgICAgIGxldCAocngsIHJ5KSA9IHNwbGl0IGwgaW4gKHg6OnJ4LCB5OjpyeSlcblxubGV0IHJlYyBjb21iaW5lIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IFtdXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiAoYTEsIGEyKSA6OiBjb21iaW5lIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5jb21iaW5lXCJcblxuKCoqIHNvcnRpbmcgKilcblxubGV0IHJlYyBtZXJnZSBjbXAgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBsMiAtPiBsMlxuICB8IGwxLCBbXSAtPiBsMVxuICB8IGgxIDo6IHQxLCBoMiA6OiB0MiAtPlxuICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgIHRoZW4gaDEgOjogbWVyZ2UgY21wIHQxIGwyXG4gICAgICBlbHNlIGgyIDo6IG1lcmdlIGNtcCBsMSB0MlxuXG5cbmxldCBzdGFibGVfc29ydCBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBpZiBjbXAgaDEgaDIgPD0gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZSB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlIGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyByZXZfbWVyZ2VfcmV2IGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBpZiBjbXAgaDEgaDIgPiAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlX3JldiB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlX3JldiBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPSBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV0gaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGlmIGNtcCB4MSB4MiA8PSAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA8PSAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzIDw9IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA8PSAwIHRoZW4gW3gyOyB4MzsgeDFdXG4gICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyID4gMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV0gaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGlmIGNtcCB4MSB4MiA+IDAgdGhlblxuICAgICAgICAgICAgaWYgY21wIHgyIHgzID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPiAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgyIHgzID4gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHNvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlIHMxIHMyIFtdLCB0bClcbiAgaW5cbiAgbGV0IGxlbiA9IGxlbmd0aCBsIGluXG4gIGlmIGxlbiA8IDIgdGhlbiBsIGVsc2UgZnN0IChzb3J0IGxlbiBsKVxuXG5cbmxldCBzb3J0ID0gc3RhYmxlX3NvcnRcbmxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4oKiBOb3RlOiBvbiBhIGxpc3Qgb2YgbGVuZ3RoIGJldHdlZW4gYWJvdXQgMTAwMDAwIChkZXBlbmRpbmcgb24gdGhlIG1pbm9yXG4gICBoZWFwIHNpemUgYW5kIHRoZSB0eXBlIG9mIHRoZSBsaXN0KSBhbmQgU3lzLm1heF9hcnJheV9zaXplLCBpdCBpc1xuICAgYWN0dWFsbHkgZmFzdGVyIHRvIHVzZSB0aGUgZm9sbG93aW5nLCBidXQgaXQgbWlnaHQgYWxzbyB1c2UgbW9yZSBtZW1vcnlcbiAgIGJlY2F1c2UgdGhlIGFyZ3VtZW50IGxpc3QgY2Fubm90IGJlIGRlYWxsb2NhdGVkIGluY3JlbWVudGFsbHkuXG5cbiAgIEFsc28sIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIHRoaXMgY29kZSBvciBpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mIG9ial90cnVuY2F0ZS5cblxuZXh0ZXJuYWwgb2JqX3RydW5jYXRlIDogJ2EgYXJyYXkgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfb2JqX3RydW5jYXRlXCJcblxubGV0IGFycmF5X3RvX2xpc3RfaW5fcGxhY2UgYSA9XG4gIGxldCBsID0gQXJyYXkubGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGFjY3UgbiBwID1cbiAgICBpZiBwIDw9IDAgdGhlbiBhY2N1IGVsc2UgYmVnaW5cbiAgICAgIGlmIHAgPSBuIHRoZW4gYmVnaW5cbiAgICAgICAgb2JqX3RydW5jYXRlIGEgcDtcbiAgICAgICAgbG9vcCAoYS4ocC0xKSA6OiBhY2N1KSAobi0xMDAwKSAocC0xKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbG9vcCAoYS4ocC0xKSA6OiBhY2N1KSBuIChwLTEpXG4gICAgICBlbmRcbiAgICBlbmRcbiAgaW5cbiAgbG9vcCBbXSAobC0xMDAwKSBsXG5cblxubGV0IHN0YWJsZV9zb3J0IGNtcCBsID1cbiAgbGV0IGEgPSBBcnJheS5vZl9saXN0IGwgaW5cbiAgQXJyYXkuc3RhYmxlX3NvcnQgY21wIGE7XG4gIGFycmF5X3RvX2xpc3RfaW5fcGxhY2UgYVxuXG4qKVxuXG5cbigqKiBzb3J0aW5nICsgcmVtb3ZpbmcgZHVwbGljYXRlcyAqKVxuXG5sZXQgc29ydF91bmlxIGNtcCBsID1cbiAgbGV0IHJlYyByZXZfbWVyZ2UgbDEgbDIgYWNjdSA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGwyIGFjY3VcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGwxIGFjY3VcbiAgICB8IGgxOjp0MSwgaDI6OnQyIC0+XG4gICAgICAgIGxldCBjID0gY21wIGgxIGgyIGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gcmV2X21lcmdlIHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIHJldl9tZXJnZSB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlIGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyByZXZfbWVyZ2VfcmV2IGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZV9yZXYgdDEgdDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIGlmIGMgPiAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlX3JldiB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlX3JldiBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDFdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4Ml0gZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDNdIGVsc2UgW3gzOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSByZXZfc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSByZXZfc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlX3JldiBzMSBzMiBbXSwgdGwpXG4gIGFuZCByZXZfc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDFdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4Ml0gZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDNdIGVsc2UgW3gzOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgcmVjIGNvbXBhcmVfbGVuZ3RocyBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIFtdIC0+IDBcbiAgfCBbXSwgXyAtPiAtMVxuICB8IF8sIFtdIC0+IDFcbiAgfCBfIDo6IGwxLCBfIDo6IGwyIC0+IGNvbXBhcmVfbGVuZ3RocyBsMSBsMlxuOztcblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aF93aXRoIGwgbiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgaWYgbiA9IDAgdGhlbiAwIGVsc2VcbiAgICAgIGlmIG4gPiAwIHRoZW4gLTEgZWxzZSAxXG4gIHwgXyA6OiBsIC0+XG4gICAgaWYgbiA8PSAwIHRoZW4gMSBlbHNlXG4gICAgICBjb21wYXJlX2xlbmd0aF93aXRoIGwgKG4tMSlcbjs7XG5cbigqKiB7MSBDb21wYXJpc29ufSAqKVxuXG4oKiBOb3RlOiB3ZSBhcmUgKm5vdCogc2hvcnRjdXR0aW5nIHRoZSBsaXN0IGJ5IHVzaW5nXG4gICBbTGlzdC5jb21wYXJlX2xlbmd0aHNdIGZpcnN0OyB0aGlzIG1heSBiZSBzbG93ZXIgb24gbG9uZyBsaXN0c1xuICAgaW1tZWRpYXRlbHkgc3RhcnQgd2l0aCBkaXN0aW5jdCBlbGVtZW50cy4gSXQgaXMgYWxzbyBpbmNvcnJlY3QgZm9yXG4gICBbY29tcGFyZV0gYmVsb3csIGFuZCBpdCBpcyBiZXR0ZXIgKHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZSkgdG9cbiAgIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3IgYm90aCBmdW5jdGlvbnMuICopXG5sZXQgcmVjIGVxdWFsIGVxIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gdHJ1ZVxuICB8IFtdLCBfOjpfIHwgXzo6XywgW10gLT4gZmFsc2VcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPiBlcSBhMSBhMiAmJiBlcXVhbCBlcSBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfOjpfIC0+IC0xXG4gIHwgXzo6XywgW10gLT4gMVxuICB8IGExOjpsMSwgYTI6OmwyIC0+XG4gICAgbGV0IGMgPSBjbXAgYTEgYTIgaW5cbiAgICBpZiBjIDw+IDAgdGhlbiBjXG4gICAgZWxzZSBjb21wYXJlIGNtcCBsMSBsMlxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGwgPVxuICBsZXQgcmVjIGF1eCBsICgpID0gbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBTZXEuTmlsXG4gICAgfCB4IDo6IHRhaWwgLT4gU2VxLkNvbnMgKHgsIGF1eCB0YWlsKVxuICBpblxuICBhdXggbFxuXG5sZXQgb2Zfc2VxIHNlcSA9XG4gIGxldCByZWMgZGlyZWN0IGRlcHRoIHNlcSA6IF8gbGlzdCA9XG4gICAgaWYgZGVwdGg9MFxuICAgIHRoZW5cbiAgICAgIFNlcS5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiB4OjphY2MpIFtdIHNlcVxuICAgICAgfD4gcmV2ICgqIHRhaWxyZWMgKilcbiAgICBlbHNlIG1hdGNoIHNlcSgpIHdpdGhcbiAgICAgIHwgU2VxLk5pbCAtPiBbXVxuICAgICAgfCBTZXEuQ29ucyAoeCwgbmV4dCkgLT4geCA6OiBkaXJlY3QgKGRlcHRoLTEpIG5leHRcbiAgaW5cbiAgZGlyZWN0IDUwMCBzZXFcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gaW5fY2hhbm5lbFxuXG50eXBlIG9wZW5fZmxhZyA9IFN0ZGxpYi5vcGVuX2ZsYWcgPVxuICB8IE9wZW5fcmRvbmx5XG4gIHwgT3Blbl93cm9ubHlcbiAgfCBPcGVuX2FwcGVuZFxuICB8IE9wZW5fY3JlYXRcbiAgfCBPcGVuX3RydW5jXG4gIHwgT3Blbl9leGNsXG4gIHwgT3Blbl9iaW5hcnlcbiAgfCBPcGVuX3RleHRcbiAgfCBPcGVuX25vbmJsb2NrXG5cbmxldCBzdGRpbiA9IFN0ZGxpYi5zdGRpblxubGV0IG9wZW5fYmluID0gU3RkbGliLm9wZW5faW5fYmluXG5sZXQgb3Blbl90ZXh0ID0gU3RkbGliLm9wZW5faW5cbmxldCBvcGVuX2dlbiA9IFN0ZGxpYi5vcGVuX2luX2dlblxuXG5sZXQgd2l0aF9vcGVuIG9wZW5mdW4gcyBmID1cbiAgbGV0IGljID0gb3BlbmZ1biBzIGluXG4gIEZ1bi5wcm90ZWN0IH5maW5hbGx5OihmdW4gKCkgLT4gU3RkbGliLmNsb3NlX2luX25vZXJyIGljKVxuICAgIChmdW4gKCkgLT4gZiBpYylcblxubGV0IHdpdGhfb3Blbl9iaW4gcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luX2JpbiBzIGZcblxubGV0IHdpdGhfb3Blbl90ZXh0IHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9pbiBzIGZcblxubGV0IHdpdGhfb3Blbl9nZW4gZmxhZ3MgcGVybSBzIGYgPVxuICB3aXRoX29wZW4gKFN0ZGxpYi5vcGVuX2luX2dlbiBmbGFncyBwZXJtKSBzIGZcblxubGV0IHNlZWsgPSBTdGRsaWIuTGFyZ2VGaWxlLnNlZWtfaW5cbmxldCBwb3MgPSBTdGRsaWIuTGFyZ2VGaWxlLnBvc19pblxubGV0IGxlbmd0aCA9IFN0ZGxpYi5MYXJnZUZpbGUuaW5fY2hhbm5lbF9sZW5ndGhcbmxldCBjbG9zZSA9IFN0ZGxpYi5jbG9zZV9pblxubGV0IGNsb3NlX25vZXJyID0gU3RkbGliLmNsb3NlX2luX25vZXJyXG5cbmxldCBpbnB1dF9jaGFyIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICB8IGMgLT4gU29tZSBjXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0X2J5dGUgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfYnl0ZSBpYyB3aXRoXG4gIHwgbiAtPiBTb21lIG5cbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfbGluZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9saW5lIGljIHdpdGhcbiAgfCBzIC0+IFNvbWUgc1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dCA9IFN0ZGxpYi5pbnB1dFxuXG5sZXQgcmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiB3aXRoXG4gIHwgKCkgLT4gU29tZSAoKVxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG4oKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGludG8gW2J1Zl0sIHN0YXJ0aW5nIGF0IFtvZnNdLiBSZXR1cm4gdG90YWwgYnl0ZXNcbiAgIHJlYWQuICopXG5sZXQgcmVhZF91cHRvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIG9mcyBsZW4gPVxuICAgIGlmIGxlbiA9IDAgdGhlbiBvZnNcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IFN0ZGxpYi5pbnB1dCBpYyBidWYgb2ZzIGxlbiBpblxuICAgICAgaWYgciA9IDAgdGhlblxuICAgICAgICBvZnNcbiAgICAgIGVsc2VcbiAgICAgICAgbG9vcCAob2ZzICsgcikgKGxlbiAtIHIpXG4gICAgZW5kXG4gIGluXG4gIGxvb3Agb2ZzIGxlbiAtIG9mc1xuXG4oKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIHJldHVybiBhIGJ1ZmZlciB3aXRoID49IChvZnMgKyBuKSBieXRlcyBvZiBzdG9yYWdlLFxuICAgYW5kIHN1Y2ggdGhhdCBpdCBjb2luY2lkZXMgd2l0aCBbYnVmXSBhdCBpbmRpY2VzIDwgW29mc10uXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZXF1YWwgdG8gW2J1Zl0gaXRzZWxmIGlmIGl0IGFscmVhZHkgaGFzIHN1ZmZpY2llbnRcbiAgIGZyZWUgc3BhY2UuXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgKmZld2VyKiB0aGFuIFtvZnMgKyBuXSBieXRlcyBvZiBzdG9yYWdlIGlmIHRoaXNcbiAgIG51bWJlciBpcyA+IFtTeXMubWF4X3N0cmluZ19sZW5ndGhdLiBIb3dldmVyIHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbFxuICAgKmFsd2F5cyogaGF2ZSA+IFtvZnNdIGJ5dGVzIG9mIHN0b3JhZ2UuIEluIHRoZSBsaW1pdGluZyBjYXNlIHdoZW4gW29mcyA9IGxlblxuICAgPSBTeXMubWF4X3N0cmluZ19sZW5ndGhdIChzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXNpemUgdGhlIGJ1ZmZlciBhdFxuICAgYWxsKSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcblxubGV0IGVuc3VyZSBidWYgb2ZzIG4gPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPj0gb2ZzICsgbiB0aGVuIGJ1ZlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG5ld19sZW4gPSByZWYgbGVuIGluXG4gICAgd2hpbGUgIW5ld19sZW4gPCBvZnMgKyBuIGRvXG4gICAgICBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiArIDFcbiAgICBkb25lO1xuICAgIGxldCBuZXdfbGVuID0gIW5ld19sZW4gaW5cbiAgICBsZXQgbmV3X2xlbiA9XG4gICAgICBpZiBuZXdfbGVuIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIG5ld19sZW5cbiAgICAgIGVsc2UgaWYgb2ZzIDwgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIGZhaWx3aXRoIFwiSW5fY2hhbm5lbC5pbnB1dF9hbGw6IGNoYW5uZWwgY29udGVudCBcXFxuICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoXCJcbiAgICBpblxuICAgIGxldCBuZXdfYnVmID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1ZiAwIG5ld19idWYgMCBvZnM7XG4gICAgbmV3X2J1ZlxuICBlbmRcblxubGV0IGlucHV0X2FsbCBpYyA9XG4gIGxldCBjaHVua19zaXplID0gNjU1MzYgaW4gKCogSU9fQlVGRkVSX1NJWkUgKilcbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgdHJ5XG4gICAgICBTdGRsaWIuaW5fY2hhbm5lbF9sZW5ndGggaWMgLSBTdGRsaWIucG9zX2luIGljXG4gICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgLTFcbiAgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9IGlmIGluaXRpYWxfc2l6ZSA8IDAgdGhlbiBjaHVua19zaXplIGVsc2UgaW5pdGlhbF9zaXplIGluXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIGlmIGluaXRpYWxfc2l6ZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgaW5pdGlhbF9zaXplXG4gICAgZWxzZVxuICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gIGluXG4gIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgaW5pdGlhbF9zaXplIGluXG4gIGxldCBucmVhZCA9IHJlYWRfdXB0byBpYyBidWYgMCBpbml0aWFsX3NpemUgaW5cbiAgaWYgbnJlYWQgPCBpbml0aWFsX3NpemUgdGhlbiAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIHBhcnRpYWxseSBmaWxsZWQgKilcbiAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIG5yZWFkXG4gIGVsc2UgYmVnaW4gKCogbnJlYWQgPSBpbml0aWFsX3NpemUsIG1heWJlIEVPRiByZWFjaGVkICopXG4gICAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+XG4gICAgICAgICgqIEVPRiByZWFjaGVkLCBidWZmZXIgaXMgY29tcGxldGVseSBmaWxsZWQgKilcbiAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgICB8IGMgLT5cbiAgICAgICAgKCogRU9GIG5vdCByZWFjaGVkICopXG4gICAgICAgIGxldCByZWMgbG9vcCBidWYgb2ZzID1cbiAgICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBvZnMgY2h1bmtfc2l6ZSBpblxuICAgICAgICAgIGxldCByZW0gPSBCeXRlcy5sZW5ndGggYnVmIC0gb2ZzIGluXG4gICAgICAgICAgKCogW3JlbV0gY2FuIGJlIDwgW2NodW5rX3NpemVdIGlmIGJ1ZmZlciBzaXplIGNsb3NlIHRvXG4gICAgICAgICAgICAgW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKilcbiAgICAgICAgICBsZXQgciA9IHJlYWRfdXB0byBpYyBidWYgb2ZzIHJlbSBpblxuICAgICAgICAgIGlmIHIgPCByZW0gdGhlbiAoKiBFT0YgcmVhY2hlZCAqKVxuICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCAob2ZzICsgcilcbiAgICAgICAgICBlbHNlICgqIHIgPSByZW0gKilcbiAgICAgICAgICAgIGxvb3AgYnVmIChvZnMgKyByZW0pXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG5yZWFkIChjaHVua19zaXplICsgMSkgaW5cbiAgICAgICAgQnl0ZXMuc2V0IGJ1ZiBucmVhZCBjO1xuICAgICAgICBsb29wIGJ1ZiAobnJlYWQgKyAxKVxuICBlbmRcblxubGV0IHNldF9iaW5hcnlfbW9kZSA9IFN0ZGxpYi5zZXRfYmluYXJ5X21vZGVfaW5cbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gb3V0X2NoYW5uZWxcblxudHlwZSBvcGVuX2ZsYWcgPSBTdGRsaWIub3Blbl9mbGFnID1cbiAgfCBPcGVuX3Jkb25seVxuICB8IE9wZW5fd3Jvbmx5XG4gIHwgT3Blbl9hcHBlbmRcbiAgfCBPcGVuX2NyZWF0XG4gIHwgT3Blbl90cnVuY1xuICB8IE9wZW5fZXhjbFxuICB8IE9wZW5fYmluYXJ5XG4gIHwgT3Blbl90ZXh0XG4gIHwgT3Blbl9ub25ibG9ja1xuXG5sZXQgc3Rkb3V0ID0gU3RkbGliLnN0ZG91dFxubGV0IHN0ZGVyciA9IFN0ZGxpYi5zdGRlcnJcbmxldCBvcGVuX2JpbiA9IFN0ZGxpYi5vcGVuX291dF9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9vdXRcbmxldCBvcGVuX2dlbiA9IFN0ZGxpYi5vcGVuX291dF9nZW5cblxubGV0IHdpdGhfb3BlbiBvcGVuZnVuIHMgZiA9XG4gIGxldCBvYyA9IG9wZW5mdW4gcyBpblxuICBGdW4ucHJvdGVjdCB+ZmluYWxseTooZnVuICgpIC0+IFN0ZGxpYi5jbG9zZV9vdXRfbm9lcnIgb2MpXG4gICAgKGZ1biAoKSAtPiBmIG9jKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5fb3V0X2JpbiBzIGZcblxubGV0IHdpdGhfb3Blbl90ZXh0IHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9vdXQgcyBmXG5cbmxldCB3aXRoX29wZW5fZ2VuIGZsYWdzIHBlcm0gcyBmID1cbiAgd2l0aF9vcGVuIChTdGRsaWIub3Blbl9vdXRfZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19vdXRcbmxldCBwb3MgPSBTdGRsaWIuTGFyZ2VGaWxlLnBvc19vdXRcbmxldCBsZW5ndGggPSBTdGRsaWIuTGFyZ2VGaWxlLm91dF9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX291dFxubGV0IGNsb3NlX25vZXJyID0gU3RkbGliLmNsb3NlX291dF9ub2VyclxubGV0IGZsdXNoID0gU3RkbGliLmZsdXNoXG5sZXQgZmx1c2hfYWxsID0gU3RkbGliLmZsdXNoX2FsbFxubGV0IG91dHB1dF9jaGFyID0gU3RkbGliLm91dHB1dF9jaGFyXG5sZXQgb3V0cHV0X2J5dGUgPSBTdGRsaWIub3V0cHV0X2J5dGVcbmxldCBvdXRwdXRfc3RyaW5nID0gU3RkbGliLm91dHB1dF9zdHJpbmdcbmxldCBvdXRwdXRfYnl0ZXMgPSBTdGRsaWIub3V0cHV0X2J5dGVzXG5sZXQgb3V0cHV0ID0gU3RkbGliLm91dHB1dFxubGV0IG91dHB1dF9zdWJzdHJpbmcgPSBTdGRsaWIub3V0cHV0X3N1YnN0cmluZ1xubGV0IHNldF9iaW5hcnlfbW9kZSA9IFN0ZGxpYi5zZXRfYmluYXJ5X21vZGVfb3V0XG5cbmV4dGVybmFsIHNldF9idWZmZXJlZCA6IHQgLT4gYm9vbCAtPiB1bml0ID0gXCJjYW1sX21sX3NldF9idWZmZXJlZFwiXG5cbmV4dGVybmFsIGlzX2J1ZmZlcmVkIDogdCAtPiBib29sID0gXCJjYW1sX21sX2lzX2J1ZmZlcmVkXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgR2FicmllbCBTY2hlcmVyLCBwcm9qZXQgUGFyc2lmYWwsIElOUklBIFNhY2xheSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAoJ2EsICdiKSB0ID0gTGVmdCBvZiAnYSB8IFJpZ2h0IG9mICdiXG5cbmxldCBsZWZ0IHYgPSBMZWZ0IHZcbmxldCByaWdodCB2ID0gUmlnaHQgdlxuXG5sZXQgaXNfbGVmdCA9IGZ1bmN0aW9uXG58IExlZnQgXyAtPiB0cnVlXG58IFJpZ2h0IF8gLT4gZmFsc2VcblxubGV0IGlzX3JpZ2h0ID0gZnVuY3Rpb25cbnwgTGVmdCBfIC0+IGZhbHNlXG58IFJpZ2h0IF8gLT4gdHJ1ZVxuXG5sZXQgZmluZF9sZWZ0ID0gZnVuY3Rpb25cbnwgTGVmdCB2IC0+IFNvbWUgdlxufCBSaWdodCBfIC0+IE5vbmVcblxubGV0IGZpbmRfcmlnaHQgPSBmdW5jdGlvblxufCBMZWZ0IF8gLT4gTm9uZVxufCBSaWdodCB2IC0+IFNvbWUgdlxuXG5sZXQgbWFwX2xlZnQgZiA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBMZWZ0IChmIHYpXG58IFJpZ2h0IF8gYXMgZSAtPiBlXG5cbmxldCBtYXBfcmlnaHQgZiA9IGZ1bmN0aW9uXG58IExlZnQgXyBhcyBlIC0+IGVcbnwgUmlnaHQgdiAtPiBSaWdodCAoZiB2KVxuXG5sZXQgbWFwIH5sZWZ0IH5yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBMZWZ0IChsZWZ0IHYpXG58IFJpZ2h0IHYgLT4gUmlnaHQgKHJpZ2h0IHYpXG5cbmxldCBmb2xkIH5sZWZ0IH5yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBsZWZ0IHZcbnwgUmlnaHQgdiAtPiByaWdodCB2XG5cbmxldCBpdGVyID0gZm9sZFxuXG5sZXQgZm9yX2FsbCA9IGZvbGRcblxubGV0IGVxdWFsIH5sZWZ0IH5yaWdodCBlMSBlMiA9IG1hdGNoIGUxLCBlMiB3aXRoXG58IExlZnQgdjEsIExlZnQgdjIgLT4gbGVmdCB2MSB2MlxufCBSaWdodCB2MSwgUmlnaHQgdjIgLT4gcmlnaHQgdjEgdjJcbnwgTGVmdCBfLCBSaWdodCBfIHwgUmlnaHQgXywgTGVmdCBfIC0+IGZhbHNlXG5cbmxldCBjb21wYXJlIH5sZWZ0IH5yaWdodCBlMSBlMiA9IG1hdGNoIGUxLCBlMiB3aXRoXG58IExlZnQgdjEsIExlZnQgdjIgLT4gbGVmdCB2MSB2MlxufCBSaWdodCB2MSwgUmlnaHQgdjIgLT4gcmlnaHQgdjEgdjJcbnwgTGVmdCBfLCBSaWdodCBfIC0+ICgtMSlcbnwgUmlnaHQgXywgTGVmdCBfIC0+IDFcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtOYXRpdmVpbnRdOiBwcm9jZXNzb3ItbmF0aXZlIGludGVnZXJzICopXG5cbmV4dGVybmFsIG5lZzogbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9uZWdcIlxuZXh0ZXJuYWwgYWRkOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hZGRcIlxuZXh0ZXJuYWwgc3ViOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9zdWJcIlxuZXh0ZXJuYWwgbXVsOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9tdWxcIlxuZXh0ZXJuYWwgZGl2OiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9kaXZcIlxuZXh0ZXJuYWwgcmVtOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hbmRcIlxuZXh0ZXJuYWwgbG9nb3I6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X29yXCJcbmV4dGVybmFsIGxvZ3hvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQ6IG5hdGl2ZWludCAtPiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfYXNyXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWw6IG5hdGl2ZWludCAtPiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2xzclwiXG5leHRlcm5hbCBvZl9pbnQ6IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50XCJcbmV4dGVybmFsIHRvX2ludDogbmF0aXZlaW50IC0+IGludCA9IFwiJW5hdGl2ZWludF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBuYXRpdmVpbnRcbiAgPSBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogbmF0aXZlaW50IC0+IGZsb2F0XG4gID0gXCJjYW1sX25hdGl2ZWludF90b19mbG9hdFwiIFwiY2FtbF9uYXRpdmVpbnRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMjogaW50MzIgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X29mX2ludDMyXCJcbmV4dGVybmFsIHRvX2ludDMyOiBuYXRpdmVpbnQgLT4gaW50MzIgPSBcIiVuYXRpdmVpbnRfdG9faW50MzJcIlxuXG5sZXQgemVybyA9IDBuXG5sZXQgb25lID0gMW5cbmxldCBtaW51c19vbmUgPSAtMW5cbmxldCBzdWNjIG4gPSBhZGQgbiAxblxubGV0IHByZWQgbiA9IHN1YiBuIDFuXG5sZXQgYWJzIG4gPSBpZiBuID49IDBuIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgc2l6ZSA9IFN5cy53b3JkX3NpemVcbmxldCBtaW5faW50ID0gc2hpZnRfbGVmdCAxbiAoc2l6ZSAtIDEpXG5sZXQgbWF4X2ludCA9IHN1YiBtaW5faW50IDFuXG5sZXQgbG9nbm90IG4gPSBsb2d4b3IgbiAoLTFuKVxuXG5sZXQgdW5zaWduZWRfdG9faW50ID1cbiAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgZnVuIG4gLT5cbiAgICBpZiBjb21wYXJlIHplcm8gbiA8PSAwICYmIGNvbXBhcmUgbiBtYXhfaW50IDw9IDAgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZyA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmc6IHN0cmluZyAtPiBuYXRpdmVpbnQgPSBcImNhbWxfbmF0aXZlaW50X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBuYXRpdmVpbnRcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxubGV0IGVxdWFsICh4OiB0KSAoeTogdCkgPSBjb21wYXJlIHggeSA9IDBcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZVxuICAgYml0bmVzcy4gU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgbiBkIDwgMCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSByIGQgPj0gMCB0aGVuIHN1Y2MgcSBlbHNlIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBPcGVyYXRpb25zIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgKilcblxudHlwZSB0XG5cbnR5cGUgcmF3X2RhdGEgPSBuYXRpdmVpbnRcblxuZXh0ZXJuYWwgcmVwciA6ICdhIC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBvYmogOiB0IC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgbWFnaWMgOiAnYSAtPiAnYiA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGlzX2ludCA6IHQgLT4gYm9vbCA9IFwiJW9ial9pc19pbnRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gaXNfYmxvY2sgYSA9IG5vdCAoaXNfaW50IGEpXG5leHRlcm5hbCB0YWcgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfdGFnXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHNldF90YWcgOiB0IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX29ial9zZXRfdGFnXCJcbmV4dGVybmFsIHNpemUgOiB0IC0+IGludCA9IFwiJW9ial9zaXplXCJcbmV4dGVybmFsIHJlYWNoYWJsZV93b3JkcyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial9yZWFjaGFibGVfd29yZHNcIlxuZXh0ZXJuYWwgZmllbGQgOiB0IC0+IGludCAtPiB0ID0gXCIlb2JqX2ZpZWxkXCJcbmV4dGVybmFsIHNldF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdW5pdCA9IFwiJW9ial9zZXRfZmllbGRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdGFycmF5X2dldFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X3NldCA6XG4gICAgZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiY2FtbF9mbG9hdGFycmF5X3NldFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBkb3VibGVfZmllbGQgeCBpID0gZmxvYXRhcnJheV9nZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaVxubGV0IFtAaW5saW5lIGFsd2F5c10gc2V0X2RvdWJsZV9maWVsZCB4IGkgdiA9XG4gIGZsb2F0YXJyYXlfc2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGkgdlxuZXh0ZXJuYWwgcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgPSBcImNhbWxfb2JqX3Jhd19maWVsZFwiXG5leHRlcm5hbCBzZXRfcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfb2JqX3NldF9yYXdfZmllbGRcIlxuXG5leHRlcm5hbCBuZXdfYmxvY2sgOiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfb2JqX2Jsb2NrXCJcbmV4dGVybmFsIGR1cCA6IHQgLT4gdCA9IFwiY2FtbF9vYmpfZHVwXCJcbmV4dGVybmFsIHRydW5jYXRlIDogdCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9vYmpfdHJ1bmNhdGVcIlxuZXh0ZXJuYWwgYWRkX29mZnNldCA6IHQgLT4gSW50MzIudCAtPiB0ID0gXCJjYW1sX29ial9hZGRfb2Zmc2V0XCJcbmV4dGVybmFsIHdpdGhfdGFnIDogaW50IC0+IHQgLT4gdCA9IFwiY2FtbF9vYmpfd2l0aF90YWdcIlxuXG5sZXQgZmlyc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yX3RhZyA9IDBcbmxldCBsYXN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAyNDVcblxubGV0IGxhenlfdGFnID0gMjQ2XG5sZXQgY2xvc3VyZV90YWcgPSAyNDdcbmxldCBvYmplY3RfdGFnID0gMjQ4XG5sZXQgaW5maXhfdGFnID0gMjQ5XG5sZXQgZm9yd2FyZF90YWcgPSAyNTBcblxubGV0IG5vX3NjYW5fdGFnID0gMjUxXG5cbmxldCBhYnN0cmFjdF90YWcgPSAyNTFcbmxldCBzdHJpbmdfdGFnID0gMjUyXG5sZXQgZG91YmxlX3RhZyA9IDI1M1xubGV0IGRvdWJsZV9hcnJheV90YWcgPSAyNTRcbmxldCBjdXN0b21fdGFnID0gMjU1XG5sZXQgZmluYWxfdGFnID0gY3VzdG9tX3RhZ1xuXG5cbmxldCBpbnRfdGFnID0gMTAwMFxubGV0IG91dF9vZl9oZWFwX3RhZyA9IDEwMDFcbmxldCB1bmFsaWduZWRfdGFnID0gMTAwMlxuXG5tb2R1bGUgQ2xvc3VyZSA9IHN0cnVjdFxuICB0eXBlIGluZm8gPSB7XG4gICAgYXJpdHk6IGludDtcbiAgICBzdGFydF9lbnY6IGludDtcbiAgfVxuXG4gIGxldCBpbmZvX29mX3JhdyAoaW5mbyA6IG5hdGl2ZWludCkgPVxuICAgIGxldCBvcGVuIE5hdGl2ZWludCBpblxuICAgIGxldCBhcml0eSA9XG4gICAgICAoKiBzaWduZWQ6IG5lZ2F0aXZlIGZvciB0dXBsZWQgZnVuY3Rpb25zICopXG4gICAgICBpZiBTeXMud29yZF9zaXplID0gNjQgdGhlblxuICAgICAgICB0b19pbnQgKHNoaWZ0X3JpZ2h0IGluZm8gNTYpXG4gICAgICBlbHNlXG4gICAgICAgIHRvX2ludCAoc2hpZnRfcmlnaHQgaW5mbyAyNClcbiAgICBpblxuICAgIGxldCBzdGFydF9lbnYgPVxuICAgICAgKCogc3RhcnRfZW52IGlzIHVuc2lnbmVkLCBidXQgd2Uga25vdyBpdCBjYW4gYWx3YXlzIGZpdCBhbiBPQ2FtbFxuICAgICAgICAgaW50ZWdlciBzbyB3ZSB1c2UgW3RvX2ludF0gaW5zdGVhZCBvZiBbdW5zaWduZWRfdG9faW50XS4gKilcbiAgICAgIHRvX2ludCAoc2hpZnRfcmlnaHRfbG9naWNhbCAoc2hpZnRfbGVmdCBpbmZvIDgpIDkpIGluXG4gICAgeyBhcml0eTsgc3RhcnRfZW52IH1cblxuICAoKiBub3RlOiB3ZSBleHBlY3QgYSBjbG9zdXJlLCBub3QgYW4gaW5maXggcG9pbnRlciAqKVxuICBsZXQgaW5mbyAob2JqIDogdCkgPVxuICAgIGFzc2VydCAodGFnIG9iaiA9IGNsb3N1cmVfdGFnKTtcbiAgICBpbmZvX29mX3JhdyAocmF3X2ZpZWxkIG9iaiAxKVxuZW5kXG5cbm1vZHVsZSBFeHRlbnNpb25fY29uc3RydWN0b3IgPVxuc3RydWN0XG4gIHR5cGUgdCA9IGV4dGVuc2lvbl9jb25zdHJ1Y3RvclxuICBsZXQgb2ZfdmFsIHggPVxuICAgIGxldCB4ID0gcmVwciB4IGluXG4gICAgbGV0IHNsb3QgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHgpICYmICh0YWcgeCkgPD4gb2JqZWN0X3RhZyAmJiAoc2l6ZSB4KSA+PSAxIHRoZW4gZmllbGQgeCAwXG4gICAgICBlbHNlIHhcbiAgICBpblxuICAgIGxldCBuYW1lID1cbiAgICAgIGlmIChpc19ibG9jayBzbG90KSAmJiAodGFnIHNsb3QpID0gb2JqZWN0X3RhZyB0aGVuIGZpZWxkIHNsb3QgMFxuICAgICAgZWxzZSBpbnZhbGlkX2FyZyBcIk9iai5leHRlbnNpb25fY29uc3RydWN0b3JcIlxuICAgIGluXG4gICAgICBpZiAodGFnIG5hbWUpID0gc3RyaW5nX3RhZyB0aGVuIChvYmogc2xvdCA6IHQpXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG5cbiAgbGV0IFtAaW5saW5lIGFsd2F5c10gbmFtZSAoc2xvdCA6IHQpID1cbiAgICAob2JqIChmaWVsZCAocmVwciBzbG90KSAwKSA6IHN0cmluZylcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBpZCAoc2xvdCA6IHQpID1cbiAgICAob2JqIChmaWVsZCAocmVwciBzbG90KSAxKSA6IGludClcbmVuZFxuXG5sZXQgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yID0gRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLm9mX3ZhbFxubGV0IGV4dGVuc2lvbl9uYW1lID0gRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLm5hbWVcbmxldCBleHRlbnNpb25faWQgPSBFeHRlbnNpb25fY29uc3RydWN0b3IuaWRcblxubW9kdWxlIEVwaGVtZXJvbiA9IHN0cnVjdFxuICB0eXBlIG9ial90ID0gdFxuXG4gIHR5cGUgdCAoKiogZXBoZW1lcm9uICopXG5cbiAgICgqKiBUbyBjaGFuZ2UgaW4gc3luYyB3aXRoIHdlYWsuaCAqKVxuICBsZXQgYWRkaXRpb25hbF92YWx1ZXMgPSAyXG4gIGxldCBtYXhfZXBoZV9sZW5ndGggPSBTeXMubWF4X2FycmF5X2xlbmd0aCAtIGFkZGl0aW9uYWxfdmFsdWVzXG5cbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IHQgPSBcImNhbWxfZXBoZV9jcmVhdGVcIjs7XG4gIGxldCBjcmVhdGUgbCA9XG4gICAgaWYgbm90ICgwIDw9IGwgJiYgbCA8PSBtYXhfZXBoZV9sZW5ndGgpIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5jcmVhdGVcIjtcbiAgICBjcmVhdGUgbFxuXG4gIGxldCBsZW5ndGggeCA9IHNpemUocmVwciB4KSAtIGFkZGl0aW9uYWxfdmFsdWVzXG5cbiAgbGV0IHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBtc2cgPVxuICAgIGlmIG5vdCAoMCA8PSBvICYmIG8gPCBsZW5ndGggZSkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgZXh0ZXJuYWwgZ2V0X2tleTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleVwiXG4gIGxldCBnZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi5nZXRfa2V5XCI7XG4gICAgZ2V0X2tleSBlIG9cblxuICBleHRlcm5hbCBnZXRfa2V5X2NvcHk6IHQgLT4gaW50IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9rZXlfY29weVwiXG4gIGxldCBnZXRfa2V5X2NvcHkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlfY29weVwiO1xuICAgIGdldF9rZXlfY29weSBlIG9cblxuICBleHRlcm5hbCBzZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2tleVwiXG4gIGxldCBzZXRfa2V5IGUgbyB4ID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLnNldF9rZXlcIjtcbiAgICBzZXRfa2V5IGUgbyB4XG5cbiAgZXh0ZXJuYWwgdW5zZXRfa2V5OiB0IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfdW5zZXRfa2V5XCJcbiAgbGV0IHVuc2V0X2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24udW5zZXRfa2V5XCI7XG4gICAgdW5zZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGNoZWNrX2tleTogdCAtPiBpbnQgLT4gYm9vbCA9IFwiY2FtbF9lcGhlX2NoZWNrX2tleVwiXG4gIGxldCBjaGVja19rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmNoZWNrX2tleVwiO1xuICAgIGNoZWNrX2tleSBlIG9cblxuICBleHRlcm5hbCBibGl0X2tleSA6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgPSBcImNhbWxfZXBoZV9ibGl0X2tleVwiXG5cbiAgbGV0IGJsaXRfa2V5IGUxIG8xIGUyIG8yIGwgPVxuICAgIGlmIGwgPCAwIHx8IG8xIDwgMCB8fCBvMSA+IGxlbmd0aCBlMSAtIGxcbiAgICAgICB8fCBvMiA8IDAgfHwgbzIgPiBsZW5ndGggZTIgLSBsXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIk9iai5FcGhlbWVyb24uYmxpdF9rZXlcIlxuICAgIGVsc2UgaWYgbCA8PiAwIHRoZW4gYmxpdF9rZXkgZTEgbzEgZTIgbzIgbFxuXG4gIGV4dGVybmFsIGdldF9kYXRhOiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhXCJcbiAgZXh0ZXJuYWwgZ2V0X2RhdGFfY29weTogdCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XCJcbiAgZXh0ZXJuYWwgc2V0X2RhdGE6IHQgLT4gb2JqX3QgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3NldF9kYXRhXCJcbiAgZXh0ZXJuYWwgdW5zZXRfZGF0YTogdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfdW5zZXRfZGF0YVwiXG4gIGV4dGVybmFsIGNoZWNrX2RhdGE6IHQgLT4gYm9vbCA9IFwiY2FtbF9lcGhlX2NoZWNrX2RhdGFcIlxuICBleHRlcm5hbCBibGl0X2RhdGEgOiB0IC0+IHQgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX2JsaXRfZGF0YVwiXG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBJbnRlcm5hbHMgb2YgZm9yY2luZyBsYXp5IHZhbHVlcy4gKilcblxudHlwZSAnYSB0ID0gJ2EgbGF6eV90XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWRcblxubGV0IHJhaXNlX3VuZGVmaW5lZCA9IE9iai5yZXByIChmdW4gKCkgLT4gcmFpc2UgVW5kZWZpbmVkKVxuXG5leHRlcm5hbCBtYWtlX2ZvcndhcmQgOiBPYmoudCAtPiBPYmoudCAtPiB1bml0ID0gXCJjYW1sX29ial9tYWtlX2ZvcndhcmRcIlxuXG4oKiBBc3N1bWUgW2Jsa10gaXMgYSBibG9jayB3aXRoIHRhZyBsYXp5ICopXG5sZXQgZm9yY2VfbGF6eV9ibG9jayAoYmxrIDogJ2FyZyBsYXp5X3QpID1cbiAgbGV0IGNsb3N1cmUgPSAoT2JqLm9iaiAoT2JqLmZpZWxkIChPYmoucmVwciBibGspIDApIDogdW5pdCAtPiAnYXJnKSBpblxuICBPYmouc2V0X2ZpZWxkIChPYmoucmVwciBibGspIDAgcmFpc2VfdW5kZWZpbmVkO1xuICB0cnlcbiAgICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICAgIG1ha2VfZm9yd2FyZCAoT2JqLnJlcHIgYmxrKSAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgICByZXN1bHRcbiAgd2l0aCBlIC0+XG4gICAgT2JqLnNldF9maWVsZCAoT2JqLnJlcHIgYmxrKSAwIChPYmoucmVwciAoZnVuICgpIC0+IHJhaXNlIGUpKTtcbiAgICByYWlzZSBlXG5cblxuKCogQXNzdW1lIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgbGF6eSAqKVxubGV0IGZvcmNlX3ZhbF9sYXp5X2Jsb2NrIChibGsgOiAnYXJnIGxhenlfdCkgPVxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgKE9iai5yZXByIGJsaykgMCkgOiB1bml0IC0+ICdhcmcpIGluXG4gIE9iai5zZXRfZmllbGQgKE9iai5yZXByIGJsaykgMCByYWlzZV91bmRlZmluZWQ7XG4gIGxldCByZXN1bHQgPSBjbG9zdXJlICgpIGluXG4gIG1ha2VfZm9yd2FyZCAoT2JqLnJlcHIgYmxrKSAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgcmVzdWx0XG5cblxuKCogW2ZvcmNlXSBpcyBub3QgdXNlZCwgc2luY2UgW0xhenkuZm9yY2VdIGlzIGRlY2xhcmVkIGFzIGEgcHJpbWl0aXZlXG4gICB3aG9zZSBjb2RlIGlubGluZXMgdGhlIHRhZyB0ZXN0cyBvZiBpdHMgYXJndW1lbnQsIGV4Y2VwdCB3aGVuIGFmbFxuICAgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvbi4gKilcblxubGV0IGZvcmNlIChsenYgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBVc2luZyBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gcHJldmVudHMgdHdvIHBvdGVudGlhbCBwcm9ibGVtczpcbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZywgdGhlbiBpdHMgdGFnIGNvdWxkIGhhdmVcbiAgICAgICBjaGFuZ2VkIGR1cmluZyBHQywgc28gdGhhdCBpbmZvcm1hdGlvbiBtdXN0IGJlIGZvcmdvdHRlbiAoc2VlIEdQUiM3MTNcbiAgICAgICBhbmQgaXNzdWUgIzczMDEpXG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGltbXV0YWJsZSwgdGhlbiBpZiB0aGUgY29tcGlsZXJcbiAgICAgICBjYW5ub3QgcHJvdmUgdGhhdCB0aGUgbGFzdCBicmFuY2ggaXMgbm90IHRha2VuIGl0IHdpbGwgaXNzdWUgYVxuICAgICAgIHdhcm5pbmcgNTkgKG1vZGlmaWNhdGlvbiBvZiBhbiBpbW11dGFibGUgdmFsdWUpICopXG4gIGxldCBsenYgPSBTeXMub3BhcXVlX2lkZW50aXR5IGx6diBpblxuICBsZXQgeCA9IE9iai5yZXByIGx6diBpblxuICBsZXQgdCA9IE9iai50YWcgeCBpblxuICBpZiB0ID0gT2JqLmZvcndhcmRfdGFnIHRoZW4gKE9iai5vYmogKE9iai5maWVsZCB4IDApIDogJ2FyZykgZWxzZVxuICBpZiB0IDw+IE9iai5sYXp5X3RhZyB0aGVuIChPYmoub2JqIHggOiAnYXJnKVxuICBlbHNlIGZvcmNlX2xhenlfYmxvY2sgbHp2XG5cblxubGV0IGZvcmNlX3ZhbCAobHp2IDogJ2FyZyBsYXp5X3QpID1cbiAgbGV0IHggPSBPYmoucmVwciBsenYgaW5cbiAgbGV0IHQgPSBPYmoudGFnIHggaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB0aGVuIChPYmoub2JqIChPYmouZmllbGQgeCAwKSA6ICdhcmcpIGVsc2VcbiAgaWYgdCA8PiBPYmoubGF6eV90YWcgdGhlbiAoT2JqLm9iaiB4IDogJ2FyZylcbiAgZWxzZSBmb3JjZV92YWxfbGF6eV9ibG9jayBsenZcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtMYXp5XTogZGVmZXJyZWQgY29tcHV0YXRpb25zICopXG5cblxuKCpcbiAgIFdBUk5JTkc6IHNvbWUgcHVycGxlIG1hZ2ljIGlzIGdvaW5nIG9uIGhlcmUuICBEbyBub3QgdGFrZSB0aGlzIGZpbGVcbiAgIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHByb2dyYW0gaW4gT0NhbWwuXG4qKVxuXG5cbigqIFdlIG1ha2UgdXNlIG9mIHR3byBzcGVjaWFsIHRhZ3MgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWU6XG4gICBbbGF6eV90YWddIGFuZCBbZm9yd2FyZF90YWddLlxuXG4gICBBIHZhbHVlIG9mIHR5cGUgWydhIExhenkudF0gY2FuIGJlIG9uZSBvZiB0aHJlZSB0aGluZ3M6XG4gICAxLiBBIGJsb2NrIG9mIHNpemUgMSB3aXRoIHRhZyBbbGF6eV90YWddLiAgSXRzIGZpZWxkIGlzIGEgY2xvc3VyZSBvZlxuICAgICAgdHlwZSBbdW5pdCAtPiAnYV0gdGhhdCBjb21wdXRlcyB0aGUgdmFsdWUuXG4gICAyLiBBIGJsb2NrIG9mIHNpemUgMSB3aXRoIHRhZyBbZm9yd2FyZF90YWddLiAgSXRzIGZpZWxkIGlzIHRoZSB2YWx1ZVxuICAgICAgb2YgdHlwZSBbJ2FdIHRoYXQgd2FzIGNvbXB1dGVkLlxuICAgMy4gQW55dGhpbmcgZWxzZSBleGNlcHQgYSBmbG9hdC4gIFRoaXMgaGFzIHR5cGUgWydhXSBhbmQgaXMgdGhlIHZhbHVlXG4gICAgICB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIEV4Y2VwdGlvbnMgYXJlIHN0b3JlZCBpbiBmb3JtYXQgKDEpLlxuICAgVGhlIEdDIHdpbGwgbWFnaWNhbGx5IGNoYW5nZSB0aGluZ3MgZnJvbSAoMikgdG8gKDMpIGFjY29yZGluZyB0byBpdHNcbiAgIGZhbmN5LlxuXG4gICBJZiBPQ2FtbCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSAtZmxhdC1mbG9hdC1hcnJheSBvcHRpb24gKHdoaWNoIGlzXG4gICBjdXJyZW50bHkgdGhlIGRlZmF1bHQpLCB0aGUgZm9sbG93aW5nIGlzIGFsc28gdHJ1ZTpcbiAgIFdlIGNhbm5vdCB1c2UgcmVwcmVzZW50YXRpb24gKDMpIGZvciBhIFtmbG9hdCBMYXp5LnRdIGJlY2F1c2VcbiAgIFtjYW1sX21ha2VfYXJyYXldIGFzc3VtZXMgdGhhdCBvbmx5IGEgW2Zsb2F0XSB2YWx1ZSBjYW4gaGF2ZSB0YWdcbiAgIFtEb3VibGVfdGFnXS5cblxuICAgV2UgaGF2ZSB0byB1c2UgdGhlIGJ1aWx0LWluIHR5cGUgY29uc3RydWN0b3IgW2xhenlfdF0gdG9cbiAgIGxldCB0aGUgY29tcGlsZXIgaW1wbGVtZW50IHRoZSBzcGVjaWFsIHR5cGluZyBhbmQgY29tcGlsYXRpb25cbiAgIHJ1bGVzIGZvciB0aGUgW2xhenldIGtleXdvcmQuXG4qKVxuXG50eXBlICdhIHQgPSAnYSBDYW1saW50ZXJuYWxMYXp5LnRcblxuZXhjZXB0aW9uIFVuZGVmaW5lZCA9IENhbWxpbnRlcm5hbExhenkuVW5kZWZpbmVkXG5cbmV4dGVybmFsIG1ha2VfZm9yd2FyZCA6ICdhIC0+ICdhIGxhenlfdCA9IFwiY2FtbF9sYXp5X21ha2VfZm9yd2FyZFwiXG5cbmV4dGVybmFsIGZvcmNlIDogJ2EgdCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuXG5cbmxldCBmb3JjZV92YWwgPSBDYW1saW50ZXJuYWxMYXp5LmZvcmNlX3ZhbFxuXG5sZXQgZnJvbV9mdW4gKGYgOiB1bml0IC0+ICdhcmcpID1cbiAgbGV0IHggPSBPYmoubmV3X2Jsb2NrIE9iai5sYXp5X3RhZyAxIGluXG4gIE9iai5zZXRfZmllbGQgeCAwIChPYmoucmVwciBmKTtcbiAgKE9iai5vYmogeCA6ICdhcmcgdClcblxubGV0IGZyb21fdmFsICh2IDogJ2FyZykgPVxuICBsZXQgdCA9IE9iai50YWcgKE9iai5yZXByIHYpIGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgfHwgdCA9IE9iai5sYXp5X3RhZyB8fCB0ID0gT2JqLmRvdWJsZV90YWcgdGhlbiBiZWdpblxuICAgIG1ha2VfZm9yd2FyZCB2XG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgKE9iai5tYWdpYyB2IDogJ2FyZyB0KVxuICBlbmRcblxuXG5sZXQgaXNfdmFsIChsIDogJ2FyZyB0KSA9IE9iai50YWcgKE9iai5yZXByIGwpIDw+IE9iai5sYXp5X3RhZ1xuXG5sZXQgbGF6eV9mcm9tX2Z1biA9IGZyb21fZnVuXG5cbmxldCBsYXp5X2Zyb21fdmFsID0gZnJvbV92YWxcblxubGV0IGxhenlfaXNfdmFsID0gaXNfdmFsXG5cblxubGV0IG1hcCBmIHggPVxuICBsYXp5IChmIChmb3JjZSB4KSlcblxubGV0IG1hcF92YWwgZiB4ID1cbiAgaWYgaXNfdmFsIHhcbiAgdGhlbiBsYXp5X2Zyb21fdmFsIChmIChmb3JjZSB4KSlcbiAgZWxzZSBsYXp5IChmIChmb3JjZSB4KSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTaW1vbiBDcnVhbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtTZXFdOiBmdW5jdGlvbmFsIGl0ZXJhdG9ycyAqKVxuXG50eXBlICsnYSBub2RlID1cbiAgfCBOaWxcbiAgfCBDb25zIG9mICdhICogJ2EgdFxuXG5hbmQgJ2EgdCA9IHVuaXQgLT4gJ2Egbm9kZVxuXG5sZXQgZW1wdHkgKCkgPSBOaWxcblxubGV0IHJldHVybiB4ICgpID0gQ29ucyAoeCwgZW1wdHkpXG5cbmxldCBjb25zIHggbmV4dCAoKSA9IENvbnMgKHgsIG5leHQpXG5cbmxldCByZWMgYXBwZW5kIHNlcTEgc2VxMiAoKSA9XG4gIG1hdGNoIHNlcTEoKSB3aXRoXG4gIHwgTmlsIC0+IHNlcTIoKVxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKHgsIGFwcGVuZCBuZXh0IHNlcTIpXG5cbmxldCByZWMgbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPiBDb25zIChmIHgsIG1hcCBmIG5leHQpXG5cbmxldCByZWMgZmlsdGVyX21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBmaWx0ZXJfbWFwIGYgbmV4dCAoKVxuICAgICAgICB8IFNvbWUgeSAtPiBDb25zICh5LCBmaWx0ZXJfbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXIgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICBpZiBmIHhcbiAgICAgIHRoZW4gQ29ucyAoeCwgZmlsdGVyIGYgbmV4dClcbiAgICAgIGVsc2UgZmlsdGVyIGYgbmV4dCAoKVxuXG5sZXQgcmVjIGNvbmNhdCBzZXEgKCkgPSBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICBhcHBlbmQgeCAoY29uY2F0IG5leHQpICgpXG5cbmxldCByZWMgZmxhdF9tYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgIGFwcGVuZCAoZiB4KSAoZmxhdF9tYXAgZiBuZXh0KSAoKVxuXG5sZXQgY29uY2F0X21hcCA9IGZsYXRfbWFwXG5cbmxldCByZWMgZm9sZF9sZWZ0IGYgYWNjIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gYWNjXG4gICAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgICBsZXQgYWNjID0gZiBhY2MgeCBpblxuICAgICAgICBmb2xkX2xlZnQgZiBhY2MgbmV4dFxuXG5sZXQgcmVjIGl0ZXIgZiBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICAgIHwgTmlsIC0+ICgpXG4gICAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgICBmIHg7XG4gICAgICAgIGl0ZXIgZiBuZXh0XG5cbmxldCByZWMgdW5mb2xkIGYgdSAoKSA9XG4gIG1hdGNoIGYgdSB3aXRoXG4gIHwgTm9uZSAtPiBOaWxcbiAgfCBTb21lICh4LCB1JykgLT4gQ29ucyAoeCwgdW5mb2xkIGYgdScpXG5cbmxldCBpc19lbXB0eSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKF8sIF8pIC0+XG4gICAgICBmYWxzZVxuXG5sZXQgdW5jb25zIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBTb21lICh4LCB4cylcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcblxuXG5cbmxldCByZWMgbGVuZ3RoX2F1eCBhY2N1IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoXywgeHMpIC0+XG4gICAgICBsZW5ndGhfYXV4IChhY2N1ICsgMSkgeHNcblxubGV0W0BpbmxpbmVdIGxlbmd0aCB4cyA9XG4gIGxlbmd0aF9hdXggMCB4c1xuXG5sZXQgcmVjIGl0ZXJpX2F1eCBmIGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgICgpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBmIGkgeDtcbiAgICAgIGl0ZXJpX2F1eCBmIChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBpdGVyaSBmIHhzID1cbiAgaXRlcmlfYXV4IGYgMCB4c1xuXG5sZXQgcmVjIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSBpIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBsZXQgYWNjdSA9IGYgYWNjdSBpIHggaW5cbiAgICAgIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAoaSsxKSB4c1xuXG5sZXRbQGlubGluZV0gZm9sZF9sZWZ0aSBmIGFjY3UgeHMgPVxuICBmb2xkX2xlZnRpX2F1eCBmIGFjY3UgMCB4c1xuXG5sZXQgcmVjIGZvcl9hbGwgcCB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgcCB4ICYmIGZvcl9hbGwgcCB4c1xuXG5sZXQgcmVjIGV4aXN0cyBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgcCB4IHx8IGV4aXN0cyBwIHhzXG5cbmxldCByZWMgZmluZCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kIHAgeHNcblxubGV0IHJlYyBmaW5kX21hcCBmIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgZmluZF9tYXAgZiB4c1xuICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+XG4gICAgICAgICAgcmVzdWx0XG5cbigqIFtpdGVyMl0sIFtmb2xkX2xlZnQyXSwgW2Zvcl9hbGwyXSwgW2V4aXN0czJdLCBbbWFwMl0sIFt6aXBdIHdvcmsgYWxzbyBpblxuICAgdGhlIGNhc2Ugd2hlcmUgdGhlIHR3byBzZXF1ZW5jZXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4gVGhleSBzdG9wIGFzIHNvb25cbiAgIGFzIG9uZSBzZXF1ZW5jZSBpcyBleGhhdXN0ZWQuIFRoZWlyIGJlaGF2aW9yIGlzIHNsaWdodGx5IGFzeW1tZXRyaWM6IHdoZW5cbiAgIFt4c10gaXMgZW1wdHksIHRoZXkgZG8gbm90IGZvcmNlIFt5c107IGhvd2V2ZXIsIHdoZW4gW3lzXSBpcyBlbXB0eSwgW3hzXSBpc1xuICAgZm9yY2VkLCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBhcHBsaWNhdGlvbiBbeHMoKV0gdHVybnMgb3V0XG4gICB0byBiZSB1c2VsZXNzLiAqKVxuXG5sZXQgcmVjIGl0ZXIyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgICgpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgZiB4IHk7XG4gICAgICAgICAgaXRlcjIgZiB4cyB5c1xuXG5sZXQgcmVjIGZvbGRfbGVmdDIgZiBhY2N1IHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgYWNjdVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBsZXQgYWNjdSA9IGYgYWNjdSB4IHkgaW5cbiAgICAgICAgICBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5c1xuXG5sZXQgcmVjIGZvcl9hbGwyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5ICYmIGZvcl9hbGwyIGYgeHMgeXNcblxubGV0IHJlYyBleGlzdHMyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgZiB4IHkgfHwgZXhpc3RzMiBmIHhzIHlzXG5cbmxldCByZWMgZXF1YWwgZXEgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBlcSB4IHkgJiYgZXF1YWwgZXEgeHMgeXNcbiAgfCBOaWwsIENvbnMgKF8sIF8pXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgZmFsc2VcblxubGV0IHJlYyBjb21wYXJlIGNtcCB4cyB5cyA9XG4gIG1hdGNoIHhzKCksIHlzKCkgd2l0aFxuICB8IE5pbCwgTmlsIC0+XG4gICAgICAwXG4gIHwgQ29ucyAoeCwgeHMpLCBDb25zICh5LCB5cykgLT5cbiAgICAgIGxldCBjID0gY21wIHggeSBpblxuICAgICAgaWYgYyA8PiAwIHRoZW4gYyBlbHNlIGNvbXBhcmUgY21wIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKSAtPlxuICAgICAgLTFcbiAgfCBDb25zIChfLCBfKSwgTmlsIC0+XG4gICAgICArMVxuXG5cblxuKCogW2luaXRfYXV4IGYgaSBqXSBpcyB0aGUgc2VxdWVuY2UgW2YgaSwgLi4uLCBmIChqLTEpXS4gKilcblxubGV0IHJlYyBpbml0X2F1eCBmIGkgaiAoKSA9XG4gIGlmIGkgPCBqIHRoZW4gYmVnaW5cbiAgICBDb25zIChmIGksIGluaXRfYXV4IGYgKGkgKyAxKSBqKVxuICBlbmRcbiAgZWxzZVxuICAgIE5pbFxuXG5sZXQgaW5pdCBuIGYgPVxuICBpZiBuIDwgMCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTZXEuaW5pdFwiXG4gIGVsc2VcbiAgICBpbml0X2F1eCBmIDAgblxuXG5sZXQgcmVjIHJlcGVhdCB4ICgpID1cbiAgQ29ucyAoeCwgcmVwZWF0IHgpXG5cbmxldCByZWMgZm9yZXZlciBmICgpID1cbiAgQ29ucyAoZigpLCBmb3JldmVyIGYpXG5cbigqIFRoaXMgcHJlbGltaW5hcnkgZGVmaW5pdGlvbiBvZiBbY3ljbGVdIHJlcXVpcmVzIHRoZSBzZXF1ZW5jZSBbeHNdXG4gICB0byBiZSBub25lbXB0eS4gQXBwbHlpbmcgaXQgdG8gYW4gZW1wdHkgc2VxdWVuY2Ugd291bGQgcHJvZHVjZSBhXG4gICBzZXF1ZW5jZSB0aGF0IGRpdmVyZ2VzIHdoZW4gaXQgaXMgZm9yY2VkLiAqKVxuXG5sZXQgcmVjIGN5Y2xlX25vbmVtcHR5IHhzICgpID1cbiAgYXBwZW5kIHhzIChjeWNsZV9ub25lbXB0eSB4cykgKClcblxuKCogW2N5Y2xlIHhzXSBjaGVja3Mgd2hldGhlciBbeHNdIGlzIGVtcHR5IGFuZCwgaWYgc28sIHJldHVybnMgYW4gZW1wdHlcbiAgIHNlcXVlbmNlLiBPdGhlcndpc2UsIFtjeWNsZSB4c10gcHJvZHVjZXMgb25lIGNvcHkgb2YgW3hzXSBmb2xsb3dlZFxuICAgd2l0aCB0aGUgaW5maW5pdGUgc2VxdWVuY2UgW2N5Y2xlX25vbmVtcHR5IHhzXS4gVGh1cywgdGhlIG5vbmVtcHRpbmVzc1xuICAgY2hlY2sgaXMgcGVyZm9ybWVkIGp1c3Qgb25jZS4gKilcblxubGV0IGN5Y2xlIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cycpIC0+XG4gICAgICBDb25zICh4LCBhcHBlbmQgeHMnIChjeWNsZV9ub25lbXB0eSB4cykpXG5cbigqIFtpdGVyYXRlMSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbZiB4LCBmIChmIHgpLCAuLi5dLlxuICAgSXQgaXMgZXF1aXZhbGVudCB0byBbdGFpbCAoaXRlcmF0ZSBmIHgpXS5cbiAgIFtpdGVyYXRlMV0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtpdGVyYXRlXS4gKilcblxubGV0IHJlYyBpdGVyYXRlMSBmIHggKCkgPVxuICBsZXQgeSA9IGYgeCBpblxuICBDb25zICh5LCBpdGVyYXRlMSBmIHkpXG5cbigqIFtpdGVyYXRlIGYgeF0gaXMgdGhlIHNlcXVlbmNlIFt4LCBmIHgsIC4uLl0uICopXG5cbigqIFRoZSByZWFzb24gd2h5IHdlIGdpdmUgdGhpcyBzbGlnaHRseSBpbmRpcmVjdCBkZWZpbml0aW9uIG9mIFtpdGVyYXRlXSxcbiAgIGFzIG9wcG9zZWQgdG8gdGhlIG1vcmUgbmFpdmUgZGVmaW5pdGlvbiB0aGF0IG1heSBjb21lIHRvIG1pbmQsIGlzIHRoYXRcbiAgIHdlIGFyZSBjYXJlZnVsIHRvIGF2b2lkIGV2YWx1YXRpbmcgW2YgeF0gdW50aWwgdGhpcyBmdW5jdGlvbiBjYWxsIGlzXG4gICBhY3R1YWxseSBuZWNlc3NhcnkuIFRoZSBuYWl2ZSBkZWZpbml0aW9uIChub3Qgc2hvd24gaGVyZSkgY29tcHV0ZXMgdGhlXG4gICBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIHNlcXVlbmNlLCBbZiB4XSwgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgaXNcbiAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gKilcblxubGV0IGl0ZXJhdGUgZiB4ID1cbiAgY29ucyB4IChpdGVyYXRlMSBmIHgpXG5cblxuXG5sZXQgcmVjIG1hcGlfYXV4IGYgaSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChmIGkgeCwgbWFwaV9hdXggZiAoaSsxKSB4cylcblxubGV0W0BpbmxpbmVdIG1hcGkgZiB4cyA9XG4gIG1hcGlfYXV4IGYgMCB4c1xuXG4oKiBbdGFpbF9zY2FuIGYgcyB4c10gaXMgZXF1aXZhbGVudCB0byBbdGFpbCAoc2NhbiBmIHMgeHMpXS5cbiAgIFt0YWlsX3NjYW5dIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbc2Nhbl0uICopXG5cbigqIFRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbc2Nhbl0gaXMgbWVhbnQgdG8gYXZvaWQgY29tcHV0aW5nXG4gICBlbGVtZW50cyB0b28gZWFybHk7IHNlZSB0aGUgYWJvdmUgY29tbWVudCBhYm91dCBbaXRlcmF0ZTFdIGFuZCBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgdGFpbF9zY2FuIGYgcyB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBsZXQgcyA9IGYgcyB4IGluXG4gICAgICBDb25zIChzLCB0YWlsX3NjYW4gZiBzIHhzKVxuXG5sZXQgc2NhbiBmIHMgeHMgPVxuICBjb25zIHMgKHRhaWxfc2NhbiBmIHMgeHMpXG5cbigqIFt0YWtlXSBpcyBkZWZpbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCBbdGFrZSAwIHhzXSByZXR1cm5zIFtlbXB0eV1cbiAgIGltbWVkaWF0ZWx5LCB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4gKilcblxubGV0IHJlYyB0YWtlX2F1eCBuIHhzID1cbiAgaWYgbiA9IDAgdGhlblxuICAgIGVtcHR5XG4gIGVsc2VcbiAgICBmdW4gKCkgLT5cbiAgICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgQ29ucyAoeCwgdGFrZV9hdXggKG4tMSkgeHMpXG5cbmxldCB0YWtlIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLnRha2VcIjtcbiAgdGFrZV9hdXggbiB4c1xuXG4oKiBbZm9yY2VfZHJvcCBuIHhzXSBpcyBlcXVpdmFsZW50IHRvIFtkcm9wIG4geHMgKCldLlxuICAgW2ZvcmNlX2Ryb3AgbiB4c10gcmVxdWlyZXMgW24gPiAwXS5cbiAgIFtmb3JjZV9kcm9wXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW2Ryb3BdLiAqKVxuXG5sZXQgcmVjIGZvcmNlX2Ryb3AgbiB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoXywgeHMpIC0+XG4gICAgICBsZXQgbiA9IG4gLSAxIGluXG4gICAgICBpZiBuID0gMCB0aGVuXG4gICAgICAgIHhzKClcbiAgICAgIGVsc2VcbiAgICAgICAgZm9yY2VfZHJvcCBuIHhzXG5cbigqIFtkcm9wXSBpcyBkZWZpbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCBbZHJvcCAwIHhzXSByZXR1cm5zIFt4c10gaW1tZWRpYXRlbHksXG4gICB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4gKilcblxubGV0IGRyb3AgbiB4cyA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJTZXEuZHJvcFwiXG4gIGVsc2UgaWYgbiA9IDAgdGhlblxuICAgIHhzXG4gIGVsc2VcbiAgICBmdW4gKCkgLT5cbiAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG5sZXQgcmVjIHRha2Vfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBpZiBwIHggdGhlbiBDb25zICh4LCB0YWtlX3doaWxlIHAgeHMpIGVsc2UgTmlsXG5cbmxldCByZWMgZHJvcF93aGlsZSBwIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgYXMgbm9kZSAtPlxuICAgICAgaWYgcCB4IHRoZW4gZHJvcF93aGlsZSBwIHhzICgpIGVsc2Ugbm9kZVxuXG5sZXQgcmVjIGdyb3VwIGVxIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIENvbnMgKGNvbnMgeCAodGFrZV93aGlsZSAoZXEgeCkgeHMpLCBncm91cCBlcSAoZHJvcF93aGlsZSAoZXEgeCkgeHMpKVxuXG5leGNlcHRpb24gRm9yY2VkX3R3aWNlXG5cbm1vZHVsZSBTdXNwZW5zaW9uID0gc3RydWN0XG5cbiAgdHlwZSAnYSBzdXNwZW5zaW9uID1cbiAgICB1bml0IC0+ICdhXG5cbiAgKCogQ29udmVyc2lvbnMuICopXG5cbiAgbGV0IHRvX2xhenkgOiAnYSBzdXNwZW5zaW9uIC0+ICdhIExhenkudCA9XG4gICAgTGF6eS5mcm9tX2Z1blxuICAgICgqIGZ1biBzIC0+IGxhenkgKHMoKSkgKilcblxuICBsZXQgZnJvbV9sYXp5IChzIDogJ2EgTGF6eS50KSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZ1biAoKSAtPiBMYXp5LmZvcmNlIHNcblxuICAoKiBbbWVtb2l6ZV0gdHVybnMgYW4gYXJiaXRyYXJ5IHN1c3BlbnNpb24gaW50byBhIHBlcnNpc3RlbnQgc3VzcGVuc2lvbi4gKilcblxuICBsZXQgbWVtb2l6ZSAocyA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgZnJvbV9sYXp5ICh0b19sYXp5IHMpXG5cbiAgKCogW2ZhaWx1cmVdIGlzIGEgc3VzcGVuc2lvbiB0aGF0IGZhaWxzIHdoZW4gZm9yY2VkLiAqKVxuXG4gIGxldCBmYWlsdXJlIDogXyBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEEgc3VzcGVuc2lvbiBjcmVhdGVkIGJ5IFtvbmNlXSBoYXMgYmVlbiBmb3JjZWQgdHdpY2UuICopXG4gICAgICByYWlzZSBGb3JjZWRfdHdpY2VcblxuICAoKiBJZiBbZl0gaXMgYSBzdXNwZW5zaW9uLCB0aGVuIFtvbmNlIGZdIGlzIGEgc3VzcGVuc2lvbiB0aGF0IGNhbiBiZSBmb3JjZWRcbiAgICAgYXQgbW9zdCBvbmNlLiBJZiBpdCBpcyBmb3JjZWQgbW9yZSB0aGFuIG9uY2UsIHRoZW4gW0ZvcmNlZF90d2ljZV0gaXNcbiAgICAgcmFpc2VkLiAqKVxuXG4gIGxldCBvbmNlIChmIDogJ2Egc3VzcGVuc2lvbikgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBsZXQgYWN0aW9uID0gQ2FtbGludGVybmFsQXRvbWljLm1ha2UgZiBpblxuICAgIGZ1biAoKSAtPlxuICAgICAgKCogR2V0IHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgc3RvcmVkIGluIFthY3Rpb25dLCBhbmQgd3JpdGUgdGhlXG4gICAgICAgICBmdW5jdGlvbiBbZmFpbHVyZV0gaW4gaXRzIHBsYWNlLCBzbyB0aGUgbmV4dCBhY2Nlc3Mgd2lsbCByZXN1bHRcbiAgICAgICAgIGluIGEgY2FsbCB0byBbZmFpbHVyZSgpXS4gKilcbiAgICAgIGxldCBmID0gQ2FtbGludGVybmFsQXRvbWljLmV4Y2hhbmdlIGFjdGlvbiBmYWlsdXJlIGluXG4gICAgICBmKClcblxuZW5kICgqIFN1c3BlbnNpb24gKilcblxubGV0IHJlYyBtZW1vaXplIHhzID1cbiAgU3VzcGVuc2lvbi5tZW1vaXplIChmdW4gKCkgLT5cbiAgICBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBDb25zICh4LCBtZW1vaXplIHhzKVxuICApXG5cbmxldCByZWMgb25jZSB4cyA9XG4gIFN1c3BlbnNpb24ub25jZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgb25jZSB4cylcbiAgKVxuXG5cbmxldCByZWMgemlwIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgQ29ucyAoKHgsIHkpLCB6aXAgeHMgeXMpXG5cbmxldCByZWMgbWFwMiBmIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgQ29ucyAoZiB4IHksIG1hcDIgZiB4cyB5cylcblxubGV0IHJlYyBpbnRlcmxlYXZlIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB5cygpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zICh4LCBpbnRlcmxlYXZlIHlzIHhzKVxuXG4oKiBbc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgW3NvcnRlZF9tZXJnZSBjbXAgKGNvbnMgeCB4cykgeXNdLlxuXG4gICBbc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgW3NvcnRlZF9tZXJnZSBjbXAgeHMgKGNvbnMgeSB5cyldLlxuXG4gICBbc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIChjb25zIHkgeXMpXS5cblxuICAgVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyBpbiB0aGUgZGVmaW5pdGlvblxuICAgb2YgW3NvcnRlZF9tZXJnZV0uICopXG5cbmxldCByZWMgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMgKCkgPVxuICBtYXRjaCB5cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHgsIHhzKVxuICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxciBjbXAgeHMgeSB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgQ29ucyAoeSwgeXMpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXNcblxuYW5kIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5cyA9XG4gIGlmIGNtcCB4IHkgPD0gMCB0aGVuXG4gICAgQ29ucyAoeCwgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMpXG4gIGVsc2VcbiAgICBDb25zICh5LCBzb3J0ZWRfbWVyZ2UxbCBjbXAgeCB4cyB5cylcblxubGV0IHNvcnRlZF9tZXJnZSBjbXAgeHMgeXMgKCkgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgICB8IE5pbCwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgTmlsLCBjXG4gICAgfCBjLCBOaWwgLT5cbiAgICAgICAgY1xuICAgIHwgQ29ucyAoeCwgeHMpLCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cblxubGV0IHJlYyBtYXBfZnN0IHh5cyAoKSA9XG4gIG1hdGNoIHh5cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKCh4LCBfKSwgeHlzKSAtPlxuICAgICAgQ29ucyAoeCwgbWFwX2ZzdCB4eXMpXG5cbmxldCByZWMgbWFwX3NuZCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoXywgeSksIHh5cykgLT5cbiAgICAgIENvbnMgKHksIG1hcF9zbmQgeHlzKVxuXG5sZXQgdW56aXAgeHlzID1cbiAgbWFwX2ZzdCB4eXMsIG1hcF9zbmQgeHlzXG5cbmxldCBzcGxpdCA9XG4gIHVuemlwXG5cbigqIFtmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4c10gaXMgZXF1aXZhbGVudCB0b1xuICAgW2ZpbHRlcl9tYXAgRWl0aGVyLmZpbmRfbGVmdCAobWFwIGYgeHMpXS4gKilcblxubGV0IHJlYyBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBFaXRoZXIuTGVmdCB5IC0+XG4gICAgICAgICAgQ29ucyAoeSwgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMpXG4gICAgICB8IEVpdGhlci5SaWdodCBfIC0+XG4gICAgICAgICAgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKClcblxubGV0IHJlYyBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4cyAoKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgeiAtPlxuICAgICAgICAgIENvbnMgKHosIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4cylcblxubGV0IHBhcnRpdGlvbl9tYXAgZiB4cyA9XG4gIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzLFxuICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHNcblxubGV0IHBhcnRpdGlvbiBwIHhzID1cbiAgZmlsdGVyIHAgeHMsIGZpbHRlciAoZnVuIHggLT4gbm90IChwIHgpKSB4c1xuXG4oKiBJZiBbeHNzXSBpcyBhIG1hdHJpeCAoYSBzZXF1ZW5jZSBvZiByb3dzKSwgdGhlbiBbcGVlbCB4c3NdIGlzIGEgcGFpciBvZlxuICAgdGhlIGZpcnN0IGNvbHVtbiAoYSBzZXF1ZW5jZSBvZiBlbGVtZW50cykgYW5kIG9mIHRoZSByZW1haW5kZXIgb2YgdGhlXG4gICBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygc2hvcnRlciByb3dzKS4gVGhlc2UgdHdvIHNlcXVlbmNlcyBoYXZlIHRoZSBzYW1lXG4gICBsZW5ndGguIFRoZSByb3dzIG9mIHRoZSBtYXRyaXggW3hzc10gYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIHRoZSBzYW1lXG4gICBsZW5ndGguIEFuIGVtcHR5IHJvdyBpcyBpZ25vcmVkLiAqKVxuXG4oKiBCZWNhdXNlIFtwZWVsXSB1c2VzIFt1bnppcF0sIGl0cyBhcmd1bWVudCBtdXN0IGJlIHBlcnNpc3RlbnQuIFRoZSBzYW1lXG4gICByZW1hcmsgYXBwbGllcyB0byBbdHJhbnNwb3NlXSwgW2RpYWdvbmFsc10sIFtwcm9kdWN0XSwgZXRjLiAqKVxuXG5sZXQgcGVlbCB4c3MgPVxuICB1bnppcCAoZmlsdGVyX21hcCB1bmNvbnMgeHNzKVxuXG5sZXQgcmVjIHRyYW5zcG9zZSB4c3MgKCkgPVxuICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCB4c3MgaW5cbiAgaWYgaXNfZW1wdHkgaGVhZHMgdGhlbiBiZWdpblxuICAgIGFzc2VydCAoaXNfZW1wdHkgdGFpbHMpO1xuICAgIE5pbFxuICBlbmRcbiAgZWxzZVxuICAgIENvbnMgKGhlYWRzLCB0cmFuc3Bvc2UgdGFpbHMpXG5cbigqIFRoZSBpbnRlcm5hbCBmdW5jdGlvbiBbZGlhZ29uYWxzXSB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCwgW3JlbWFpbmRlcnNdLFxuICAgd2hpY2ggY29udGFpbnMgdGhlIHJlbWFpbmRlcnMgb2YgdGhlIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlblxuICAgZGlzY292ZXJlZC4gKilcblxubGV0IHJlYyBkaWFnb25hbHMgcmVtYWluZGVycyB4c3MgKCkgPVxuICBtYXRjaCB4c3MoKSB3aXRoXG4gIHwgQ29ucyAoeHMsIHhzcykgLT5cbiAgICAgIGJlZ2luIG1hdGNoIHhzKCkgd2l0aFxuICAgICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgICAoKiBXZSBkaXNjb3ZlciBhIG5ldyBub25lbXB0eSByb3cgW3ggOjogeHNdLiBUaHVzLCB0aGUgbmV4dCBkaWFnb25hbFxuICAgICAgICAgICAgIGlzIFt4IDo6IGhlYWRzXTogdGhpcyBkaWFnb25hbCBiZWdpbnMgd2l0aCBbeF0gYW5kIGNvbnRpbnVlcyB3aXRoXG4gICAgICAgICAgICAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgZXZlcnkgcm93IGluIFtyZW1haW5kZXJzXS4gSW4gdGhlIHJlY3Vyc2l2ZVxuICAgICAgICAgICAgIGNhbGwsIHRoZSBhcmd1bWVudCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGggW3hzIDo6XG4gICAgICAgICAgICAgdGFpbHNdLCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgb25lIG1vcmUgcmVtYWluaW5nIHJvdywgW3hzXSxcbiAgICAgICAgICAgICBhbmQgdGhhdCB3ZSBrZWVwIHRoZSB0YWlscyBvZiB0aGUgcHJlLWV4aXN0aW5nIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgICAgIGxldCBoZWFkcywgdGFpbHMgPSBwZWVsIHJlbWFpbmRlcnMgaW5cbiAgICAgICAgICBDb25zIChjb25zIHggaGVhZHMsIGRpYWdvbmFscyAoY29ucyB4cyB0YWlscykgeHNzKVxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICAoKiBXZSBkaXNjb3ZlciBhIG5ldyBlbXB0eSByb3cuIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBkaWFnb25hbCBpc1xuICAgICAgICAgICAgIGp1c3QgW2hlYWRzXSwgYW5kIFtyZW1haW5kZXJzXSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBqdXN0IFt0YWlsc10sXG4gICAgICAgICAgICAgYXMgd2UgZG8gbm90IGhhdmUgb25lIG1vcmUgcmVtYWluaW5nIHJvdy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoaGVhZHMsIGRpYWdvbmFscyB0YWlscyB4c3MpXG4gICAgICBlbmRcbiAgfCBOaWwgLT5cbiAgICAgICgqIFRoZXJlIGFyZSBubyBtb3JlIHJvd3MgdG8gYmUgZGlzY292ZXJlZC4gVGhlcmUgcmVtYWlucyB0byBleGhhdXN0XG4gICAgICAgICB0aGUgcmVtYWluaW5nIHJvd3MuICopXG4gICAgICB0cmFuc3Bvc2UgcmVtYWluZGVycyAoKVxuXG4oKiBJZiBbeHNzXSBpcyBhIG1hdHJpeCAoYSBzZXF1ZW5jZSBvZiByb3dzKSwgdGhlbiBbZGlhZ29uYWxzIHhzc10gaXNcbiAgIHRoZSBzZXF1ZW5jZSBvZiBpdHMgZGlhZ29uYWxzLlxuXG4gICBUaGUgZmlyc3QgZGlhZ29uYWwgY29udGFpbnMganVzdCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGVcbiAgIGZpcnN0IHJvdy4gVGhlIHNlY29uZCBkaWFnb25hbCBjb250YWlucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGVcbiAgIHNlY29uZCByb3cgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgZmlyc3Qgcm93OyBhbmQgc28gb24uXG4gICBUaGlzIGtpbmQgb2YgZGlhZ29uYWwgaXMgaW4gZmFjdCBzb21ldGltZXMga25vd24gYXMgYW4gYW50aWRpYWdvbmFsLlxuXG4gICAtIEV2ZXJ5IGRpYWdvbmFsIGlzIGEgZmluaXRlIHNlcXVlbmNlLlxuICAgLSBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG4gICAtIFRoZSBtYXRyaXggW3hzc10gaXMgbm90IHJlcXVpcmVkIHRvIGJlIGZpbml0ZSAoaW4gZWl0aGVyIGRpcmVjdGlvbikuXG4gICAtIFRoZSBtYXRyaXggW3hzc10gbXVzdCBiZSBwZXJzaXN0ZW50LiAqKVxuXG5sZXQgZGlhZ29uYWxzIHhzcyA9XG4gIGRpYWdvbmFscyBlbXB0eSB4c3NcblxubGV0IG1hcF9wcm9kdWN0IGYgeHMgeXMgPVxuICBjb25jYXQgKGRpYWdvbmFscyAoXG4gICAgbWFwIChmdW4geCAtPlxuICAgICAgbWFwIChmdW4geSAtPlxuICAgICAgICBmIHggeVxuICAgICAgKSB5c1xuICAgICkgeHNcbiAgKSlcblxubGV0IHByb2R1Y3QgeHMgeXMgPVxuICBtYXBfcHJvZHVjdCAoZnVuIHggeSAtPiAoeCwgeSkpIHhzIHlzXG5cbmxldCBvZl9kaXNwZW5zZXIgaXQgPVxuICBsZXQgcmVjIGMgKCkgPVxuICAgIG1hdGNoIGl0KCkgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBOaWxcbiAgICB8IFNvbWUgeCAtPlxuICAgICAgICBDb25zICh4LCBjKVxuICBpblxuICBjXG5cbmxldCB0b19kaXNwZW5zZXIgeHMgPVxuICBsZXQgcyA9IHJlZiB4cyBpblxuICBmdW4gKCkgLT5cbiAgICBtYXRjaCAoIXMpKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5vbmVcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBzIDo9IHhzO1xuICAgICAgICBTb21lIHhcblxuXG5cbmxldCByZWMgaW50cyBpICgpID1cbiAgQ29ucyAoaSwgaW50cyAoaSArIDEpKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPSBOb25lIHwgU29tZSBvZiAnYVxuXG5sZXQgbm9uZSA9IE5vbmVcbmxldCBzb21lIHYgPSBTb21lIHZcbmxldCB2YWx1ZSBvIH5kZWZhdWx0ID0gbWF0Y2ggbyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBkZWZhdWx0XG5sZXQgZ2V0ID0gZnVuY3Rpb24gU29tZSB2IC0+IHYgfCBOb25lIC0+IGludmFsaWRfYXJnIFwib3B0aW9uIGlzIE5vbmVcIlxubGV0IGJpbmQgbyBmID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBmIHZcbmxldCBqb2luID0gZnVuY3Rpb24gU29tZSBvIC0+IG8gfCBOb25lIC0+IE5vbmVcbmxldCBtYXAgZiBvID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBTb21lIChmIHYpXG5sZXQgZm9sZCB+bm9uZSB+c29tZSA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBzb21lIHYgfCBOb25lIC0+IG5vbmVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBTb21lIHYgLT4gZiB2IHwgTm9uZSAtPiAoKVxubGV0IGlzX25vbmUgPSBmdW5jdGlvbiBOb25lIC0+IHRydWUgfCBTb21lIF8gLT4gZmFsc2VcbmxldCBpc19zb21lID0gZnVuY3Rpb24gTm9uZSAtPiBmYWxzZSB8IFNvbWUgXyAtPiB0cnVlXG5cbmxldCBlcXVhbCBlcSBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gZXEgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiB0cnVlXG58IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgY21wIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBjbXAgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiAwXG58IE5vbmUsIFNvbWUgXyAtPiAtMVxufCBTb21lIF8sIE5vbmUgLT4gMVxuXG5sZXQgdG9fcmVzdWx0IH5ub25lID0gZnVuY3Rpb24gTm9uZSAtPiBFcnJvciBub25lIHwgU29tZSB2IC0+IE9rIHZcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gTm9uZSAtPiBbXSB8IFNvbWUgdiAtPiBbdl1cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBOb25lIC0+IFNlcS5lbXB0eSB8IFNvbWUgdiAtPiBTZXEucmV0dXJuIHZcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSkgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnZVxuXG5sZXQgb2sgdiA9IE9rIHZcbmxldCBlcnJvciBlID0gRXJyb3IgZVxubGV0IHZhbHVlIHIgfmRlZmF1bHQgPSBtYXRjaCByIHdpdGggT2sgdiAtPiB2IHwgRXJyb3IgXyAtPiBkZWZhdWx0XG5sZXQgZ2V0X29rID0gZnVuY3Rpb24gT2sgdiAtPiB2IHwgRXJyb3IgXyAtPiBpbnZhbGlkX2FyZyBcInJlc3VsdCBpcyBFcnJvciBfXCJcbmxldCBnZXRfZXJyb3IgPSBmdW5jdGlvbiBFcnJvciBlIC0+IGUgfCBPayBfIC0+IGludmFsaWRfYXJnIFwicmVzdWx0IGlzIE9rIF9cIlxubGV0IGJpbmQgciBmID0gbWF0Y2ggciB3aXRoIE9rIHYgLT4gZiB2IHwgRXJyb3IgXyBhcyBlIC0+IGVcbmxldCBqb2luID0gZnVuY3Rpb24gT2sgciAtPiByIHwgRXJyb3IgXyBhcyBlIC0+IGVcbmxldCBtYXAgZiA9IGZ1bmN0aW9uIE9rIHYgLT4gT2sgKGYgdikgfCBFcnJvciBfIGFzIGUgLT4gZVxubGV0IG1hcF9lcnJvciBmID0gZnVuY3Rpb24gRXJyb3IgZSAtPiBFcnJvciAoZiBlKSB8IE9rIF8gYXMgdiAtPiB2XG5sZXQgZm9sZCB+b2sgfmVycm9yID0gZnVuY3Rpb24gT2sgdiAtPiBvayB2IHwgRXJyb3IgZSAtPiBlcnJvciBlXG5sZXQgaXRlciBmID0gZnVuY3Rpb24gT2sgdiAtPiBmIHYgfCBFcnJvciBfIC0+ICgpXG5sZXQgaXRlcl9lcnJvciBmID0gZnVuY3Rpb24gRXJyb3IgZSAtPiBmIGUgfCBPayBfIC0+ICgpXG5sZXQgaXNfb2sgPSBmdW5jdGlvbiBPayBfIC0+IHRydWUgfCBFcnJvciBfIC0+IGZhbHNlXG5sZXQgaXNfZXJyb3IgPSBmdW5jdGlvbiBFcnJvciBfIC0+IHRydWUgfCBPayBfIC0+IGZhbHNlXG5cbmxldCBlcXVhbCB+b2sgfmVycm9yIHIwIHIxID0gbWF0Y2ggcjAsIHIxIHdpdGhcbnwgT2sgdjAsIE9rIHYxIC0+IG9rIHYwIHYxXG58IEVycm9yIGUwLCBFcnJvciBlMSAtPiBlcnJvciBlMCBlMVxufCBfLCBfIC0+IGZhbHNlXG5cbmxldCBjb21wYXJlIH5vayB+ZXJyb3IgcjAgcjEgPSBtYXRjaCByMCwgcjEgd2l0aFxufCBPayB2MCwgT2sgdjEgLT4gb2sgdjAgdjFcbnwgRXJyb3IgZTAsIEVycm9yIGUxIC0+IGVycm9yIGUwIGUxXG58IE9rIF8sIEVycm9yIF8gLT4gLTFcbnwgRXJyb3IgXywgT2sgXyAtPiAxXG5cbmxldCB0b19vcHRpb24gPSBmdW5jdGlvbiBPayB2IC0+IFNvbWUgdiB8IEVycm9yIF8gLT4gTm9uZVxubGV0IHRvX2xpc3QgPSBmdW5jdGlvbiBPayB2IC0+IFt2XSB8IEVycm9yIF8gLT4gW11cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBPayB2IC0+IFNlcS5yZXR1cm4gdiB8IEVycm9yIF8gLT4gU2VxLmVtcHR5XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGJvb2wgPSBmYWxzZSB8IHRydWVcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxubGV0IGVxdWFsIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBib29sIC0+IGJvb2wgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmV4dGVybmFsIHRvX2ludCA6IGJvb2wgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxubGV0IHRvX2Zsb2F0ID0gZnVuY3Rpb24gZmFsc2UgLT4gMC4gfCB0cnVlIC0+IDEuXG5cbigqXG5sZXQgb2Zfc3RyaW5nID0gZnVuY3Rpb25cbnwgXCJmYWxzZVwiIC0+IFNvbWUgZmFsc2VcbnwgXCJ0cnVlXCIgLT4gU29tZSB0cnVlXG58IF8gLT4gTm9uZVxuKilcblxubGV0IHRvX3N0cmluZyA9IGZ1bmN0aW9uIGZhbHNlIC0+IFwiZmFsc2VcIiB8IHRydWUgLT4gXCJ0cnVlXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQ2hhcmFjdGVyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgY29kZTogY2hhciAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCB1bnNhZmVfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGNociBuID1cbiAgaWYgbiA8IDAgfHwgbiA+IDI1NSB0aGVuIGludmFsaWRfYXJnIFwiQ2hhci5jaHJcIiBlbHNlIHVuc2FmZV9jaHIgblxuXG5leHRlcm5hbCBieXRlc19jcmVhdGU6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3NldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcblxubGV0IGVzY2FwZWQgPSBmdW5jdGlvblxuICB8ICdcXCcnIC0+IFwiXFxcXCdcIlxuICB8ICdcXFxcJyAtPiBcIlxcXFxcXFxcXCJcbiAgfCAnXFxuJyAtPiBcIlxcXFxuXCJcbiAgfCAnXFx0JyAtPiBcIlxcXFx0XCJcbiAgfCAnXFxyJyAtPiBcIlxcXFxyXCJcbiAgfCAnXFxiJyAtPiBcIlxcXFxiXCJcbiAgfCAnICcgLi4gJ34nIGFzIGMgLT5cbiAgICAgIGxldCBzID0gYnl0ZXNfY3JlYXRlIDEgaW5cbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAwIGM7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcbiAgfCBjIC0+XG4gICAgICBsZXQgbiA9IGNvZGUgYyBpblxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgNCBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgJ1xcXFwnO1xuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDEgKHVuc2FmZV9jaHIgKDQ4ICsgbiAvIDEwMCkpO1xuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDIgKHVuc2FmZV9jaHIgKDQ4ICsgKG4gLyAxMCkgbW9kIDEwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMyAodW5zYWZlX2NociAoNDggKyBuIG1vZCAxMCkpO1xuICAgICAgdW5zYWZlX3RvX3N0cmluZyBzXG5cbmxldCBsb3dlcmNhc2UgPSBmdW5jdGlvblxuICB8ICdBJyAuLiAnWidcbiAgfCAnXFwxOTInIC4uICdcXDIxNCdcbiAgfCAnXFwyMTYnIC4uICdcXDIyMicgYXMgYyAtPlxuICAgIHVuc2FmZV9jaHIoY29kZSBjICsgMzIpXG4gIHwgYyAtPiBjXG5cbmxldCB1cHBlcmNhc2UgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneidcbiAgfCAnXFwyMjQnIC4uICdcXDI0NidcbiAgfCAnXFwyNDgnIC4uICdcXDI1NCcgYXMgYyAtPlxuICAgIHVuc2FmZV9jaHIoY29kZSBjIC0gMzIpXG4gIHwgYyAtPiBjXG5cbmxldCBsb3dlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdBJyAuLiAnWicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyArIDMyKVxuICB8IGMgLT4gY1xuXG5sZXQgdXBwZXJjYXNlX2FzY2lpID0gZnVuY3Rpb25cbiAgfCAnYScgLi4gJ3onIGFzIGMgLT4gdW5zYWZlX2Nocihjb2RlIGMgLSAzMilcbiAgfCBjIC0+IGNcblxudHlwZSB0ID0gY2hhclxuXG5sZXQgY29tcGFyZSBjMSBjMiA9IGNvZGUgYzEgLSBjb2RlIGMyXG5sZXQgZXF1YWwgKGMxOiB0KSAoYzI6IHQpID0gY29tcGFyZSBjMSBjMiA9IDBcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMuIFdoZW4geW91IG1vZGlmeSB0aGUgb25lIGluIHRoaXMgZmlsZSB5b3UgbmVlZCB0b1xuICAgbW9kaWZ5IGl0cyBkdXBsaWNhdGUgaW4gc3RyaW5nLm1sLlxuICAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBcImR1cGxpY2F0ZWRcIiBjb21tZW50IGFib3ZlIHRoZWlyIGRlZmluaXRpb24uXG4qKVxuXG5leHRlcm5hbCBsZW5ndGggOiBieXRlcyAtPiBpbnQgPSBcIiVieXRlc19sZW5ndGhcIlxuZXh0ZXJuYWwgc3RyaW5nX2xlbmd0aCA6IHN0cmluZyAtPiBpbnQgPSBcIiVzdHJpbmdfbGVuZ3RoXCJcbmV4dGVybmFsIGdldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2ZpbGwgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfZmlsbF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcbmV4dGVybmFsIHVuc2FmZV9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gYnl0ZXMgPSBcIiVieXRlc19vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdW5zYWZlX2JsaXRfc3RyaW5nIDogc3RyaW5nIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCIgW0BAbm9hbGxvY11cblxubGV0IG1ha2UgbiBjID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICB1bnNhZmVfZmlsbCBzIDAgbiBjO1xuICBzXG5cbmxldCBpbml0IG4gZiA9XG4gIGxldCBzID0gY3JlYXRlIG4gaW5cbiAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgdW5zYWZlX3NldCBzIGkgKGYgaSlcbiAgZG9uZTtcbiAgc1xuXG5sZXQgZW1wdHkgPSBjcmVhdGUgMFxuXG5sZXQgY29weSBzID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gIGxldCByID0gY3JlYXRlIGxlbiBpblxuICB1bnNhZmVfYmxpdCBzIDAgciAwIGxlbjtcbiAgclxuXG5sZXQgdG9fc3RyaW5nIGIgPSB1bnNhZmVfdG9fc3RyaW5nIChjb3B5IGIpXG5sZXQgb2Zfc3RyaW5nIHMgPSBjb3B5ICh1bnNhZmVfb2Zfc3RyaW5nIHMpXG5cbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuc3ViIC8gQnl0ZXMuc3ViXCJcbiAgZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGxlbiBpblxuICAgIHVuc2FmZV9ibGl0IHMgb2ZzIHIgMCBsZW47XG4gICAgclxuICBlbmRcblxubGV0IHN1Yl9zdHJpbmcgYiBvZnMgbGVuID0gdW5zYWZlX3RvX3N0cmluZyAoc3ViIGIgb2ZzIGxlbilcblxuKCogYWRkaXRpb24gd2l0aCBhbiBvdmVyZmxvdyBjaGVjayAqKVxubGV0ICgrKykgYSBiID1cbiAgbGV0IGMgPSBhICsgYiBpblxuICBtYXRjaCBhIDwgMCwgYiA8IDAsIGMgPCAwIHdpdGhcbiAgfCB0cnVlICwgdHJ1ZSAsIGZhbHNlXG4gIHwgZmFsc2UsIGZhbHNlLCB0cnVlICAtPiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmV4dGVuZFwiICgqIG92ZXJmbG93ICopXG4gIHwgXyAtPiBjXG5cbmxldCBleHRlbmQgcyBsZWZ0IHJpZ2h0ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzICsrIGxlZnQgKysgcmlnaHQgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIGxldCAoc3Jjb2ZmLCBkc3RvZmYpID0gaWYgbGVmdCA8IDAgdGhlbiAtbGVmdCwgMCBlbHNlIDAsIGxlZnQgaW5cbiAgbGV0IGNweWxlbiA9IEludC5taW4gKGxlbmd0aCBzIC0gc3Jjb2ZmKSAobGVuIC0gZHN0b2ZmKSBpblxuICBpZiBjcHlsZW4gPiAwIHRoZW4gdW5zYWZlX2JsaXQgcyBzcmNvZmYgciBkc3RvZmYgY3B5bGVuO1xuICByXG5cbmxldCBmaWxsIHMgb2ZzIGxlbiBjID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuZmlsbCAvIEJ5dGVzLmZpbGxcIlxuICBlbHNlIHVuc2FmZV9maWxsIHMgb2ZzIGxlbiBjXG5cbmxldCBibGl0IHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBsZW5ndGggczEgLSBsZW5cbiAgICAgICAgICAgICB8fCBvZnMyIDwgMCB8fCBvZnMyID4gbGVuZ3RoIHMyIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCeXRlcy5ibGl0XCJcbiAgZWxzZSB1bnNhZmVfYmxpdCBzMSBvZnMxIHMyIG9mczIgbGVuXG5cbmxldCBibGl0X3N0cmluZyBzMSBvZnMxIHMyIG9mczIgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBvZnMxIDwgMCB8fCBvZnMxID4gc3RyaW5nX2xlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5ibGl0IC8gQnl0ZXMuYmxpdF9zdHJpbmdcIlxuICBlbHNlIHVuc2FmZV9ibGl0X3N0cmluZyBzMSBvZnMxIHMyIG9mczIgbGVuXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaXRlciBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYodW5zYWZlX2dldCBhIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyaSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgaSAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxubGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgaW52YWxpZF9hcmcgXCJCeXRlcy5jb25jYXRcIlxuXG5sZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyBzZXBsZW4gPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY1xuICB8IGhkIDo6IFtdIC0+IGxlbmd0aCBoZCArIGFjY1xuICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIHNlcGxlbiArIGFjYykgYWNjKSBzZXBsZW4gdGxcblxubGV0IHJlYyB1bnNhZmVfYmxpdHMgZHN0IHBvcyBzZXAgc2VwbGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBkc3RcbiAgfCBoZCA6OiBbXSAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTsgZHN0XG4gIHwgaGQgOjogdGwgLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7XG4gICAgdW5zYWZlX2JsaXQgc2VwIDAgZHN0IChwb3MgKyBsZW5ndGggaGQpIHNlcGxlbjtcbiAgICB1bnNhZmVfYmxpdHMgZHN0IChwb3MgKyBsZW5ndGggaGQgKyBzZXBsZW4pIHNlcCBzZXBsZW4gdGxcblxubGV0IGNvbmNhdCBzZXAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGVtcHR5XG4gIHwgbCAtPiBsZXQgc2VwbGVuID0gbGVuZ3RoIHNlcCBpblxuICAgICAgICAgIHVuc2FmZV9ibGl0c1xuICAgICAgICAgICAgKGNyZWF0ZSAoc3VtX2xlbmd0aHMgMCBzZXBsZW4gbCkpXG4gICAgICAgICAgICAwIHNlcCBzZXBsZW4gbFxuXG5sZXQgY2F0IHMxIHMyID1cbiAgbGV0IGwxID0gbGVuZ3RoIHMxIGluXG4gIGxldCBsMiA9IGxlbmd0aCBzMiBpblxuICBsZXQgciA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgdW5zYWZlX2JsaXQgczEgMCByIDAgbDE7XG4gIHVuc2FmZV9ibGl0IHMyIDAgciBsMSBsMjtcbiAgclxuXG5cbmV4dGVybmFsIGNoYXJfY29kZTogY2hhciAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBjaGFyX2NocjogaW50IC0+IGNoYXIgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19zcGFjZSA9IGZ1bmN0aW9uXG4gIHwgJyAnIHwgJ1xcMDEyJyB8ICdcXG4nIHwgJ1xccicgfCAnXFx0JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5sZXQgdHJpbSBzID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gIGxldCBpID0gcmVmIDAgaW5cbiAgd2hpbGUgIWkgPCBsZW4gJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaSkgZG9cbiAgICBpbmNyIGlcbiAgZG9uZTtcbiAgbGV0IGogPSByZWYgKGxlbiAtIDEpIGluXG4gIHdoaWxlICFqID49ICFpICYmIGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgIWopIGRvXG4gICAgZGVjciBqXG4gIGRvbmU7XG4gIGlmICFqID49ICFpIHRoZW5cbiAgICBzdWIgcyAhaSAoIWogLSAhaSArIDEpXG4gIGVsc2VcbiAgICBlbXB0eVxuXG5sZXQgZXNjYXBlZCBzID1cbiAgbGV0IG4gPSByZWYgMCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgbiA6PSAhbiArXG4gICAgICAobWF0Y2ggdW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgIHwgJ1xcXCInIHwgJ1xcXFwnIHwgJ1xcbicgfCAnXFx0JyB8ICdcXHInIHwgJ1xcYicgLT4gMlxuICAgICAgIHwgJyAnIC4uICd+JyAtPiAxXG4gICAgICAgfCBfIC0+IDQpXG4gIGRvbmU7XG4gIGlmICFuID0gbGVuZ3RoIHMgdGhlbiBjb3B5IHMgZWxzZSBiZWdpblxuICAgIGxldCBzJyA9IGNyZWF0ZSAhbiBpblxuICAgIG4gOj0gMDtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICBiZWdpbiBtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgfCAoJyAnIC4uICd+JykgYXMgYyAtPiB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgYyAtPlxuICAgICAgICAgIGxldCBhID0gY2hhcl9jb2RlIGMgaW5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSAvIDEwMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyAoYSAvIDEwKSBtb2QgMTApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSBtb2QgMTApKTtcbiAgICAgIGVuZDtcbiAgICAgIGluY3IgblxuICAgIGRvbmU7XG4gICAgcydcbiAgZW5kXG5cbmxldCBtYXAgZiBzID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBsID0gMCB0aGVuIHMgZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG8gdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwaSBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiBpICh1bnNhZmVfZ2V0IHMgaSkpIGRvbmU7XG4gICAgclxuICBlbmRcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IGxlbmd0aCBhIC0gMSBkb3dudG8gMCBkb1xuICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gIGRvbmU7XG4gICFyXG5cbmxldCBleGlzdHMgcCBzID1cbiAgbGV0IG4gPSBsZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBzIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwgcCBzID1cbiAgbGV0IG4gPSBsZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIudXBwZXJjYXNlX2FzY2lpIHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9IG1hcCBDaGFyLmxvd2VyY2FzZV9hc2NpaSBzXG5cbmxldCBhcHBseTEgZiBzID1cbiAgaWYgbGVuZ3RoIHMgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjb3B5IHMgaW5cbiAgICB1bnNhZmVfc2V0IHIgMCAoZih1bnNhZmVfZ2V0IHMgMCkpO1xuICAgIHJcbiAgZW5kXG5cbmxldCBjYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IHVuY2FwaXRhbGl6ZV9hc2NpaSBzID0gYXBwbHkxIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzdGFydHNfd2l0aCB+cHJlZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3ByZSA9IGxlbmd0aCBwcmVmaXggaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9wcmUgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgaSA8PiB1bnNhZmVfZ2V0IHByZWZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGxlbl9zID49IGxlbl9wcmUgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleCBzIGMgPSBpbmRleF9yZWMgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWNfb3B0IHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIGluZGV4X3JlY19vcHQgcyBsaW0gKGkgKyAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4X2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbSAvIEJ5dGVzLmluZGV4X2Zyb21cIiBlbHNlXG4gIGluZGV4X3JlYyBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjIHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgcmluZGV4X3JlYyBzIChpIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleCBzIGMgPSByaW5kZXhfcmVjIHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAwIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIHJpbmRleF9yZWNfb3B0IHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X29wdCBzIGMgPSByaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgMCB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yY29udGFpbnNfZnJvbSAvIEJ5dGVzLnJjb250YWluc19mcm9tXCJcbiAgZWxzZVxuICAgIHRyeSBpZ25vcmUgKHJpbmRleF9yZWMgcyBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cblxudHlwZSB0ID0gYnl0ZXNcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiB0IC0+IHQgLT4gYm9vbCA9IFwiY2FtbF9ieXRlc19lcXVhbFwiIFtAQG5vYWxsb2NdXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgc3BsaXRfb25fY2hhciBzZXAgcyA9XG4gIGxldCByID0gcmVmIFtdIGluXG4gIGxldCBqID0gcmVmIChsZW5ndGggcykgaW5cbiAgZm9yIGkgPSBsZW5ndGggcyAtIDEgZG93bnRvIDAgZG9cbiAgICBpZiB1bnNhZmVfZ2V0IHMgaSA9IHNlcCB0aGVuIGJlZ2luXG4gICAgICByIDo9IHN1YiBzIChpICsgMSkgKCFqIC0gaSAtIDEpIDo6ICFyO1xuICAgICAgaiA6PSBpXG4gICAgZW5kXG4gIGRvbmU7XG4gIHN1YiBzIDAgIWogOjogIXJcblxuKCogRGVwcmVjYXRlZCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgdmlhIG90aGVyIGRlcHJlY2F0ZWQgZnVuY3Rpb25zICopXG5bQEBAb2NhbWwud2FybmluZyBcIi0zXCJdXG5sZXQgdXBwZXJjYXNlIHMgPSBtYXAgQ2hhci51cHBlcmNhc2Ugc1xubGV0IGxvd2VyY2FzZSBzID0gbWFwIENoYXIubG93ZXJjYXNlIHNcblxubGV0IGNhcGl0YWxpemUgcyA9IGFwcGx5MSBDaGFyLnVwcGVyY2FzZSBzXG5sZXQgdW5jYXBpdGFsaXplIHMgPSBhcHBseTEgQ2hhci5sb3dlcmNhc2Ugc1xuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBuID0gcmVmIDAgaW5cbiAgbGV0IGJ1ZiA9IHJlZiAobWFrZSAyNTYgJ1xcMDAwJykgaW5cbiAgbGV0IHJlc2l6ZSAoKSA9XG4gICAgKCogcmVzaXplICopXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWluICgyICogbGVuZ3RoICFidWYpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgIGlmIGxlbmd0aCAhYnVmID0gbmV3X2xlbiB0aGVuIGZhaWx3aXRoIFwiQnl0ZXMub2Zfc2VxOiBjYW5ub3QgZ3JvdyBieXRlc1wiO1xuICAgIGxldCBuZXdfYnVmID0gbWFrZSBuZXdfbGVuICdcXDAwMCcgaW5cbiAgICBibGl0ICFidWYgMCBuZXdfYnVmIDAgIW47XG4gICAgYnVmIDo9IG5ld19idWZcbiAgaW5cbiAgU2VxLml0ZXJcbiAgICAoZnVuIGMgLT5cbiAgICAgICBpZiAhbiA9IGxlbmd0aCAhYnVmIHRoZW4gcmVzaXplKCk7XG4gICAgICAgc2V0ICFidWYgIW4gYztcbiAgICAgICBpbmNyIG4pXG4gICAgaTtcbiAgc3ViICFidWYgMCAhblxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG4oKiBUaGUgZ2V0XyBmdW5jdGlvbnMgYXJlIGFsbCBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxuXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNnVcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX2J5dGVzX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjRcIlxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG4gIGVsc2Ugc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG5cbmxldCBnZXRfaW50OCBiIGkgPVxuICAoKGdldF91aW50OCBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gOCkpIGFzciAoU3lzLmludF9zaXplIC0gOClcblxubGV0IGdldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF9pbnQxNl9uZSBiIGkgPVxuICAoKGdldF91aW50MTZfbmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9sZSBiIGkgPVxuICAoKGdldF91aW50MTZfbGUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9iZSBiIGkgPVxuICAoKGdldF91aW50MTZfYmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQzMl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50MzJfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4XG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9iZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHggZWxzZVxuICB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuXG5sZXQgc2V0X2ludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQxNl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X3VpbnQ4ID0gc2V0X2ludDhcbmxldCBzZXRfdWludDE2X25lID0gc2V0X2ludDE2X25lXG5sZXQgc2V0X3VpbnQxNl9iZSA9IHNldF9pbnQxNl9iZVxubGV0IHNldF91aW50MTZfbGUgPSBzZXRfaW50MTZfbGVcblxuKCogVVRGIGNvZGVjcyBhbmQgdmFsaWRhdGlvbnMgKilcblxubGV0IGRlY19pbnZhbGlkID0gVWNoYXIudXRmX2RlY29kZV9pbnZhbGlkXG5sZXRbQGlubGluZV0gZGVjX3JldCBuIHUgPSBVY2hhci51dGZfZGVjb2RlIG4gKFVjaGFyLnVuc2FmZV9vZl9pbnQgdSlcblxuKCogSW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvciwgaWYgd2UgZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIHdlXG4gICBjb25zdW1lIHRoZSBieXRlLCBvdGhlcndpc2Ugd2UgY29uc3VtZSB0aGUgW25dIGJ5dGVzIHByZWNlZWRpbmdcbiAgIHRoZSBlcnJvcmluZyBieXRlLlxuXG4gICBUaGlzIG1lYW5zIHRoYXQgaWYgYSBjbGllbnQgdXNlcyBkZWNvZGVzIHdpdGhvdXQgY2FyaW5nIGFib3V0XG4gICB2YWxpZGl0eSBpdCBuYXR1cmFsbHkgcmVwbGFjZSBib2d1cyBkYXRhIHdpdGggVWNoYXIucmVwIGFjY29yZGluZ1xuICAgdG8gdGhlIFdIQVRXRyBFbmNvZGluZyBzdGFuZGFyZC4gT3RoZXIgc2NoZW1lcyBhcmUgcG9zc2libGUgYnlcbiAgIGNvbnN1bHRpbmcgdGhlIG51bWJlciBvZiB1c2VkIGJ5dGVzIG9uIGludmFsaWQgZGVjb2Rlcy4gRm9yIG1vcmVcbiAgIGRldGFpbHMgc2VlIGh0dHBzOi8vaHNpdm9uZW4uZmkvYnJva2VuLXV0Zi04L1xuXG4gICBGb3IgdGhpcyByZWFzb24gaW4gW2dldF91dGZfOF91Y2hhcl0gd2UgZ3JhZHVhbGx5IGNoZWNrIHRoZSBuZXh0XG4gICBieXRlIGlzIGF2YWlsYWJsZSByYXRoZXIgdGhhbiBkb2luZyBpdCBpbW1lZGlhdGVseSBhZnRlciB0aGVcbiAgIGZpcnN0IGJ5dGUuIENvbnRyYXN0IHdpdGggW2lzX3ZhbGlkX3V0Zl84XS4gKilcblxuKCogVVRGLTggKilcblxubGV0W0BpbmxpbmVdIG5vdF9pbl94ODBfdG9feEJGIGIgPSBiIGxzciA2IDw+IDBiMTBcbmxldFtAaW5saW5lXSBub3RfaW5feEEwX3RvX3hCRiBiID0gYiBsc3IgNSA8PiAwYjEwMVxubGV0W0BpbmxpbmVdIG5vdF9pbl94ODBfdG9feDlGIGIgPSBiIGxzciA1IDw+IDBiMTAwXG5sZXRbQGlubGluZV0gbm90X2luX3g5MF90b194QkYgYiA9IGIgPCAweDkwIHx8IDB4QkYgPCBiXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OEYgYiA9IGIgbHNyIDQgPD4gMHg4XG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8yIGIwIGIxID1cbiAgKChiMCBsYW5kIDB4MUYpIGxzbCA2KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpKVxuXG5sZXRbQGlubGluZV0gdXRmXzhfdWNoYXJfMyBiMCBiMSBiMiA9XG4gICgoYjAgbGFuZCAweDBGKSBsc2wgMTIpIGxvclxuICAoKGIxIGxhbmQgMHgzRikgbHNsIDYpIGxvclxuICAoKGIyIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzID1cbiAgKChiMCBsYW5kIDB4MDcpIGxzbCAxOCkgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgMTIpIGxvclxuICAoKGIyIGxhbmQgMHgzRikgbHNsIDYpIGxvclxuICAoKGIzIGxhbmQgMHgzRikpXG5cbmxldCBnZXRfdXRmXzhfdWNoYXIgYiBpID1cbiAgbGV0IGIwID0gZ2V0X3VpbnQ4IGIgaSBpbiAoKiByYWlzZXMgaWYgW2ldIGlzIG5vdCBhIHZhbGlkIGluZGV4LiAqKVxuICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIENoYXIudW5zYWZlX2NociBiMCB3aXRoICgqIFNlZSBUaGUgVW5pY29kZSBTdGFuZGFyZCwgVGFibGUgMy43ICopXG4gIHwgJ1xceDAwJyAuLiAnXFx4N0YnIC0+IGRlY19yZXQgMSBiMFxuICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBkZWNfcmV0IDIgKHV0Zl84X3VjaGFyXzIgYjAgYjEpXG4gIHwgJ1xceEUwJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94QTBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RTEnIC4uICdcXHhFQycgfCAnXFx4RUUnIC4uICdcXHhFRicgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBkZWNfcmV0IDMgKHV0Zl84X3VjaGFyXzMgYjAgYjEgYjIpXG4gIHwgJ1xceEVEJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feDlGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RjAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g5MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgJ1xceEY0JyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feDhGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgbGV0IGIzID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMyB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgZGVjX3JldCA0ICh1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzKVxuICB8IF8gLT4gZGVjX2ludmFsaWQgMVxuXG5sZXQgc2V0X3V0Zl84X3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDggaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4MDA3RiAtPlxuICAgICAgc2V0X3VpbnQ4IGIgaSB1O1xuICAgICAgMVxuICB8IHUgd2hlbiB1IDw9IDB4MDdGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4QzAgbG9yICh1IGxzciA2KSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMilcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIChzZXRfdWludDggYiBpICgweEUwIGxvciAodSBsc3IgMTIpKTtcbiAgICAgICBzZXQgYiAoaSArIDEpICgweDgwIGxvciAoKHUgbHNyIDYpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIGxhc3QgKDB4ODAgbG9yICh1IGxhbmQgMHgzRikpO1xuICAgICAgIDMpXG4gIHwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIChzZXRfdWludDggYiBpICgweEYwIGxvciAodSBsc3IgMTgpKTtcbiAgICAgICBzZXQgYiAoaSArIDEpICgweDgwIGxvciAoKHUgbHNyIDEyKSBsYW5kIDB4M0YpKTtcbiAgICAgICBzZXQgYiAoaSArIDIpICgweDgwIGxvciAoKHUgbHNyIDYpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIGxhc3QgKDB4ODAgbG9yICh1IGxhbmQgMHgzRikpO1xuICAgICAgIDQpXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl84IGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gICAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIChnZXQgYiBpKSB3aXRoXG4gICAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gbG9vcCBtYXggYiAoaSArIDEpXG4gICAgfCAnXFx4QzInIC4uICdcXHhERicgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RTAnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feEEwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAyIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RUQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g5RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhGMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94OTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAyKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhGMScgLi4gJ1xceEYzJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEY0JyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194OEYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuXG4oKiBVVEYtMTZCRSAqKVxuXG5sZXQgZ2V0X3V0Zl8xNmJlX3VjaGFyIGIgaSA9XG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9iZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIGlmIGkgPSBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfcmV0IDIgdVxuICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGRlY19pbnZhbGlkIDJcbiAgfCBoaSAtPiAoKiBjb21iaW5lIFtoaV0gd2l0aCBhIGxvdyBzdXJyb2dhdGUgKilcbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAobWF4IC0gaSArIDEpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19pbnZhbGlkIDIgKCogcmV0cnkgaGVyZSAqKVxuICAgICAgfCBsbyAtPlxuICAgICAgICAgIGxldCB1ID0gKCgoaGkgbGFuZCAweDNGRikgbHNsIDEwKSBsb3IgKGxvIGxhbmQgMHgzRkYpKSArIDB4MTAwMDAgaW5cbiAgICAgICAgICBkZWNfcmV0IDQgdVxuXG5sZXQgc2V0X3V0Zl8xNmJlX3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgbWF0Y2ggVWNoYXIudG9faW50IHUgd2l0aFxuICB8IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2UgKHNldCBiIGkgdTsgMilcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgbGV0IHUnID0gdSAtIDB4MTAwMDAgaW5cbiAgICAgIGxldCBoaSA9ICgweEQ4MDAgbG9yICh1JyBsc3IgMTApKSBpblxuICAgICAgbGV0IGxvID0gKDB4REMwMCBsb3IgKHUnIGxhbmQgMHgzRkYpKSBpblxuICAgICAgc2V0IGIgaSBoaTsgc2V0IGIgKGkgKyAyKSBsbzsgNFxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBpc192YWxpZF91dGZfMTZiZSBiID1cbiAgbGV0IHJlYyBsb29wIG1heCBiIGkgPVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9iZSBpblxuICAgIGlmIGkgPiBtYXggdGhlbiB0cnVlIGVsc2VcbiAgICBpZiBpID0gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBsb29wIG1heCBiIChpICsgMilcbiAgICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGZhbHNlXG4gICAgfCBfaGkgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGZhbHNlXG4gICAgICAgIHwgX2xvIC0+IGxvb3AgbWF4IGIgKGkgKyA0KVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuXG4oKiBVVEYtMTZMRSAqKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIGIgaSA9XG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9sZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIGlmIGkgPSBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfcmV0IDIgdVxuICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGRlY19pbnZhbGlkIDJcbiAgfCBoaSAtPiAoKiBjb21iaW5lIFtoaV0gd2l0aCBhIGxvdyBzdXJyb2dhdGUgKilcbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAobWF4IC0gaSArIDEpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19pbnZhbGlkIDIgKCogcmV0cnkgaGVyZSAqKVxuICAgICAgfCBsbyAtPlxuICAgICAgICAgIGxldCB1ID0gKCgoaGkgbGFuZCAweDNGRikgbHNsIDEwKSBsb3IgKGxvIGxhbmQgMHgzRkYpKSArIDB4MTAwMDAgaW5cbiAgICAgICAgICBkZWNfcmV0IDQgdVxuXG5sZXQgc2V0X3V0Zl8xNmxlX3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgbWF0Y2ggVWNoYXIudG9faW50IHUgd2l0aFxuICB8IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2UgKHNldCBiIGkgdTsgMilcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgbGV0IHUnID0gdSAtIDB4MTAwMDAgaW5cbiAgICAgIGxldCBoaSA9ICgweEQ4MDAgbG9yICh1JyBsc3IgMTApKSBpblxuICAgICAgbGV0IGxvID0gKDB4REMwMCBsb3IgKHUnIGxhbmQgMHgzRkYpKSBpblxuICAgICAgc2V0IGIgaSBoaTsgc2V0IGIgKGkgKyAyKSBsbzsgNFxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBpc192YWxpZF91dGZfMTZsZSBiID1cbiAgbGV0IHJlYyBsb29wIG1heCBiIGkgPVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9sZSBpblxuICAgIGlmIGkgPiBtYXggdGhlbiB0cnVlIGVsc2VcbiAgICBpZiBpID0gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBsb29wIG1heCBiIChpICsgMilcbiAgICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGZhbHNlXG4gICAgfCBfaGkgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGZhbHNlXG4gICAgICAgIHwgX2xvIC0+IGxvb3AgbWF4IGIgKGkgKyA0KVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbnRcblxubGV0IHplcm8gPSAwXG5sZXQgb25lID0gMVxubGV0IG1pbnVzX29uZSA9IC0xXG5leHRlcm5hbCBuZWcgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcbmV4dGVybmFsIGFkZCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsIHN1YiA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlc3ViaW50XCJcbmV4dGVybmFsIG11bCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbmV4dGVybmFsIGRpdiA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsIHJlbSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbW9kaW50XCJcbmV4dGVybmFsIHN1Y2MgOiBpbnQgLT4gaW50ID0gXCIlc3VjY2ludFwiXG5leHRlcm5hbCBwcmVkIDogaW50IC0+IGludCA9IFwiJXByZWRpbnRcIlxubGV0IGFicyB4ID0gaWYgeCA+PSAwIHRoZW4geCBlbHNlIC14XG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcbmV4dGVybmFsIGxvZ2FuZCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsIGxvZ29yIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVvcmludFwiXG5leHRlcm5hbCBsb2d4b3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXhvcmludFwiXG5sZXQgbG9nbm90IHggPSBsb2d4b3IgeCAoLTEpXG5leHRlcm5hbCBzaGlmdF9sZWZ0IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc3JpbnRcIlxubGV0IGVxdWFsIDogaW50IC0+IGludCAtPiBib29sID0gKCA9IClcbmxldCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBTdGRsaWIuY29tcGFyZVxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5leHRlcm5hbCB0b19mbG9hdCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcblxuKCpcbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxubGV0IG9mX3N0cmluZyBzID0gdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcykgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuKilcblxuZXh0ZXJuYWwgZm9ybWF0X2ludCA6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxubGV0IHRvX3N0cmluZyB4ID0gZm9ybWF0X2ludCBcIiVkXCIgeFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTdHJpbmcgb3BlcmF0aW9ucywgYmFzZWQgb24gYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBieXRlcy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBieXRlcy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHNldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVzdHJpbmdfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9zdHJpbmdcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlc3RyaW5nX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+ICBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV9maWxsIDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiBjaGFyIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2ZpbGxfc3RyaW5nXCIgW0BAbm9hbGxvY11cblxubW9kdWxlIEIgPSBCeXRlc1xuXG5sZXQgYnRzID0gQi51bnNhZmVfdG9fc3RyaW5nXG5sZXQgYm9zID0gQi51bnNhZmVfb2Zfc3RyaW5nXG5cbmxldCBtYWtlIG4gYyA9XG4gIEIubWFrZSBuIGMgfD4gYnRzXG5sZXQgaW5pdCBuIGYgPVxuICBCLmluaXQgbiBmIHw+IGJ0c1xubGV0IGVtcHR5ID0gXCJcIlxubGV0IGNvcHkgcyA9XG4gIEIuY29weSAoYm9zIHMpIHw+IGJ0c1xubGV0IG9mX2J5dGVzID0gQi50b19zdHJpbmdcbmxldCB0b19ieXRlcyA9IEIub2Zfc3RyaW5nXG5sZXQgc3ViIHMgb2ZzIGxlbiA9XG4gIEIuc3ViIChib3Mgcykgb2ZzIGxlbiB8PiBidHNcbmxldCBmaWxsID1cbiAgQi5maWxsXG5sZXQgYmxpdCA9XG4gIEIuYmxpdF9zdHJpbmdcblxubGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29uY2F0XCJcblxubGV0IHJlYyBzdW1fbGVuZ3RocyBhY2Mgc2VwbGVuID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBhY2NcbiAgfCBoZCA6OiBbXSAtPiBsZW5ndGggaGQgKyBhY2NcbiAgfCBoZCA6OiB0bCAtPiBzdW1fbGVuZ3RocyAoZW5zdXJlX2dlIChsZW5ndGggaGQgKyBzZXBsZW4gKyBhY2MpIGFjYykgc2VwbGVuIHRsXG5cbmxldCByZWMgdW5zYWZlX2JsaXRzIGRzdCBwb3Mgc2VwIHNlcGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZHN0XG4gIHwgaGQgOjogW10gLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7IGRzdFxuICB8IGhkIDo6IHRsIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpO1xuICAgIHVuc2FmZV9ibGl0IHNlcCAwIGRzdCAocG9zICsgbGVuZ3RoIGhkKSBzZXBsZW47XG4gICAgdW5zYWZlX2JsaXRzIGRzdCAocG9zICsgbGVuZ3RoIGhkICsgc2VwbGVuKSBzZXAgc2VwbGVuIHRsXG5cbmxldCBjb25jYXQgc2VwID0gZnVuY3Rpb25cbiAgICBbXSAtPiBcIlwiXG4gIHwgbCAtPiBsZXQgc2VwbGVuID0gbGVuZ3RoIHNlcCBpbiBidHMgQEBcbiAgICAgICAgICB1bnNhZmVfYmxpdHNcbiAgICAgICAgICAgIChCLmNyZWF0ZSAoc3VtX2xlbmd0aHMgMCBzZXBsZW4gbCkpXG4gICAgICAgICAgICAwIHNlcCBzZXBsZW4gbFxuXG5sZXQgY2F0ID0gKCBeIClcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXIgZiBzID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkbyBmICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaXRlcmkgZiBzID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgcyBpKSBkb25lXG5cbmxldCBtYXAgZiBzID1cbiAgQi5tYXAgZiAoYm9zIHMpIHw+IGJ0c1xubGV0IG1hcGkgZiBzID1cbiAgQi5tYXBpIGYgKGJvcyBzKSB8PiBidHNcbmxldCBmb2xkX3JpZ2h0IGYgeCBhID1cbiAgQi5mb2xkX3JpZ2h0IGYgKGJvcyB4KSBhXG5sZXQgZm9sZF9sZWZ0IGYgYSB4ID1cbiAgQi5mb2xkX2xlZnQgZiBhIChib3MgeClcbmxldCBleGlzdHMgZiBzID1cbiAgQi5leGlzdHMgZiAoYm9zIHMpXG5sZXQgZm9yX2FsbCBmIHMgPVxuICBCLmZvcl9hbGwgZiAoYm9zIHMpXG5cbigqIEJld2FyZTogd2UgY2Fubm90IHVzZSBCLnRyaW0gb3IgQi5lc2NhcGUgYmVjYXVzZSB0aGV5IGFsd2F5cyBtYWtlIGFcbiAgIGNvcHksIGJ1dCBTdHJpbmcubWxpIHNwZWxscyBvdXQgc29tZSBjYXNlcyB3aGVyZSB3ZSBhcmUgbm90IGFsbG93ZWRcbiAgIHRvIG1ha2UgYSBjb3B5LiAqKVxuXG5sZXQgaXNfc3BhY2UgPSBmdW5jdGlvblxuICB8ICcgJyB8ICdcXDAxMicgfCAnXFxuJyB8ICdcXHInIHwgJ1xcdCcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxubGV0IHRyaW0gcyA9XG4gIGlmIHMgPSBcIlwiIHRoZW4gc1xuICBlbHNlIGlmIGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgMCkgfHwgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAobGVuZ3RoIHMgLSAxKSlcbiAgICB0aGVuIGJ0cyAoQi50cmltIChib3MgcykpXG4gIGVsc2Ugc1xuXG5sZXQgZXNjYXBlZCBzID1cbiAgbGV0IHJlYyBlc2NhcGVfaWZfbmVlZGVkIHMgbiBpID1cbiAgICBpZiBpID49IG4gdGhlbiBzIGVsc2VcbiAgICAgIG1hdGNoIHVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgIHwgJ1xcXCInIHwgJ1xcXFwnIHwgJ1xcMDAwJy4uJ1xcMDMxJyB8ICdcXDEyNycuLiAnXFwyNTUnIC0+XG4gICAgICAgICAgYnRzIChCLmVzY2FwZWQgKGJvcyBzKSlcbiAgICAgIHwgXyAtPiBlc2NhcGVfaWZfbmVlZGVkIHMgbiAoaSsxKVxuICBpblxuICBlc2NhcGVfaWZfbmVlZGVkIHMgKGxlbmd0aCBzKSAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID1cbiAgQi51cHBlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9XG4gIEIubG93ZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLnVuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHNwbGl0X29uX2NoYXIgc2VwIHMgPVxuICBsZXQgciA9IHJlZiBbXSBpblxuICBsZXQgaiA9IHJlZiAobGVuZ3RoIHMpIGluXG4gIGZvciBpID0gbGVuZ3RoIHMgLSAxIGRvd250byAwIGRvXG4gICAgaWYgdW5zYWZlX2dldCBzIGkgPSBzZXAgdGhlbiBiZWdpblxuICAgICAgciA6PSBzdWIgcyAoaSArIDEpICghaiAtIGkgLSAxKSA6OiAhcjtcbiAgICAgIGogOj0gaVxuICAgIGVuZFxuICBkb25lO1xuICBzdWIgcyAwICFqIDo6ICFyXG5cbigqIERlcHJlY2F0ZWQgZnVuY3Rpb25zIGltcGxlbWVudGVkIHZpYSBvdGhlciBkZXByZWNhdGVkIGZ1bmN0aW9ucyAqKVxuW0BAQG9jYW1sLndhcm5pbmcgXCItM1wiXVxubGV0IHVwcGVyY2FzZSBzID1cbiAgQi51cHBlcmNhc2UgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2UgcyA9XG4gIEIubG93ZXJjYXNlIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZSBzID1cbiAgQi5jYXBpdGFsaXplIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplIHMgPVxuICBCLnVuY2FwaXRhbGl6ZSAoYm9zIHMpIHw+IGJ0c1xuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3RyaW5nX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gYm9zIHMgfD4gQi50b19zZXFcblxubGV0IHRvX3NlcWkgcyA9IGJvcyBzIHw+IEIudG9fc2VxaVxuXG5sZXQgb2Zfc2VxIGcgPSBCLm9mX3NlcSBnIHw+IGJ0c1xuXG4oKiBVVEYgZGVjb2RlcnMgYW5kIHZhbGlkYXRvcnMgKilcblxubGV0IGdldF91dGZfOF91Y2hhciBzIGkgPSBCLmdldF91dGZfOF91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfOCBzID0gQi5pc192YWxpZF91dGZfOCAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2YmVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2YmUgKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmxlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmxlIChib3MgcylcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9zdHJpbmdfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfc3RyaW5nX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX3N0cmluZ19nZXQ2NFwiXG5cbmxldCBnZXRfaW50OCBzIGkgPSBCLmdldF9pbnQ4IChib3MgcykgaVxubGV0IGdldF91aW50MTZfbGUgcyBpID0gQi5nZXRfdWludDE2X2xlIChib3MgcykgaVxubGV0IGdldF91aW50MTZfYmUgcyBpID0gQi5nZXRfdWludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9uZSBzIGkgPSBCLmdldF9pbnQxNl9uZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbGUgcyBpID0gQi5nZXRfaW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2JlIHMgaSA9IEIuZ2V0X2ludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9sZSBzIGkgPSBCLmdldF9pbnQzMl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfYmUgcyBpID0gQi5nZXRfaW50MzJfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2xlIHMgaSA9IEIuZ2V0X2ludDY0X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9iZSBzIGkgPSBCLmdldF9pbnQ2NF9iZSAoYm9zIHMpIGlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gdW5pdCA9ICgpXG5cbmxldCBlcXVhbCAoKSAoKSA9IHRydWVcbmxldCBjb21wYXJlICgpICgpID0gMFxubGV0IHRvX3N0cmluZyAoKSA9IFwiKClcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGV4dGVybl9mbGFncyA9XG4gICAgTm9fc2hhcmluZ1xuICB8IENsb3N1cmVzXG4gIHwgQ29tcGF0XzMyXG4oKiBub3RlOiB0aGlzIHR5cGUgZGVmaW5pdGlvbiBpcyB1c2VkIGluICdydW50aW1lL2RlYnVnZ2VyLmMnICopXG5cbmV4dGVybmFsIHRvX2NoYW5uZWw6IG91dF9jaGFubmVsIC0+ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxuZXh0ZXJuYWwgdG9fYnl0ZXM6ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IGJ5dGVzXG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzXCJcbmV4dGVybmFsIHRvX3N0cmluZzogJ2EgLT4gZXh0ZXJuX2ZsYWdzIGxpc3QgLT4gc3RyaW5nXG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZ1wiXG5leHRlcm5hbCB0b19idWZmZXJfdW5zYWZlOlxuICAgICAgYnl0ZXMgLT4gaW50IC0+IGludCAtPiAnYSAtPiBleHRlcm5fZmxhZ3MgbGlzdCAtPiBpbnRcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnVmZmVyXCJcblxubGV0IHRvX2J1ZmZlciBidWZmIG9mcyBsZW4gdiBmbGFncyA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC50b19idWZmZXI6IHN1YnN0cmluZyBvdXQgb2YgYm91bmRzXCJcbiAgZWxzZSB0b19idWZmZXJfdW5zYWZlIGJ1ZmYgb2ZzIGxlbiB2IGZsYWdzXG5cbigqIFRoZSBmdW5jdGlvbnMgYmVsb3cgdXNlIGJ5dGUgc2VxdWVuY2VzIGFzIGlucHV0LCBuZXZlciB1c2luZyBhbnlcbiAgIG11dGF0aW9uLiBJdCBtYWtlcyBzZW5zZSB0byB1c2Ugbm9uLW11dGF0ZWQgW2J5dGVzXSByYXRoZXIgdGhhblxuICAgW3N0cmluZ10sIGJlY2F1c2Ugd2UgcmVhbGx5IHdvcmsgd2l0aCBzZXF1ZW5jZXMgb2YgYnl0ZXMsIG5vdFxuICAgYSB0ZXh0IHJlcHJlc2VudGF0aW9uLlxuKilcblxuZXh0ZXJuYWwgZnJvbV9jaGFubmVsOiBpbl9jaGFubmVsIC0+ICdhID0gXCJjYW1sX2lucHV0X3ZhbHVlXCJcbmV4dGVybmFsIGZyb21fYnl0ZXNfdW5zYWZlOiBieXRlcyAtPiBpbnQgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlc1wiXG5leHRlcm5hbCBkYXRhX3NpemVfdW5zYWZlOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX21hcnNoYWxfZGF0YV9zaXplXCJcblxubGV0IGhlYWRlcl9zaXplID0gMjBcbmxldCBkYXRhX3NpemUgYnVmZiBvZnMgPVxuICBpZiBvZnMgPCAwIHx8IG9mcyA+IEJ5dGVzLmxlbmd0aCBidWZmIC0gaGVhZGVyX3NpemVcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIk1hcnNoYWwuZGF0YV9zaXplXCJcbiAgZWxzZSBkYXRhX3NpemVfdW5zYWZlIGJ1ZmYgb2ZzXG5sZXQgdG90YWxfc2l6ZSBidWZmIG9mcyA9IGhlYWRlcl9zaXplICsgZGF0YV9zaXplIGJ1ZmYgb2ZzXG5cbmxldCBmcm9tX2J5dGVzIGJ1ZmYgb2ZzID1cbiAgaWYgb2ZzIDwgMCB8fCBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIGhlYWRlcl9zaXplXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJNYXJzaGFsLmZyb21fYnl0ZXNcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IGxlbiA9IGRhdGFfc2l6ZV91bnNhZmUgYnVmZiBvZnMgaW5cbiAgICBpZiBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIChoZWFkZXJfc2l6ZSArIGxlbilcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC5mcm9tX2J5dGVzXCJcbiAgICBlbHNlIGZyb21fYnl0ZXNfdW5zYWZlIGJ1ZmYgb2ZzXG4gIGVuZFxuXG5sZXQgZnJvbV9zdHJpbmcgYnVmZiBvZnMgPVxuICAoKiBCeXRlcy51bnNhZmVfb2Zfc3RyaW5nIGlzIHNhZmUgaGVyZSwgYXMgdGhlIHByb2R1Y2VkIGJ5dGVcbiAgICAgc2VxdWVuY2UgaXMgbmV2ZXIgbXV0YXRlZCAqKVxuICBmcm9tX2J5dGVzIChCeXRlcy51bnNhZmVfb2Zfc3RyaW5nIGJ1ZmYpIG9mc1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgYXJyYXlzLiAqKVxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxuKCogQXJyYXkgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCBjcmVhdGU6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgdW5zYWZlX3N1YiA6ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfc3ViXCJcbmV4dGVybmFsIGFwcGVuZF9wcmltIDogJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfYXBwZW5kXCJcbmV4dGVybmFsIGNvbmNhdCA6ICdhIGFycmF5IGxpc3QgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfY29uY2F0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2ZpbGxcIlxuZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0OiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcbmxldCBtYWtlX2Zsb2F0ID0gY3JlYXRlX2Zsb2F0XG5cbm1vZHVsZSBGbG9hdGFycmF5ID0gc3RydWN0XG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiBmbG9hdGFycmF5ID0gXCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgbGVuZ3RoIDogZmxvYXRhcnJheSAtPiBpbnQgPSBcIiVmbG9hdGFycmF5X2xlbmd0aFwiXG4gIGV4dGVybmFsIGdldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV9zYWZlX2dldFwiXG4gIGV4dGVybmFsIHNldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXRcbiAgICAgID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcbmVuZFxuXG5sZXQgaW5pdCBsIGYgPVxuICBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZVxuICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuaW5pdFwiXG4gICgqIFNlZSAjNjU3NS4gV2UgY291bGQgYWxzbyBjaGVjayBmb3IgbWF4aW11bSBhcnJheSBzaXplLCBidXQgdGhpcyBkZXBlbmRzXG4gICAgIG9uIHdoZXRoZXIgd2UgY3JlYXRlIGEgZmxvYXQgYXJyYXkgb3IgYSByZWd1bGFyIG9uZS4uLiAqKVxuICBlbHNlXG4gICBsZXQgcmVzID0gY3JlYXRlIGwgKGYgMCkgaW5cbiAgIGZvciBpID0gMSB0byBwcmVkIGwgZG9cbiAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgZG9uZTtcbiAgIHJlc1xuXG5sZXQgbWFrZV9tYXRyaXggc3ggc3kgaW5pdCA9XG4gIGxldCByZXMgPSBjcmVhdGUgc3ggW3x8XSBpblxuICBmb3IgeCA9IDAgdG8gcHJlZCBzeCBkb1xuICAgIHVuc2FmZV9zZXQgcmVzIHggKGNyZWF0ZSBzeSBpbml0KVxuICBkb25lO1xuICByZXNcblxubGV0IGNyZWF0ZV9tYXRyaXggPSBtYWtlX21hdHJpeFxuXG5sZXQgY29weSBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpbiBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSB1bnNhZmVfc3ViIGEgMCBsXG5cbmxldCBhcHBlbmQgYTEgYTIgPVxuICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgaWYgbDEgPSAwIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGxlbmd0aCBhMiA9IDAgdGhlbiB1bnNhZmVfc3ViIGExIDAgbDFcbiAgZWxzZSBhcHBlbmRfcHJpbSBhMSBhMlxuXG5sZXQgc3ViIGEgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuc3ViXCJcbiAgZWxzZSB1bnNhZmVfc3ViIGEgb2ZzIGxlblxuXG5sZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxubGV0IGJsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBhMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggYTIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IGExIG9mczEgYTIgb2ZzMiBsZW5cblxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBpdGVyMiBmIGEgYiA9XG4gIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2VcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxubGV0IG1hcCBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZih1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZih1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwMiBmIGEgYiA9XG4gIGxldCBsYSA9IGxlbmd0aCBhIGluXG4gIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gIGlmIGxhIDw+IGxiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lm1hcDI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgZWxzZSBiZWdpblxuICAgIGlmIGxhID0gMCB0aGVuIFt8fF0gZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgKGYgKHVuc2FmZV9nZXQgYSAwKSAodW5zYWZlX2dldCBiIDApKSBpblxuICAgICAgZm9yIGkgPSAxIHRvIGxhIC0gMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpICh1bnNhZmVfZ2V0IGIgaSkpXG4gICAgICBkb25lO1xuICAgICAgclxuICAgIGVuZFxuICBlbmRcblxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgbWFwaSBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZiAwICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiBpICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgdG9fbGlzdCBhID1cbiAgbGV0IHJlYyB0b2xpc3QgaSByZXMgPVxuICAgIGlmIGkgPCAwIHRoZW4gcmVzIGVsc2UgdG9saXN0IChpIC0gMSkgKHVuc2FmZV9nZXQgYSBpIDo6IHJlcykgaW5cbiAgdG9saXN0IChsZW5ndGggYSAtIDEpIFtdXG5cbigqIENhbm5vdCB1c2UgTGlzdC5sZW5ndGggaGVyZSBiZWNhdXNlIHRoZSBMaXN0IG1vZHVsZSBkZXBlbmRzIG9uIEFycmF5LiAqKVxubGV0IHJlYyBsaXN0X2xlbmd0aCBhY2N1ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBhY2N1XG4gIHwgXzo6dCAtPiBsaXN0X2xlbmd0aCAoc3VjYyBhY2N1KSB0XG5cbmxldCBvZl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBhID0gY3JlYXRlIChsaXN0X2xlbmd0aCAwIGwpIGhkIGluXG4gICAgICBsZXQgcmVjIGZpbGwgaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgW10gLT4gYVxuICAgICAgICB8IGhkOjp0bCAtPiB1bnNhZmVfc2V0IGEgaSBoZDsgZmlsbCAoaSsxKSB0bCBpblxuICAgICAgZmlsbCAxIHRsXG5cbmxldCBmb2xkX2xlZnQgZiB4IGEgPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lO1xuICAhclxuXG5sZXQgZm9sZF9sZWZ0X21hcCBmIGFjYyBpbnB1dF9hcnJheSA9XG4gIGxldCBsZW4gPSBsZW5ndGggaW5wdXRfYXJyYXkgaW5cbiAgaWYgbGVuID0gMCB0aGVuIChhY2MsIFt8fF0pIGVsc2UgYmVnaW5cbiAgICBsZXQgYWNjLCBlbHQgPSBmIGFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSAwKSBpblxuICAgIGxldCBvdXRwdXRfYXJyYXkgPSBjcmVhdGUgbGVuIGVsdCBpblxuICAgIGxldCBhY2MgPSByZWYgYWNjIGluXG4gICAgZm9yIGkgPSAxIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBhY2MnLCBlbHQgPSBmICFhY2MgKHVuc2FmZV9nZXQgaW5wdXRfYXJyYXkgaSkgaW5cbiAgICAgIGFjYyA6PSBhY2MnO1xuICAgICAgdW5zYWZlX3NldCBvdXRwdXRfYXJyYXkgaSBlbHQ7XG4gICAgZG9uZTtcbiAgICAhYWNjLCBvdXRwdXRfYXJyYXlcbiAgZW5kXG5cbmxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IGxlbmd0aCBhIC0gMSBkb3dudG8gMCBkb1xuICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gIGRvbmU7XG4gICFyXG5cbmxldCBleGlzdHMgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwyIHAgbDEgbDIgPVxuICBsZXQgbjEgPSBsZW5ndGggbDFcbiAgYW5kIG4yID0gbGVuZ3RoIGwyIGluXG4gIGlmIG4xIDw+IG4yIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5mb3JfYWxsMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgbDEgaSkgKHVuc2FmZV9nZXQgbDIgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IGV4aXN0czIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmV4aXN0czJcIlxuICBlbHNlIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbjEgdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBtZW0geCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhIGkpIHggPSAwIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbXEgeCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgeCA9PSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZpbmRfb3B0IHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeFxuICAgICAgZWxzZSBsb29wIChzdWNjIGkpXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9tYXAgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChzdWNjIGkpXG4gICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBzcGxpdCB4ID1cbiAgaWYgeCA9IFt8fF0gdGhlbiBbfHxdLCBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgYTAsIGIwID0gdW5zYWZlX2dldCB4IDAgaW5cbiAgICBsZXQgbiA9IGxlbmd0aCB4IGluXG4gICAgbGV0IGEgPSBjcmVhdGUgbiBhMCBpblxuICAgIGxldCBiID0gY3JlYXRlIG4gYjAgaW5cbiAgICBmb3IgaSA9IDEgdG8gbiAtIDEgZG9cbiAgICAgIGxldCBhaSwgYmkgPSB1bnNhZmVfZ2V0IHggaSBpblxuICAgICAgdW5zYWZlX3NldCBhIGkgYWk7XG4gICAgICB1bnNhZmVfc2V0IGIgaSBiaVxuICAgIGRvbmU7XG4gICAgYSwgYlxuICBlbmRcblxubGV0IGNvbWJpbmUgYSBiID1cbiAgbGV0IG5hID0gbGVuZ3RoIGEgaW5cbiAgbGV0IG5iID0gbGVuZ3RoIGIgaW5cbiAgaWYgbmEgPD4gbmIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmNvbWJpbmVcIjtcbiAgaWYgbmEgPSAwIHRoZW4gW3x8XVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHggPSBjcmVhdGUgbmEgKHVuc2FmZV9nZXQgYSAwLCB1bnNhZmVfZ2V0IGIgMCkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbmEgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHggaSAodW5zYWZlX2dldCBhIGksIHVuc2FmZV9nZXQgYiBpKVxuICAgIGRvbmU7XG4gICAgeFxuICBlbmRcblxuZXhjZXB0aW9uIEJvdHRvbSBvZiBpbnRcbmxldCBzb3J0IGNtcCBhID1cbiAgbGV0IG1heHNvbiBsIGkgPVxuICAgIGxldCBpMzEgPSBpK2kraSsxIGluXG4gICAgbGV0IHggPSByZWYgaTMxIGluXG4gICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgIGlmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwIHRoZW4geCA6PSBpMzErMTtcbiAgICAgIGlmIGNtcCAoZ2V0IGEgIXgpIChnZXQgYSAoaTMxKzIpKSA8IDAgdGhlbiB4IDo9IGkzMSsyO1xuICAgICAgIXhcbiAgICBlbmQgZWxzZVxuICAgICAgaWYgaTMxKzEgPCBsICYmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwXG4gICAgICB0aGVuIGkzMSsxXG4gICAgICBlbHNlIGlmIGkzMSA8IGwgdGhlbiBpMzEgZWxzZSByYWlzZSAoQm90dG9tIGkpXG4gIGluXG4gIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgIGlmIGNtcCAoZ2V0IGEgaikgZSA+IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICB0cmlja2xlZG93biBsIGogZTtcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgc2V0IGEgaSBlO1xuICAgIGVuZDtcbiAgaW5cbiAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgbGV0IHJlYyBidWJibGVkb3duIGwgaSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgYnViYmxlZG93biBsIGpcbiAgaW5cbiAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gIGxldCByZWMgdHJpY2tsZXVwIGkgZSA9XG4gICAgbGV0IGZhdGhlciA9IChpIC0gMSkgLyAzIGluXG4gICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgaWYgY21wIChnZXQgYSBmYXRoZXIpIGUgPCAwIHRoZW4gYmVnaW5cbiAgICAgIHNldCBhIGkgKGdldCBhIGZhdGhlcik7XG4gICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgZm9yIGkgPSBsIC0gMSBkb3dudG8gMiBkb1xuICAgIGxldCBlID0gKGdldCBhIGkpIGluXG4gICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgdHJpY2tsZXVwIChidWJibGUgaSAwKSBlO1xuICBkb25lO1xuICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG5cbmxldCBjdXRvZmYgPSA1XG5sZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICBsZXQgbWVyZ2Ugc3JjMW9mcyBzcmMxbGVuIHNyYzIgc3JjMm9mcyBzcmMybGVuIGRzdCBkc3RvZnMgPVxuICAgIGxldCBzcmMxciA9IHNyYzFvZnMgKyBzcmMxbGVuIGFuZCBzcmMyciA9IHNyYzJvZnMgKyBzcmMybGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgaWYgY21wIHMxIHMyIDw9IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczE7XG4gICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICBpZiBpMSA8IHNyYzFyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIChnZXQgYSBpMSkgaTIgczIgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBzcmMyIGkyIGRzdCAoZCArIDEpIChzcmMyciAtIGkyKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICBsZXQgaTIgPSBpMiArIDEgaW5cbiAgICAgICAgaWYgaTIgPCBzcmMyciB0aGVuXG4gICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJsaXQgYSBpMSBkc3QgKGQgKyAxKSAoc3JjMXIgLSBpMSlcbiAgICAgIGVuZFxuICAgIGluIGxvb3Agc3JjMW9mcyAoZ2V0IGEgc3JjMW9mcykgc3JjMm9mcyAoZ2V0IHNyYzIgc3JjMm9mcykgZHN0b2ZzO1xuICBpblxuICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSAoc3Jjb2ZzICsgaSkpIGluXG4gICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICB3aGlsZSAoIWogPj0gZHN0b2ZzICYmIGNtcCAoZ2V0IGRzdCAhaikgZSA+IDApIGRvXG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgKGdldCBkc3QgIWopO1xuICAgICAgICBkZWNyIGo7XG4gICAgICBkb25lO1xuICAgICAgc2V0IGRzdCAoIWogKyAxKSBlO1xuICAgIGRvbmU7XG4gIGluXG4gIGxldCByZWMgc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgIGxldCBsMSA9IGxlbiAvIDIgaW5cbiAgICAgIGxldCBsMiA9IGxlbiAtIGwxIGluXG4gICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgIHNvcnR0byBzcmNvZnMgYSAoc3Jjb2ZzICsgbDIpIGwxO1xuICAgICAgbWVyZ2UgKHNyY29mcyArIGwyKSBsMSBkc3QgKGRzdG9mcyArIGwxKSBsMiBkc3QgZHN0b2ZzO1xuICAgIGVuZDtcbiAgaW5cbiAgbGV0IGwgPSBsZW5ndGggYSBpblxuICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgbGV0IGwxID0gbCAvIDIgaW5cbiAgICBsZXQgbDIgPSBsIC0gbDEgaW5cbiAgICBsZXQgdCA9IG1ha2UgbDIgKGdldCBhIDApIGluXG4gICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICBzb3J0dG8gMCBhIGwyIGwxO1xuICAgIG1lcmdlIGwyIGwxIHQgMCBsMiBhIDA7XG4gIGVuZFxuXG5cbmxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICAgIGVsc2UgU2VxLk5pbFxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBhID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgdGhlblxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9yZXZfbGlzdCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW3x8XVxuICB8IGhkOjp0bCBhcyBsIC0+XG4gICAgICBsZXQgbGVuID0gbGlzdF9sZW5ndGggMCBsIGluXG4gICAgICBsZXQgYSA9IGNyZWF0ZSBsZW4gaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpLTEpIHRsXG4gICAgICBpblxuICAgICAgZmlsbCAobGVuLTIpIHRsXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBsID0gU2VxLmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IHg6OmFjYykgW10gaSBpblxuICBvZl9yZXZfbGlzdCBsXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50MzJdOiAzMi1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50MzIgLT4gaW50ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX3RvX2Zsb2F0XCIgXCJjYW1sX2ludDMyX3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCB6ZXJvID0gMGxcbmxldCBvbmUgPSAxbFxubGV0IG1pbnVzX29uZSA9IC0xbFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFsXG5sZXQgcHJlZCBuID0gc3ViIG4gMWxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMGwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMGxcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRmxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMWwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBtYXRjaCBTeXMud29yZF9zaXplIHdpdGhcbiAgfCAzMiAtPlxuICAgICAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgICAgIGZ1biBuIC0+XG4gICAgICAgIGlmIGNvbXBhcmUgemVybyBuIDw9IDAgJiYgY29tcGFyZSBuIG1heF9pbnQgPD0gMCB0aGVuXG4gICAgICAgICAgU29tZSAodG9faW50IG4pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBOb25lXG4gIHwgNjQgLT5cbiAgICAgICgqIFNvIHRoYXQgaXQgY29tcGlsZXMgaW4gMzItYml0ICopXG4gICAgICBsZXQgbWFzayA9IDB4RkZGRiBsc2wgMTYgbG9yIDB4RkZGRiBpblxuICAgICAgZnVuIG4gLT4gU29tZSAodG9faW50IG4gbGFuZCBtYXNrKVxuICB8IF8gLT5cbiAgICAgIGFzc2VydCBmYWxzZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDMyID0gXCJjYW1sX2ludDMyX29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBpbnQzMlxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lXG4gICBiaXRuZXNzLiBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSBuIGQgPCAwIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIHIgZCA+PSAwIHRoZW4gc3VjYyBxIGVsc2UgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFRoZSBwYXJzaW5nIGVuZ2luZSAqKVxuXG5vcGVuIExleGluZ1xuXG4oKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIHBhcnNpbmcgZW5naW5lICopXG5cbnR5cGUgcGFyc2VyX2VudiA9XG4gIHsgbXV0YWJsZSBzX3N0YWNrIDogaW50IGFycmF5OyAgICAgICAgKCogU3RhdGVzICopXG4gICAgbXV0YWJsZSB2X3N0YWNrIDogT2JqLnQgYXJyYXk7ICAgICAgKCogU2VtYW50aWMgYXR0cmlidXRlcyAqKVxuICAgIG11dGFibGUgc3ltYl9zdGFydF9zdGFjayA6IHBvc2l0aW9uIGFycmF5OyAoKiBTdGFydCBwb3NpdGlvbnMgKilcbiAgICBtdXRhYmxlIHN5bWJfZW5kX3N0YWNrIDogcG9zaXRpb24gYXJyYXk7ICAgKCogRW5kIHBvc2l0aW9ucyAqKVxuICAgIG11dGFibGUgc3RhY2tzaXplIDogaW50OyAgICAgICAgICAgICgqIFNpemUgb2YgdGhlIHN0YWNrcyAqKVxuICAgIG11dGFibGUgc3RhY2tiYXNlIDogaW50OyAgICAgICAgICAgICgqIEJhc2Ugc3AgZm9yIGN1cnJlbnQgcGFyc2UgKilcbiAgICBtdXRhYmxlIGN1cnJfY2hhciA6IGludDsgICAgICAgICAgICAoKiBMYXN0IHRva2VuIHJlYWQgKilcbiAgICBtdXRhYmxlIGx2YWwgOiBPYmoudDsgICAgICAgICAgICAgICAoKiBJdHMgc2VtYW50aWMgYXR0cmlidXRlICopXG4gICAgbXV0YWJsZSBzeW1iX3N0YXJ0IDogcG9zaXRpb247ICAgICAgKCogU3RhcnQgcG9zLiBvZiB0aGUgY3VycmVudCBzeW1ib2wqKVxuICAgIG11dGFibGUgc3ltYl9lbmQgOiBwb3NpdGlvbjsgICAgICAgICgqIEVuZCBwb3MuIG9mIHRoZSBjdXJyZW50IHN5bWJvbCAqKVxuICAgIG11dGFibGUgYXNwIDogaW50OyAgICAgICAgICAgICAgICAgICgqIFRoZSBzdGFjayBwb2ludGVyIGZvciBhdHRyaWJ1dGVzICopXG4gICAgbXV0YWJsZSBydWxlX2xlbiA6IGludDsgICAgICAgICAgICAgKCogTnVtYmVyIG9mIHJocyBpdGVtcyBpbiB0aGUgcnVsZSAqKVxuICAgIG11dGFibGUgcnVsZV9udW1iZXIgOiBpbnQ7ICAgICAgICAgICgqIFJ1bGUgbnVtYmVyIHRvIHJlZHVjZSBieSAqKVxuICAgIG11dGFibGUgc3AgOiBpbnQ7ICAgICAgICAgICAgICAgICAgICgqIFNhdmVkIHNwIGZvciBwYXJzZV9lbmdpbmUgKilcbiAgICBtdXRhYmxlIHN0YXRlIDogaW50OyAgICAgICAgICAgICAgICAoKiBTYXZlZCBzdGF0ZSBmb3IgcGFyc2VfZW5naW5lICopXG4gICAgbXV0YWJsZSBlcnJmbGFnIDogaW50IH0gICAgICAgICAgICAgKCogU2F2ZWQgZXJyb3IgZmxhZyBmb3IgcGFyc2VfZW5naW5lICopXG5bQEB3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXVxuXG50eXBlIHBhcnNlX3RhYmxlcyA9XG4gIHsgYWN0aW9ucyA6IChwYXJzZXJfZW52IC0+IE9iai50KSBhcnJheTtcbiAgICB0cmFuc2xfY29uc3QgOiBpbnQgYXJyYXk7XG4gICAgdHJhbnNsX2Jsb2NrIDogaW50IGFycmF5O1xuICAgIGxocyA6IHN0cmluZztcbiAgICBsZW4gOiBzdHJpbmc7XG4gICAgZGVmcmVkIDogc3RyaW5nO1xuICAgIGRnb3RvIDogc3RyaW5nO1xuICAgIHNpbmRleCA6IHN0cmluZztcbiAgICByaW5kZXggOiBzdHJpbmc7XG4gICAgZ2luZGV4IDogc3RyaW5nO1xuICAgIHRhYmxlc2l6ZSA6IGludDtcbiAgICB0YWJsZSA6IHN0cmluZztcbiAgICBjaGVjayA6IHN0cmluZztcbiAgICBlcnJvcl9mdW5jdGlvbiA6IHN0cmluZyAtPiB1bml0O1xuICAgIG5hbWVzX2NvbnN0IDogc3RyaW5nO1xuICAgIG5hbWVzX2Jsb2NrIDogc3RyaW5nIH1cblxuZXhjZXB0aW9uIFlZZXhpdCBvZiBPYmoudFxuZXhjZXB0aW9uIFBhcnNlX2Vycm9yXG5cbnR5cGUgcGFyc2VyX2lucHV0ID1cbiAgICBTdGFydFxuICB8IFRva2VuX3JlYWRcbiAgfCBTdGFja3NfZ3Jvd25fMVxuICB8IFN0YWNrc19ncm93bl8yXG4gIHwgU2VtYW50aWNfYWN0aW9uX2NvbXB1dGVkXG4gIHwgRXJyb3JfZGV0ZWN0ZWRcblxudHlwZSBwYXJzZXJfb3V0cHV0ID1cbiAgICBSZWFkX3Rva2VuXG4gIHwgUmFpc2VfcGFyc2VfZXJyb3JcbiAgfCBHcm93X3N0YWNrc18xXG4gIHwgR3Jvd19zdGFja3NfMlxuICB8IENvbXB1dGVfc2VtYW50aWNfYWN0aW9uXG4gIHwgQ2FsbF9lcnJvcl9mdW5jdGlvblxuXG4oKiB0byBhdm9pZCB3YXJuaW5ncyAqKVxubGV0IF8gPSBbUmVhZF90b2tlbjsgUmFpc2VfcGFyc2VfZXJyb3I7IEdyb3dfc3RhY2tzXzE7IEdyb3dfc3RhY2tzXzI7XG4gICAgICAgICBDb21wdXRlX3NlbWFudGljX2FjdGlvbjsgQ2FsbF9lcnJvcl9mdW5jdGlvbl1cblxuZXh0ZXJuYWwgcGFyc2VfZW5naW5lIDpcbiAgICBwYXJzZV90YWJsZXMgLT4gcGFyc2VyX2VudiAtPiBwYXJzZXJfaW5wdXQgLT4gT2JqLnQgLT4gcGFyc2VyX291dHB1dFxuICAgID0gXCJjYW1sX3BhcnNlX2VuZ2luZVwiXG5cbmV4dGVybmFsIHNldF90cmFjZTogYm9vbCAtPiBib29sXG4gICAgPSBcImNhbWxfc2V0X3BhcnNlcl90cmFjZVwiXG5cbmxldCBlbnYgPVxuICB7IHNfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCAwO1xuICAgIHZfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCAoT2JqLnJlcHIgKCkpO1xuICAgIHN5bWJfc3RhcnRfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCBkdW1teV9wb3M7XG4gICAgc3ltYl9lbmRfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCBkdW1teV9wb3M7XG4gICAgc3RhY2tzaXplID0gMTAwO1xuICAgIHN0YWNrYmFzZSA9IDA7XG4gICAgY3Vycl9jaGFyID0gMDtcbiAgICBsdmFsID0gT2JqLnJlcHIgKCk7XG4gICAgc3ltYl9zdGFydCA9IGR1bW15X3BvcztcbiAgICBzeW1iX2VuZCA9IGR1bW15X3BvcztcbiAgICBhc3AgPSAwO1xuICAgIHJ1bGVfbGVuID0gMDtcbiAgICBydWxlX251bWJlciA9IDA7XG4gICAgc3AgPSAwO1xuICAgIHN0YXRlID0gMDtcbiAgICBlcnJmbGFnID0gMCB9XG5cbmxldCBncm93X3N0YWNrcygpID1cbiAgbGV0IG9sZHNpemUgPSBlbnYuc3RhY2tzaXplIGluXG4gIGxldCBuZXdzaXplID0gb2xkc2l6ZSAqIDIgaW5cbiAgbGV0IG5ld19zID0gQXJyYXkubWFrZSBuZXdzaXplIDBcbiAgYW5kIG5ld192ID0gQXJyYXkubWFrZSBuZXdzaXplIChPYmoucmVwciAoKSlcbiAgYW5kIG5ld19zdGFydCA9IEFycmF5Lm1ha2UgbmV3c2l6ZSBkdW1teV9wb3NcbiAgYW5kIG5ld19lbmQgPSBBcnJheS5tYWtlIG5ld3NpemUgZHVtbXlfcG9zIGluXG4gICAgQXJyYXkuYmxpdCBlbnYuc19zdGFjayAwIG5ld19zIDAgb2xkc2l6ZTtcbiAgICBlbnYuc19zdGFjayA8LSBuZXdfcztcbiAgICBBcnJheS5ibGl0IGVudi52X3N0YWNrIDAgbmV3X3YgMCBvbGRzaXplO1xuICAgIGVudi52X3N0YWNrIDwtIG5ld192O1xuICAgIEFycmF5LmJsaXQgZW52LnN5bWJfc3RhcnRfc3RhY2sgMCBuZXdfc3RhcnQgMCBvbGRzaXplO1xuICAgIGVudi5zeW1iX3N0YXJ0X3N0YWNrIDwtIG5ld19zdGFydDtcbiAgICBBcnJheS5ibGl0IGVudi5zeW1iX2VuZF9zdGFjayAwIG5ld19lbmQgMCBvbGRzaXplO1xuICAgIGVudi5zeW1iX2VuZF9zdGFjayA8LSBuZXdfZW5kO1xuICAgIGVudi5zdGFja3NpemUgPC0gbmV3c2l6ZVxuXG5sZXQgY2xlYXJfcGFyc2VyKCkgPVxuICBBcnJheS5maWxsIGVudi52X3N0YWNrIDAgZW52LnN0YWNrc2l6ZSAoT2JqLnJlcHIgKCkpO1xuICBlbnYubHZhbCA8LSBPYmoucmVwciAoKVxuXG5sZXQgY3VycmVudF9sb29rYWhlYWRfZnVuID0gcmVmIChmdW4gKF8gOiBPYmoudCkgLT4gZmFsc2UpXG5cbmxldCB5eXBhcnNlIHRhYmxlcyBzdGFydCBsZXhlciBsZXhidWYgPVxuICBsZXQgcmVjIGxvb3AgY21kIGFyZyA9XG4gICAgbWF0Y2ggcGFyc2VfZW5naW5lIHRhYmxlcyBlbnYgY21kIGFyZyB3aXRoXG4gICAgICBSZWFkX3Rva2VuIC0+XG4gICAgICAgIGxldCB0ID0gT2JqLnJlcHIobGV4ZXIgbGV4YnVmKSBpblxuICAgICAgICBlbnYuc3ltYl9zdGFydCA8LSBsZXhidWYubGV4X3N0YXJ0X3A7XG4gICAgICAgIGVudi5zeW1iX2VuZCA8LSBsZXhidWYubGV4X2N1cnJfcDtcbiAgICAgICAgbG9vcCBUb2tlbl9yZWFkIHRcbiAgICB8IFJhaXNlX3BhcnNlX2Vycm9yIC0+XG4gICAgICAgIHJhaXNlIFBhcnNlX2Vycm9yXG4gICAgfCBDb21wdXRlX3NlbWFudGljX2FjdGlvbiAtPlxuICAgICAgICBsZXQgKGFjdGlvbiwgdmFsdWUpID1cbiAgICAgICAgICB0cnlcbiAgICAgICAgICAgIChTZW1hbnRpY19hY3Rpb25fY29tcHV0ZWQsIHRhYmxlcy5hY3Rpb25zLihlbnYucnVsZV9udW1iZXIpIGVudilcbiAgICAgICAgICB3aXRoIFBhcnNlX2Vycm9yIC0+XG4gICAgICAgICAgICAoRXJyb3JfZGV0ZWN0ZWQsIE9iai5yZXByICgpKSBpblxuICAgICAgICBsb29wIGFjdGlvbiB2YWx1ZVxuICAgIHwgR3Jvd19zdGFja3NfMSAtPlxuICAgICAgICBncm93X3N0YWNrcygpOyBsb29wIFN0YWNrc19ncm93bl8xIChPYmoucmVwciAoKSlcbiAgICB8IEdyb3dfc3RhY2tzXzIgLT5cbiAgICAgICAgZ3Jvd19zdGFja3MoKTsgbG9vcCBTdGFja3NfZ3Jvd25fMiAoT2JqLnJlcHIgKCkpXG4gICAgfCBDYWxsX2Vycm9yX2Z1bmN0aW9uIC0+XG4gICAgICAgIHRhYmxlcy5lcnJvcl9mdW5jdGlvbiBcInN5bnRheCBlcnJvclwiO1xuICAgICAgICBsb29wIEVycm9yX2RldGVjdGVkIChPYmoucmVwciAoKSkgaW5cbiAgbGV0IGluaXRfYXNwID0gZW52LmFzcFxuICBhbmQgaW5pdF9zcCA9IGVudi5zcFxuICBhbmQgaW5pdF9zdGFja2Jhc2UgPSBlbnYuc3RhY2tiYXNlXG4gIGFuZCBpbml0X3N0YXRlID0gZW52LnN0YXRlXG4gIGFuZCBpbml0X2N1cnJfY2hhciA9IGVudi5jdXJyX2NoYXJcbiAgYW5kIGluaXRfbHZhbCA9IGVudi5sdmFsXG4gIGFuZCBpbml0X2VycmZsYWcgPSBlbnYuZXJyZmxhZyBpblxuICBlbnYuc3RhY2tiYXNlIDwtIGVudi5zcCArIDE7XG4gIGVudi5jdXJyX2NoYXIgPC0gc3RhcnQ7XG4gIGVudi5zeW1iX2VuZCA8LSBsZXhidWYubGV4X2N1cnJfcDtcbiAgdHJ5XG4gICAgbG9vcCBTdGFydCAoT2JqLnJlcHIgKCkpXG4gIHdpdGggZXhuIC0+XG4gICAgbGV0IGN1cnJfY2hhciA9IGVudi5jdXJyX2NoYXIgaW5cbiAgICBlbnYuYXNwIDwtIGluaXRfYXNwO1xuICAgIGVudi5zcCA8LSBpbml0X3NwO1xuICAgIGVudi5zdGFja2Jhc2UgPC0gaW5pdF9zdGFja2Jhc2U7XG4gICAgZW52LnN0YXRlIDwtIGluaXRfc3RhdGU7XG4gICAgZW52LmN1cnJfY2hhciA8LSBpbml0X2N1cnJfY2hhcjtcbiAgICBlbnYubHZhbCA8LSBpbml0X2x2YWw7XG4gICAgZW52LmVycmZsYWcgPC0gaW5pdF9lcnJmbGFnO1xuICAgIG1hdGNoIGV4biB3aXRoXG4gICAgICBZWWV4aXQgdiAtPlxuICAgICAgICBPYmoubWFnaWMgdlxuICAgIHwgXyAtPlxuICAgICAgICBjdXJyZW50X2xvb2thaGVhZF9mdW4gOj1cbiAgICAgICAgICAoZnVuIHRvayAtPlxuICAgICAgICAgICAgaWYgT2JqLmlzX2Jsb2NrIHRva1xuICAgICAgICAgICAgdGhlbiB0YWJsZXMudHJhbnNsX2Jsb2NrLihPYmoudGFnIHRvaykgPSBjdXJyX2NoYXJcbiAgICAgICAgICAgIGVsc2UgdGFibGVzLnRyYW5zbF9jb25zdC4oT2JqLm1hZ2ljIHRvaykgPSBjdXJyX2NoYXIpO1xuICAgICAgICByYWlzZSBleG5cblxubGV0IHBlZWtfdmFsIGVudiBuID1cbiAgT2JqLm1hZ2ljIGVudi52X3N0YWNrLihlbnYuYXNwIC0gbilcblxubGV0IHN5bWJvbF9zdGFydF9wb3MgKCkgPVxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA8PSAwIHRoZW4gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwKVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCBzdCA9IGVudi5zeW1iX3N0YXJ0X3N0YWNrLihlbnYuYXNwIC0gaSArIDEpIGluXG4gICAgICBsZXQgZW4gPSBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3AgLSBpICsgMSkgaW5cbiAgICAgIGlmIHN0IDw+IGVuIHRoZW4gc3QgZWxzZSBsb29wIChpIC0gMSlcbiAgICBlbmRcbiAgaW5cbiAgbG9vcCBlbnYucnVsZV9sZW5cblxubGV0IHN5bWJvbF9lbmRfcG9zICgpID0gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwKVxubGV0IHJoc19zdGFydF9wb3MgbiA9IGVudi5zeW1iX3N0YXJ0X3N0YWNrLihlbnYuYXNwIC0gKGVudi5ydWxlX2xlbiAtIG4pKVxubGV0IHJoc19lbmRfcG9zIG4gPSBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3AgLSAoZW52LnJ1bGVfbGVuIC0gbikpXG5cbmxldCBzeW1ib2xfc3RhcnQgKCkgPSAoc3ltYm9sX3N0YXJ0X3BvcyAoKSkucG9zX2NudW1cbmxldCBzeW1ib2xfZW5kICgpID0gKHN5bWJvbF9lbmRfcG9zICgpKS5wb3NfY251bVxubGV0IHJoc19zdGFydCBuID0gKHJoc19zdGFydF9wb3MgbikucG9zX2NudW1cbmxldCByaHNfZW5kIG4gPSAocmhzX2VuZF9wb3MgbikucG9zX2NudW1cblxubGV0IGlzX2N1cnJlbnRfbG9va2FoZWFkIHRvayA9XG4gICghY3VycmVudF9sb29rYWhlYWRfZnVuKShPYmoucmVwciB0b2spXG5cbmxldCBwYXJzZV9lcnJvciAoXyA6IHN0cmluZykgPSAoKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTZXRzIG92ZXIgb3JkZXJlZCB0eXBlcyAqKVxuXG5tb2R1bGUgdHlwZSBPcmRlcmVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBjb21wYXJlOiB0IC0+IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTID1cbiAgc2lnXG4gICAgdHlwZSBlbHRcbiAgICB0eXBlIHRcbiAgICB2YWwgZW1wdHk6IHRcbiAgICB2YWwgaXNfZW1wdHk6IHQgLT4gYm9vbFxuICAgIHZhbCBtZW06IGVsdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgYWRkOiBlbHQgLT4gdCAtPiB0XG4gICAgdmFsIHNpbmdsZXRvbjogZWx0IC0+IHRcbiAgICB2YWwgcmVtb3ZlOiBlbHQgLT4gdCAtPiB0XG4gICAgdmFsIHVuaW9uOiB0IC0+IHQgLT4gdFxuICAgIHZhbCBpbnRlcjogdCAtPiB0IC0+IHRcbiAgICB2YWwgZGlzam9pbnQ6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIGRpZmY6IHQgLT4gdCAtPiB0XG4gICAgdmFsIGNvbXBhcmU6IHQgLT4gdCAtPiBpbnRcbiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIHN1YnNldDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgaXRlcjogKGVsdCAtPiB1bml0KSAtPiB0IC0+IHVuaXRcbiAgICB2YWwgbWFwOiAoZWx0IC0+IGVsdCkgLT4gdCAtPiB0XG4gICAgdmFsIGZvbGQ6IChlbHQgLT4gJ2EgLT4gJ2EpIC0+IHQgLT4gJ2EgLT4gJ2FcbiAgICB2YWwgZm9yX2FsbDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGJvb2xcbiAgICB2YWwgZXhpc3RzOiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gYm9vbFxuICAgIHZhbCBmaWx0ZXI6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiB0XG4gICAgdmFsIGZpbHRlcl9tYXA6IChlbHQgLT4gZWx0IG9wdGlvbikgLT4gdCAtPiB0XG4gICAgdmFsIHBhcnRpdGlvbjogKGVsdCAtPiBib29sKSAtPiB0IC0+IHQgKiB0XG4gICAgdmFsIGNhcmRpbmFsOiB0IC0+IGludFxuICAgIHZhbCBlbGVtZW50czogdCAtPiBlbHQgbGlzdFxuICAgIHZhbCBtaW5fZWx0OiB0IC0+IGVsdFxuICAgIHZhbCBtaW5fZWx0X29wdDogdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIG1heF9lbHQ6IHQgLT4gZWx0XG4gICAgdmFsIG1heF9lbHRfb3B0OiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgY2hvb3NlOiB0IC0+IGVsdFxuICAgIHZhbCBjaG9vc2Vfb3B0OiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgc3BsaXQ6IGVsdCAtPiB0IC0+IHQgKiBib29sICogdFxuICAgIHZhbCBmaW5kOiBlbHQgLT4gdCAtPiBlbHRcbiAgICB2YWwgZmluZF9vcHQ6IGVsdCAtPiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgZmluZF9maXJzdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdFxuICAgIHZhbCBmaW5kX2ZpcnN0X29wdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgZmluZF9sYXN0OiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gZWx0XG4gICAgdmFsIGZpbmRfbGFzdF9vcHQ6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIG9mX2xpc3Q6IGVsdCBsaXN0IC0+IHRcbiAgICB2YWwgdG9fc2VxX2Zyb20gOiBlbHQgLT4gdCAtPiBlbHQgU2VxLnRcbiAgICB2YWwgdG9fc2VxIDogdCAtPiBlbHQgU2VxLnRcbiAgICB2YWwgdG9fcmV2X3NlcSA6IHQgLT4gZWx0IFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiBlbHQgU2VxLnQgLT4gdCAtPiB0XG4gICAgdmFsIG9mX3NlcSA6IGVsdCBTZXEudCAtPiB0XG4gIGVuZFxuXG5tb2R1bGUgTWFrZShPcmQ6IE9yZGVyZWRUeXBlKSA9XG4gIHN0cnVjdFxuICAgIHR5cGUgZWx0ID0gT3JkLnRcbiAgICB0eXBlIHQgPSBFbXB0eSB8IE5vZGUgb2Yge2w6dDsgdjplbHQ7IHI6dDsgaDppbnR9XG5cbiAgICAoKiBTZXRzIGFyZSByZXByZXNlbnRlZCBieSBiYWxhbmNlZCBiaW5hcnkgdHJlZXMgKHRoZSBoZWlnaHRzIG9mIHRoZVxuICAgICAgIGNoaWxkcmVuIGRpZmZlciBieSBhdCBtb3N0IDIgKilcblxuICAgIGxldCBoZWlnaHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAwXG4gICAgICB8IE5vZGUge2h9IC0+IGhcblxuICAgICgqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGxlZnQgc29uIGwsIHZhbHVlIHYgYW5kIHJpZ2h0IHNvbiByLlxuICAgICAgIFdlIG11c3QgaGF2ZSBhbGwgZWxlbWVudHMgb2YgbCA8IHYgPCBhbGwgZWxlbWVudHMgb2Ygci5cbiAgICAgICBsIGFuZCByIG11c3QgYmUgYmFsYW5jZWQgYW5kIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDIuXG4gICAgICAgSW5saW5lIGV4cGFuc2lvbiBvZiBoZWlnaHQgZm9yIGJldHRlciBzcGVlZC4gKilcblxuICAgIGxldCBjcmVhdGUgbCB2IHIgPVxuICAgICAgbGV0IGhsID0gbWF0Y2ggbCB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBsZXQgaHIgPSBtYXRjaCByIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIE5vZGV7bDsgdjsgcjsgaD0oaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpfVxuXG4gICAgKCogU2FtZSBhcyBjcmVhdGUsIGJ1dCBwZXJmb3JtcyBvbmUgc3RlcCBvZiByZWJhbGFuY2luZyBpZiBuZWNlc3NhcnkuXG4gICAgICAgQXNzdW1lcyBsIGFuZCByIGJhbGFuY2VkIGFuZCB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAzLlxuICAgICAgIElubGluZSBleHBhbnNpb24gb2YgY3JlYXRlIGZvciBiZXR0ZXIgc3BlZWQgaW4gdGhlIG1vc3QgZnJlcXVlbnQgY2FzZVxuICAgICAgIHdoZXJlIG5vIHJlYmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqKVxuXG4gICAgbGV0IGJhbCBsIHYgciA9XG4gICAgICBsZXQgaGwgPSBtYXRjaCBsIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgaWYgaGwgPiBociArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1sbDsgdj1sdjsgcj1scn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCBsbCA+PSBoZWlnaHQgbHIgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgbGwgbHYgKGNyZWF0ZSBsciB2IHIpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1scmw7IHY9bHJ2OyByPWxycn0tPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbGwgbHYgbHJsKSBscnYgKGNyZWF0ZSBscnIgdiByKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZSBpZiBociA+IGhsICsgMiB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgIHwgTm9kZXtsPXJsOyB2PXJ2OyByPXJyfSAtPlxuICAgICAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybCB0aGVuXG4gICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgdiBybCkgcnYgcnJcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPXJsbDsgdj1ybHY7IHI9cmxyfSAtPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB2IHJsbCkgcmx2IChjcmVhdGUgcmxyIHJ2IHJyKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZVxuICAgICAgICBOb2Rle2w7IHY7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgICgqIEluc2VydGlvbiBvZiBvbmUgZWxlbWVudCAqKVxuXG4gICAgbGV0IHJlYyBhZGQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vZGV7bD1FbXB0eTsgdj14OyByPUVtcHR5OyBoPTF9XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gYXMgdCAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiB0IGVsc2VcbiAgICAgICAgICBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgbGwgPSBhZGQgeCBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gdCBlbHNlIGJhbCBsbCB2IHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSBhZGQgeCByIGluXG4gICAgICAgICAgICBpZiByID09IHJyIHRoZW4gdCBlbHNlIGJhbCBsIHYgcnJcblxuICAgIGxldCBzaW5nbGV0b24geCA9IE5vZGV7bD1FbXB0eTsgdj14OyByPUVtcHR5OyBoPTF9XG5cbiAgICAoKiBCZXdhcmU6IHRob3NlIHR3byBmdW5jdGlvbnMgYXNzdW1lIHRoYXQgdGhlIGFkZGVkIHYgaXMgKnN0cmljdGx5KlxuICAgICAgIHNtYWxsZXIgKG9yIGJpZ2dlcikgdGhhbiBhbGwgdGhlIHByZXNlbnQgZWxlbWVudHMgaW4gdGhlIHRyZWU7IGl0XG4gICAgICAgZG9lcyBub3QgdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgY3VycmVudCBtaW4gKG9yIG1heCkgZWxlbWVudC5cbiAgICAgICBJbmRlZWQsIHRoZXkgYXJlIG9ubHkgdXNlZCBkdXJpbmcgdGhlIFwiam9pblwiIG9wZXJhdGlvbiB3aGljaFxuICAgICAgIHJlc3BlY3RzIHRoaXMgcHJlY29uZGl0aW9uLlxuICAgICopXG5cbiAgICBsZXQgcmVjIGFkZF9taW5fZWxlbWVudCB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgcn0gLT5cbiAgICAgICAgYmFsIChhZGRfbWluX2VsZW1lbnQgeCBsKSB2IHJcblxuICAgIGxldCByZWMgYWRkX21heF9lbGVtZW50IHggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBzaW5nbGV0b24geFxuICAgICAgfCBOb2RlIHtsOyB2OyByfSAtPlxuICAgICAgICBiYWwgbCB2IChhZGRfbWF4X2VsZW1lbnQgeCByKVxuXG4gICAgKCogU2FtZSBhcyBjcmVhdGUgYW5kIGJhbCwgYnV0IG5vIGFzc3VtcHRpb25zIGFyZSBtYWRlIG9uIHRoZVxuICAgICAgIHJlbGF0aXZlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCByZWMgam9pbiBsIHYgciA9XG4gICAgICBtYXRjaCAobCwgcikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIC0+IGFkZF9taW5fZWxlbWVudCB2IHJcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBhZGRfbWF4X2VsZW1lbnQgdiBsXG4gICAgICB8IChOb2Rle2w9bGw7IHY9bHY7IHI9bHI7IGg9bGh9LCBOb2Rle2w9cmw7IHY9cnY7IHI9cnI7IGg9cmh9KSAtPlxuICAgICAgICAgIGlmIGxoID4gcmggKyAyIHRoZW4gYmFsIGxsIGx2IChqb2luIGxyIHYgcikgZWxzZVxuICAgICAgICAgIGlmIHJoID4gbGggKyAyIHRoZW4gYmFsIChqb2luIGwgdiBybCkgcnYgcnIgZWxzZVxuICAgICAgICAgIGNyZWF0ZSBsIHYgclxuXG4gICAgKCogU21hbGxlc3QgYW5kIGdyZWF0ZXN0IGVsZW1lbnQgb2YgYSBzZXQgKilcblxuICAgIGxldCByZWMgbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w9RW1wdHk7IHZ9IC0+IHZcbiAgICAgIHwgTm9kZXtsfSAtPiBtaW5fZWx0IGxcblxuICAgIGxldCByZWMgbWluX2VsdF9vcHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGV7bD1FbXB0eTsgdn0gLT4gU29tZSB2XG4gICAgICB8IE5vZGV7bH0gLT4gbWluX2VsdF9vcHQgbFxuXG4gICAgbGV0IHJlYyBtYXhfZWx0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7djsgcj1FbXB0eX0gLT4gdlxuICAgICAgfCBOb2Rle3J9IC0+IG1heF9lbHQgclxuXG4gICAgbGV0IHJlYyBtYXhfZWx0X29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZXt2OyByPUVtcHR5fSAtPiBTb21lIHZcbiAgICAgIHwgTm9kZXtyfSAtPiBtYXhfZWx0X29wdCByXG5cbiAgICAoKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNldCAqKVxuXG4gICAgbGV0IHJlYyByZW1vdmVfbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LnJlbW92ZV9taW5fZWx0XCJcbiAgICAgIHwgTm9kZXtsPUVtcHR5OyByfSAtPiByXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gYmFsIChyZW1vdmVfbWluX2VsdCBsKSB2IHJcblxuICAgICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLlxuICAgICAgIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgICBBc3N1bWUgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi4gKilcblxuICAgIGxldCBtZXJnZSB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+IGJhbCB0MSAobWluX2VsdCB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuXG4gICAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuXG4gICAgICAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICAgIE5vIGFzc3VtcHRpb24gb24gdGhlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCBjb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPiBqb2luIHQxIChtaW5fZWx0IHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpXG5cbiAgICAoKiBTcGxpdHRpbmcuICBzcGxpdCB4IHMgcmV0dXJucyBhIHRyaXBsZSAobCwgcHJlc2VudCwgcikgd2hlcmVcbiAgICAgICAgLSBsIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgb2YgcyB0aGF0IGFyZSA8IHhcbiAgICAgICAgLSByIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgb2YgcyB0aGF0IGFyZSA+IHhcbiAgICAgICAgLSBwcmVzZW50IGlzIGZhbHNlIGlmIHMgY29udGFpbnMgbm8gZWxlbWVudCBlcXVhbCB0byB4LFxuICAgICAgICAgIG9yIHRydWUgaWYgcyBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIHguICopXG5cbiAgICBsZXQgcmVjIHNwbGl0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIChFbXB0eSwgZmFsc2UsIEVtcHR5KVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIChsLCB0cnVlLCByKVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IChsbCwgcHJlcywgcmwpID0gc3BsaXQgeCBsIGluIChsbCwgcHJlcywgam9pbiBybCB2IHIpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IChsciwgcHJlcywgcnIpID0gc3BsaXQgeCByIGluIChqb2luIGwgdiBsciwgcHJlcywgcnIpXG5cbiAgICAoKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0IG9wZXJhdGlvbnMgKilcblxuICAgIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvbiBFbXB0eSAtPiB0cnVlIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlYyBtZW0geCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGMgPSAwIHx8IG1lbSB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyByZW1vdmUgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IChOb2Rle2w7IHY7IHJ9IGFzIHQpIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIG1lcmdlIGwgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgICAgbGV0IGxsID0gcmVtb3ZlIHggbCBpblxuICAgICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gdFxuICAgICAgICAgICAgICBlbHNlIGJhbCBsbCB2IHJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IHJyID0gcmVtb3ZlIHggciBpblxuICAgICAgICAgICAgICBpZiByID09IHJyIHRoZW4gdFxuICAgICAgICAgICAgICBlbHNlIGJhbCBsIHYgcnJcblxuICAgIGxldCByZWMgdW5pb24gczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIHQyKSAtPiB0MlxuICAgICAgfCAodDEsIEVtcHR5KSAtPiB0MVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxOyBoPWgxfSwgTm9kZXtsPWwyOyB2PXYyOyByPXIyOyBoPWgyfSkgLT5cbiAgICAgICAgICBpZiBoMSA+PSBoMiB0aGVuXG4gICAgICAgICAgICBpZiBoMiA9IDEgdGhlbiBhZGQgdjIgczEgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBsZXQgKGwyLCBfLCByMikgPSBzcGxpdCB2MSBzMiBpblxuICAgICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikgdjEgKHVuaW9uIHIxIHIyKVxuICAgICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgaDEgPSAxIHRoZW4gYWRkIHYxIHMyIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbGV0IChsMSwgXywgcjEpID0gc3BsaXQgdjIgczEgaW5cbiAgICAgICAgICAgICAgam9pbiAodW5pb24gbDEgbDIpIHYyICh1bmlvbiByMSByMilcbiAgICAgICAgICAgIGVuZFxuXG4gICAgbGV0IHJlYyBpbnRlciBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gRW1wdHlcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBFbXB0eVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxfSwgdDIpIC0+XG4gICAgICAgICAgbWF0Y2ggc3BsaXQgdjEgdDIgd2l0aFxuICAgICAgICAgICAgKGwyLCBmYWxzZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGNvbmNhdCAoaW50ZXIgbDEgbDIpIChpbnRlciByMSByMilcbiAgICAgICAgICB8IChsMiwgdHJ1ZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGpvaW4gKGludGVyIGwxIGwyKSB2MSAoaW50ZXIgcjEgcjIpXG5cbiAgICAoKiBTYW1lIGFzIHNwbGl0LCBidXQgY29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZXNcbiAgICAgICBvbmx5IGlmIHRoZSBwaXZvdCBlbGVtZW50IGlzIG5vdCBpbiB0aGUgc2V0LiAgVGhlIHJpZ2h0IHN1YnRyZWVcbiAgICAgICBpcyBjb21wdXRlZCBvbiBkZW1hbmQuICopXG5cbiAgICB0eXBlIHNwbGl0X2JpcyA9XG4gICAgICB8IEZvdW5kXG4gICAgICB8IE5vdEZvdW5kIG9mIHQgKiAodW5pdCAtPiB0KVxuXG4gICAgbGV0IHJlYyBzcGxpdF9iaXMgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm90Rm91bmQgKEVtcHR5LCAoZnVuICgpIC0+IEVtcHR5KSlcbiAgICAgIHwgTm9kZXtsOyB2OyByOyBffSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBGb3VuZFxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbWF0Y2ggc3BsaXRfYmlzIHggbCB3aXRoXG4gICAgICAgICAgICB8IEZvdW5kIC0+IEZvdW5kXG4gICAgICAgICAgICB8IE5vdEZvdW5kIChsbCwgcmwpIC0+IE5vdEZvdW5kIChsbCwgKGZ1biAoKSAtPiBqb2luIChybCAoKSkgdiByKSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXRjaCBzcGxpdF9iaXMgeCByIHdpdGhcbiAgICAgICAgICAgIHwgRm91bmQgLT4gRm91bmRcbiAgICAgICAgICAgIHwgTm90Rm91bmQgKGxyLCBycikgLT4gTm90Rm91bmQgKGpvaW4gbCB2IGxyLCBycilcblxuICAgIGxldCByZWMgZGlzam9pbnQgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIHwgKF8sIEVtcHR5KSAtPiB0cnVlXG4gICAgICB8IChOb2Rle2w9bDE7IHY9djE7IHI9cjF9LCB0MikgLT5cbiAgICAgICAgICBpZiBzMSA9PSBzMiB0aGVuIGZhbHNlXG4gICAgICAgICAgZWxzZSBtYXRjaCBzcGxpdF9iaXMgdjEgdDIgd2l0aFxuICAgICAgICAgICAgICBOb3RGb3VuZChsMiwgcjIpIC0+IGRpc2pvaW50IGwxIGwyICYmIGRpc2pvaW50IHIxIChyMiAoKSlcbiAgICAgICAgICAgIHwgRm91bmQgLT4gZmFsc2VcblxuICAgIGxldCByZWMgZGlmZiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gRW1wdHlcbiAgICAgIHwgKHQxLCBFbXB0eSkgLT4gdDFcbiAgICAgIHwgKE5vZGV7bD1sMTsgdj12MTsgcj1yMX0sIHQyKSAtPlxuICAgICAgICAgIG1hdGNoIHNwbGl0IHYxIHQyIHdpdGhcbiAgICAgICAgICAgIChsMiwgZmFsc2UsIHIyKSAtPlxuICAgICAgICAgICAgICBqb2luIChkaWZmIGwxIGwyKSB2MSAoZGlmZiByMSByMilcbiAgICAgICAgICB8IChsMiwgdHJ1ZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGNvbmNhdCAoZGlmZiBsMSBsMikgKGRpZmYgcjEgcjIpXG5cbiAgICB0eXBlIGVudW1lcmF0aW9uID0gRW5kIHwgTW9yZSBvZiBlbHQgKiB0ICogZW51bWVyYXRpb25cblxuICAgIGxldCByZWMgY29uc19lbnVtIHMgZSA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGNvbnNfZW51bSBsIChNb3JlKHYsIHIsIGUpKVxuXG4gICAgbGV0IHJlYyBjb21wYXJlX2F1eCBlMSBlMiA9XG4gICAgICAgIG1hdGNoIChlMSwgZTIpIHdpdGhcbiAgICAgICAgKEVuZCwgRW5kKSAtPiAwXG4gICAgICB8IChFbmQsIF8pICAtPiAtMVxuICAgICAgfCAoXywgRW5kKSAtPiAxXG4gICAgICB8IChNb3JlKHYxLCByMSwgZTEpLCBNb3JlKHYyLCByMiwgZTIpKSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgdjEgdjIgaW5cbiAgICAgICAgICBpZiBjIDw+IDBcbiAgICAgICAgICB0aGVuIGNcbiAgICAgICAgICBlbHNlIGNvbXBhcmVfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG5cbiAgICBsZXQgY29tcGFyZSBzMSBzMiA9XG4gICAgICBjb21wYXJlX2F1eCAoY29uc19lbnVtIHMxIEVuZCkgKGNvbnNfZW51bSBzMiBFbmQpXG5cbiAgICBsZXQgZXF1YWwgczEgczIgPVxuICAgICAgY29tcGFyZSBzMSBzMiA9IDBcblxuICAgIGxldCByZWMgc3Vic2V0IHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgRW1wdHksIF8gLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IF8sIEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgTm9kZSB7bD1sMTsgdj12MTsgcj1yMX0sIChOb2RlIHtsPWwyOyB2PXYyOyByPXIyfSBhcyB0MikgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHYxIHYyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlblxuICAgICAgICAgICAgc3Vic2V0IGwxIGwyICYmIHN1YnNldCByMSByMlxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgc3Vic2V0IChOb2RlIHtsPWwxOyB2PXYxOyByPUVtcHR5OyBoPTB9KSBsMiAmJiBzdWJzZXQgcjEgdDJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBzdWJzZXQgKE5vZGUge2w9RW1wdHk7IHY9djE7IHI9cjE7IGg9MH0pIHIyICYmIHN1YnNldCBsMSB0MlxuXG4gICAgbGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAoKVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGl0ZXIgZiBsOyBmIHY7IGl0ZXIgZiByXG5cbiAgICBsZXQgcmVjIGZvbGQgZiBzIGFjY3UgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBmb2xkIGYgciAoZiB2IChmb2xkIGYgbCBhY2N1KSlcblxuICAgIGxldCByZWMgZm9yX2FsbCBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IHAgdiAmJiBmb3JfYWxsIHAgbCAmJiBmb3JfYWxsIHAgclxuXG4gICAgbGV0IHJlYyBleGlzdHMgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gcCB2IHx8IGV4aXN0cyBwIGwgfHwgZXhpc3RzIHAgclxuXG4gICAgbGV0IHJlYyBmaWx0ZXIgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IChOb2Rle2w7IHY7IHJ9KSBhcyB0IC0+XG4gICAgICAgICAgKCogY2FsbCBbcF0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgbCcgPSBmaWx0ZXIgcCBsIGluXG4gICAgICAgICAgbGV0IHB2ID0gcCB2IGluXG4gICAgICAgICAgbGV0IHInID0gZmlsdGVyIHAgciBpblxuICAgICAgICAgIGlmIHB2IHRoZW5cbiAgICAgICAgICAgIGlmIGw9PWwnICYmIHI9PXInIHRoZW4gdCBlbHNlIGpvaW4gbCcgdiByJ1xuICAgICAgICAgIGVsc2UgY29uY2F0IGwnIHInXG5cbiAgICBsZXQgcmVjIHBhcnRpdGlvbiBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKEVtcHR5LCBFbXB0eSlcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgICgqIGNhbGwgW3BdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IChsdCwgbGYpID0gcGFydGl0aW9uIHAgbCBpblxuICAgICAgICAgIGxldCBwdiA9IHAgdiBpblxuICAgICAgICAgIGxldCAocnQsIHJmKSA9IHBhcnRpdGlvbiBwIHIgaW5cbiAgICAgICAgICBpZiBwdlxuICAgICAgICAgIHRoZW4gKGpvaW4gbHQgdiBydCwgY29uY2F0IGxmIHJmKVxuICAgICAgICAgIGVsc2UgKGNvbmNhdCBsdCBydCwgam9pbiBsZiB2IHJmKVxuXG4gICAgbGV0IHJlYyBjYXJkaW5hbCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZXtsOyByfSAtPiBjYXJkaW5hbCBsICsgMSArIGNhcmRpbmFsIHJcblxuICAgIGxldCByZWMgZWxlbWVudHNfYXV4IGFjY3UgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gZWxlbWVudHNfYXV4ICh2IDo6IGVsZW1lbnRzX2F1eCBhY2N1IHIpIGxcblxuICAgIGxldCBlbGVtZW50cyBzID1cbiAgICAgIGVsZW1lbnRzX2F1eCBbXSBzXG5cbiAgICBsZXQgY2hvb3NlID0gbWluX2VsdFxuXG4gICAgbGV0IGNob29zZV9vcHQgPSBtaW5fZWx0X29wdFxuXG4gICAgbGV0IHJlYyBmaW5kIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiB2XG4gICAgICAgICAgZWxzZSBmaW5kIHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3RfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdiBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2MCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3QgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYwIGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHQgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9hdXggdjAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2MCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3QgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIFNvbWUgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHQgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfb3B0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gU29tZSB2XG4gICAgICAgICAgZWxzZSBmaW5kX29wdCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHRyeV9qb2luIGwgdiByID1cbiAgICAgICgqIFtqb2luIGwgdiByXSBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiAoZWxlbWVudHMgb2YgbCA8IHYgPFxuICAgICAgICAgZWxlbWVudHMgb2Ygcik7IHVzZSBbdHJ5X2pvaW4gbCB2IHJdIHdoZW4gdGhpcyBwcm9wZXJ0eSBtYXlcbiAgICAgICAgIG5vdCBob2xkLCBidXQgeW91IGhvcGUgaXQgZG9lcyBob2xkIGluIHRoZSBjb21tb24gY2FzZSAqKVxuICAgICAgaWYgKGwgPSBFbXB0eSB8fCBPcmQuY29tcGFyZSAobWF4X2VsdCBsKSB2IDwgMClcbiAgICAgICYmIChyID0gRW1wdHkgfHwgT3JkLmNvbXBhcmUgdiAobWluX2VsdCByKSA8IDApXG4gICAgICB0aGVuIGpvaW4gbCB2IHJcbiAgICAgIGVsc2UgdW5pb24gbCAoYWRkIHYgcilcblxuICAgIGxldCByZWMgbWFwIGYgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IGFzIHQgLT5cbiAgICAgICAgICgqIGVuZm9yY2UgbGVmdC10by1yaWdodCBldmFsdWF0aW9uIG9yZGVyICopXG4gICAgICAgICBsZXQgbCcgPSBtYXAgZiBsIGluXG4gICAgICAgICBsZXQgdicgPSBmIHYgaW5cbiAgICAgICAgIGxldCByJyA9IG1hcCBmIHIgaW5cbiAgICAgICAgIGlmIGwgPT0gbCcgJiYgdiA9PSB2JyAmJiByID09IHInIHRoZW4gdFxuICAgICAgICAgZWxzZSB0cnlfam9pbiBsJyB2JyByJ1xuXG4gICAgbGV0IHRyeV9jb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPiB0cnlfam9pbiB0MSAobWluX2VsdCB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuXG4gICAgbGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IGFzIHQgLT5cbiAgICAgICAgICgqIGVuZm9yY2UgbGVmdC10by1yaWdodCBldmFsdWF0aW9uIG9yZGVyICopXG4gICAgICAgICBsZXQgbCcgPSBmaWx0ZXJfbWFwIGYgbCBpblxuICAgICAgICAgbGV0IHYnID0gZiB2IGluXG4gICAgICAgICBsZXQgcicgPSBmaWx0ZXJfbWFwIGYgciBpblxuICAgICAgICAgYmVnaW4gbWF0Y2ggdicgd2l0aFxuICAgICAgICAgICB8IFNvbWUgdicgLT5cbiAgICAgICAgICAgICAgaWYgbCA9PSBsJyAmJiB2ID09IHYnICYmIHIgPT0gcicgdGhlbiB0XG4gICAgICAgICAgICAgIGVsc2UgdHJ5X2pvaW4gbCcgdicgcidcbiAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgIHRyeV9jb25jYXQgbCcgcidcbiAgICAgICAgIGVuZFxuXG4gICAgbGV0IG9mX3NvcnRlZF9saXN0IGwgPVxuICAgICAgbGV0IHJlYyBzdWIgbiBsID1cbiAgICAgICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgICAgIHwgMCwgbCAtPiBFbXB0eSwgbFxuICAgICAgICB8IDEsIHgwIDo6IGwgLT4gTm9kZSB7bD1FbXB0eTsgdj14MDsgcj1FbXB0eTsgaD0xfSwgbFxuICAgICAgICB8IDIsIHgwIDo6IHgxIDo6IGwgLT5cbiAgICAgICAgICAgIE5vZGV7bD1Ob2Rle2w9RW1wdHk7IHY9eDA7IHI9RW1wdHk7IGg9MX07IHY9eDE7IHI9RW1wdHk7IGg9Mn0sIGxcbiAgICAgICAgfCAzLCB4MCA6OiB4MSA6OiB4MiA6OiBsIC0+XG4gICAgICAgICAgICBOb2Rle2w9Tm9kZXtsPUVtcHR5OyB2PXgwOyByPUVtcHR5OyBoPTF9OyB2PXgxO1xuICAgICAgICAgICAgICAgICByPU5vZGV7bD1FbXB0eTsgdj14Mjsgcj1FbXB0eTsgaD0xfTsgaD0yfSwgbFxuICAgICAgICB8IG4sIGwgLT5cbiAgICAgICAgICBsZXQgbmwgPSBuIC8gMiBpblxuICAgICAgICAgIGxldCBsZWZ0LCBsID0gc3ViIG5sIGwgaW5cbiAgICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgbWlkIDo6IGwgLT5cbiAgICAgICAgICAgIGxldCByaWdodCwgbCA9IHN1YiAobiAtIG5sIC0gMSkgbCBpblxuICAgICAgICAgICAgY3JlYXRlIGxlZnQgbWlkIHJpZ2h0LCBsXG4gICAgICBpblxuICAgICAgZnN0IChzdWIgKExpc3QubGVuZ3RoIGwpIGwpXG5cbiAgICBsZXQgb2ZfbGlzdCBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiBlbXB0eVxuICAgICAgfCBbeDBdIC0+IHNpbmdsZXRvbiB4MFxuICAgICAgfCBbeDA7IHgxXSAtPiBhZGQgeDEgKHNpbmdsZXRvbiB4MClcbiAgICAgIHwgW3gwOyB4MTsgeDJdIC0+IGFkZCB4MiAoYWRkIHgxIChzaW5nbGV0b24geDApKVxuICAgICAgfCBbeDA7IHgxOyB4MjsgeDNdIC0+IGFkZCB4MyAoYWRkIHgyIChhZGQgeDEgKHNpbmdsZXRvbiB4MCkpKVxuICAgICAgfCBbeDA7IHgxOyB4MjsgeDM7IHg0XSAtPiBhZGQgeDQgKGFkZCB4MyAoYWRkIHgyIChhZGQgeDEgKHNpbmdsZXRvbiB4MCkpKSlcbiAgICAgIHwgXyAtPiBvZl9zb3J0ZWRfbGlzdCAoTGlzdC5zb3J0X3VuaXEgT3JkLmNvbXBhcmUgbClcblxuICAgIGxldCBhZGRfc2VxIGkgbSA9XG4gICAgICBTZXEuZm9sZF9sZWZ0IChmdW4gcyB4IC0+IGFkZCB4IHMpIG0gaVxuXG4gICAgbGV0IG9mX3NlcSBpID0gYWRkX3NlcSBpIGVtcHR5XG5cbiAgICBsZXQgcmVjIHNlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKHgsIHQsIHJlc3QpIC0+IFNlcS5Db25zICh4LCBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3NlcSBjID0gc2VxX29mX2VudW1fIChjb25zX2VudW0gYyBFbmQpXG5cbiAgICBsZXQgcmVjIHNub2NfZW51bSBzIGUgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBzbm9jX2VudW0gciAoTW9yZSh2LCBsLCBlKSlcblxuICAgIGxldCByZWMgcmV2X3NlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKHgsIHQsIHJlc3QpIC0+IFNlcS5Db25zICh4LCByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gdCByZXN0KSlcblxuICAgIGxldCB0b19yZXZfc2VxIGMgPSByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gYyBFbmQpXG5cbiAgICBsZXQgdG9fc2VxX2Zyb20gbG93IHMgPVxuICAgICAgbGV0IHJlYyBhdXggbG93IHMgYyA9IG1hdGNoIHMgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGNcbiAgICAgICAgfCBOb2RlIHtsOyByOyB2OyBffSAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggT3JkLmNvbXBhcmUgdiBsb3cgd2l0aFxuICAgICAgICAgICAgICB8IDAgLT4gTW9yZSAodiwgciwgYylcbiAgICAgICAgICAgICAgfCBuIHdoZW4gbjwwIC0+IGF1eCBsb3cgciBjXG4gICAgICAgICAgICAgIHwgXyAtPiBhdXggbG93IGwgKE1vcmUgKHYsIHIsIGMpKVxuICAgICAgICAgICAgZW5kXG4gICAgICBpblxuICAgICAgc2VxX29mX2VudW1fIChhdXggbG93IHMgRW5kKVxuICBlbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubW9kdWxlIHR5cGUgT3JkZXJlZFR5cGUgPVxuICBzaWdcbiAgICB0eXBlIHRcbiAgICB2YWwgY29tcGFyZTogdCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhKydhIHRcbiAgICB2YWwgZW1wdHk6ICdhIHRcbiAgICB2YWwgaXNfZW1wdHk6ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBtZW06ICBrZXkgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGFkZDoga2V5IC0+ICdhIC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCB1cGRhdGU6IGtleSAtPiAoJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIHNpbmdsZXRvbjoga2V5IC0+ICdhIC0+ICdhIHRcbiAgICB2YWwgcmVtb3ZlOiBrZXkgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIG1lcmdlOlxuICAgICAgICAgIChrZXkgLT4gJ2Egb3B0aW9uIC0+ICdiIG9wdGlvbiAtPiAnYyBvcHRpb24pIC0+ICdhIHQgLT4gJ2IgdCAtPiAnYyB0XG4gICAgdmFsIHVuaW9uOiAoa2V5IC0+ICdhIC0+ICdhIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgY29tcGFyZTogKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludFxuICAgIHZhbCBlcXVhbDogKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGl0ZXI6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZvbGQ6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgZm9yX2FsbDogKGtleSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgZXhpc3RzOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBmaWx0ZXI6IChrZXkgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGZpbHRlcl9tYXA6IChrZXkgLT4gJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYSB0IC0+ICdiIHRcbiAgICB2YWwgcGFydGl0aW9uOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAqICdhIHRcbiAgICB2YWwgY2FyZGluYWw6ICdhIHQgLT4gaW50XG4gICAgdmFsIGJpbmRpbmdzOiAnYSB0IC0+IChrZXkgKiAnYSkgbGlzdFxuICAgIHZhbCBtaW5fYmluZGluZzogJ2EgdCAtPiAoa2V5ICogJ2EpXG4gICAgdmFsIG1pbl9iaW5kaW5nX29wdDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBtYXhfYmluZGluZzogJ2EgdCAtPiAoa2V5ICogJ2EpXG4gICAgdmFsIG1heF9iaW5kaW5nX29wdDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBjaG9vc2U6ICdhIHQgLT4gKGtleSAqICdhKVxuICAgIHZhbCBjaG9vc2Vfb3B0OiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIHNwbGl0OiBrZXkgLT4gJ2EgdCAtPiAnYSB0ICogJ2Egb3B0aW9uICogJ2EgdFxuICAgIHZhbCBmaW5kOiBrZXkgLT4gJ2EgdCAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDoga2V5IC0+ICdhIHQgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfZmlyc3Q6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiBrZXkgKiAnYVxuICAgIHZhbCBmaW5kX2ZpcnN0X29wdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIGZpbmRfbGFzdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IGtleSAqICdhXG4gICAgdmFsIGZpbmRfbGFzdF9vcHQ6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBtYXA6ICgnYSAtPiAnYikgLT4gJ2EgdCAtPiAnYiB0XG4gICAgdmFsIG1hcGk6IChrZXkgLT4gJ2EgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgdFxuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fcmV2X3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19zZXFfZnJvbSA6IGtleSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2UoT3JkOiBPcmRlcmVkVHlwZSkgPSBzdHJ1Y3RcblxuICAgIHR5cGUga2V5ID0gT3JkLnRcblxuICAgIHR5cGUgJ2EgdCA9XG4gICAgICAgIEVtcHR5XG4gICAgICB8IE5vZGUgb2Yge2w6J2EgdDsgdjprZXk7IGQ6J2E7IHI6J2EgdDsgaDppbnR9XG5cbiAgICBsZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gMFxuICAgICAgfCBOb2RlIHtofSAtPiBoXG5cbiAgICBsZXQgY3JlYXRlIGwgeCBkIHIgPVxuICAgICAgbGV0IGhsID0gaGVpZ2h0IGwgYW5kIGhyID0gaGVpZ2h0IHIgaW5cbiAgICAgIE5vZGV7bDsgdj14OyBkOyByOyBoPShpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSl9XG5cbiAgICBsZXQgc2luZ2xldG9uIHggZCA9IE5vZGV7bD1FbXB0eTsgdj14OyBkOyByPUVtcHR5OyBoPTF9XG5cbiAgICBsZXQgYmFsIGwgeCBkIHIgPVxuICAgICAgbGV0IGhsID0gbWF0Y2ggbCB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBsZXQgaHIgPSBtYXRjaCByIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGlmIGhsID4gaHIgKyAyIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgfCBOb2Rle2w9bGw7IHY9bHY7IGQ9bGQ7IHI9bHJ9IC0+XG4gICAgICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVpZ2h0IGxyIHRoZW5cbiAgICAgICAgICAgICAgY3JlYXRlIGxsIGx2IGxkIChjcmVhdGUgbHIgeCBkIHIpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1scmw7IHY9bHJ2OyBkPWxyZDsgcj1scnJ9LT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxkIGxybCkgbHJ2IGxyZCAoY3JlYXRlIGxyciB4IGQgcilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2UgaWYgaHIgPiBobCArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCByIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1ybDsgdj1ydjsgZD1yZDsgcj1ycn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCByciA+PSBoZWlnaHQgcmwgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHggZCBybCkgcnYgcmQgcnJcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPXJsbDsgdj1ybHY7IGQ9cmxkOyByPXJscn0gLT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgeCBkIHJsbCkgcmx2IHJsZCAoY3JlYXRlIHJsciBydiByZCBycilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2VcbiAgICAgICAgTm9kZXtsOyB2PXg7IGQ7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvbiBFbXB0eSAtPiB0cnVlIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlYyBhZGQgeCBkYXRhID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb2Rle2w9RW1wdHk7IHY9eDsgZD1kYXRhOyByPUVtcHR5OyBoPTF9XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IGFzIG0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGlmIGQgPT0gZGF0YSB0aGVuIG0gZWxzZSBOb2Rle2w7IHY9eDsgZD1kYXRhOyByOyBofVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gYWRkIHggZGF0YSBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gbSBlbHNlIGJhbCBsbCB2IGQgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IGFkZCB4IGRhdGEgciBpblxuICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIG0gZWxzZSBiYWwgbCB2IGQgcnJcblxuICAgIGxldCByZWMgZmluZCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gZFxuICAgICAgICAgIGVsc2UgZmluZCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGQgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdjAgZDAgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3QgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYgZCBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdF9hdXggdjAgZDAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgU29tZSAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBkMCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9vcHQgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3RfYXV4IHYwIGQwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBkIGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdjAgZDAgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2IGQgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBkMCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX29wdCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIFNvbWUgZFxuICAgICAgICAgIGVsc2UgZmluZF9vcHQgeCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IE5vZGUge2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBjID0gMCB8fCBtZW0geCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgbWluX2JpbmRpbmcgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bD1FbXB0eTsgdjsgZH0gLT4gKHYsIGQpXG4gICAgICB8IE5vZGUge2x9IC0+IG1pbl9iaW5kaW5nIGxcblxuICAgIGxldCByZWMgbWluX2JpbmRpbmdfb3B0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2RlIHtsPUVtcHR5OyB2OyBkfSAtPiBTb21lICh2LCBkKVxuICAgICAgfCBOb2RlIHtsfS0+IG1pbl9iaW5kaW5nX29wdCBsXG5cbiAgICBsZXQgcmVjIG1heF9iaW5kaW5nID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge3Y7IGQ7IHI9RW1wdHl9IC0+ICh2LCBkKVxuICAgICAgfCBOb2RlIHtyfSAtPiBtYXhfYmluZGluZyByXG5cbiAgICBsZXQgcmVjIG1heF9iaW5kaW5nX29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZSB7djsgZDsgcj1FbXB0eX0gLT4gU29tZSAodiwgZClcbiAgICAgIHwgTm9kZSB7cn0gLT4gbWF4X2JpbmRpbmdfb3B0IHJcblxuICAgIGxldCByZWMgcmVtb3ZlX21pbl9iaW5kaW5nID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAucmVtb3ZlX21pbl9lbHRcIlxuICAgICAgfCBOb2RlIHtsPUVtcHR5OyByfSAtPiByXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IGJhbCAocmVtb3ZlX21pbl9iaW5kaW5nIGwpIHYgZCByXG5cbiAgICBsZXQgbWVyZ2UgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPlxuICAgICAgICAgIGxldCAoeCwgZCkgPSBtaW5fYmluZGluZyB0MiBpblxuICAgICAgICAgIGJhbCB0MSB4IGQgKHJlbW92ZV9taW5fYmluZGluZyB0MilcblxuICAgIGxldCByZWMgcmVtb3ZlIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIEVtcHR5XG4gICAgICB8IChOb2RlIHtsOyB2OyBkOyByfSBhcyBtKSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBtZXJnZSBsIHJcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBsbCA9IHJlbW92ZSB4IGwgaW4gaWYgbCA9PSBsbCB0aGVuIG0gZWxzZSBiYWwgbGwgdiBkIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSByZW1vdmUgeCByIGluIGlmIHIgPT0gcnIgdGhlbiBtIGVsc2UgYmFsIGwgdiBkIHJyXG5cbiAgICBsZXQgcmVjIHVwZGF0ZSB4IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIGYgTm9uZSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IEVtcHR5XG4gICAgICAgICAgfCBTb21lIGRhdGEgLT4gTm9kZXtsPUVtcHR5OyB2PXg7IGQ9ZGF0YTsgcj1FbXB0eTsgaD0xfVxuICAgICAgICAgIGVuZFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSBhcyBtIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgICBtYXRjaCBmIChTb21lIGQpIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiBtZXJnZSBsIHJcbiAgICAgICAgICAgIHwgU29tZSBkYXRhIC0+XG4gICAgICAgICAgICAgICAgaWYgZCA9PSBkYXRhIHRoZW4gbSBlbHNlIE5vZGV7bDsgdj14OyBkPWRhdGE7IHI7IGh9XG4gICAgICAgICAgZW5kIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gdXBkYXRlIHggZiBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gbSBlbHNlIGJhbCBsbCB2IGQgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IHVwZGF0ZSB4IGYgciBpblxuICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIG0gZWxzZSBiYWwgbCB2IGQgcnJcblxuICAgIGxldCByZWMgaXRlciBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpdGVyIGYgbDsgZiB2IGQ7IGl0ZXIgZiByXG5cbiAgICBsZXQgcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSAtPlxuICAgICAgICAgIGxldCBsJyA9IG1hcCBmIGwgaW5cbiAgICAgICAgICBsZXQgZCcgPSBmIGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBtYXAgZiByIGluXG4gICAgICAgICAgTm9kZXtsPWwnOyB2OyBkPWQnOyByPXInOyBofVxuXG4gICAgbGV0IHJlYyBtYXBpIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IC0+XG4gICAgICAgICAgbGV0IGwnID0gbWFwaSBmIGwgaW5cbiAgICAgICAgICBsZXQgZCcgPSBmIHYgZCBpblxuICAgICAgICAgIGxldCByJyA9IG1hcGkgZiByIGluXG4gICAgICAgICAgTm9kZXtsPWwnOyB2OyBkPWQnOyByPXInOyBofVxuXG4gICAgbGV0IHJlYyBmb2xkIGYgbSBhY2N1ID1cbiAgICAgIG1hdGNoIG0gd2l0aFxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgZm9sZCBmIHIgKGYgdiBkIChmb2xkIGYgbCBhY2N1KSlcblxuICAgIGxldCByZWMgZm9yX2FsbCBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBwIHYgZCAmJiBmb3JfYWxsIHAgbCAmJiBmb3JfYWxsIHAgclxuXG4gICAgbGV0IHJlYyBleGlzdHMgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IHAgdiBkIHx8IGV4aXN0cyBwIGwgfHwgZXhpc3RzIHAgclxuXG4gICAgKCogQmV3YXJlOiB0aG9zZSB0d28gZnVuY3Rpb25zIGFzc3VtZSB0aGF0IHRoZSBhZGRlZCBrIGlzICpzdHJpY3RseSpcbiAgICAgICBzbWFsbGVyIChvciBiaWdnZXIpIHRoYW4gYWxsIHRoZSBwcmVzZW50IGtleXMgaW4gdGhlIHRyZWU7IGl0XG4gICAgICAgZG9lcyBub3QgdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgY3VycmVudCBtaW4gKG9yIG1heCkga2V5LlxuXG4gICAgICAgSW5kZWVkLCB0aGV5IGFyZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBcImpvaW5cIiBvcGVyYXRpb24gd2hpY2hcbiAgICAgICByZXNwZWN0cyB0aGlzIHByZWNvbmRpdGlvbi5cbiAgICAqKVxuXG4gICAgbGV0IHJlYyBhZGRfbWluX2JpbmRpbmcgayB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIGsgeFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICBiYWwgKGFkZF9taW5fYmluZGluZyBrIHggbCkgdiBkIHJcblxuICAgIGxldCByZWMgYWRkX21heF9iaW5kaW5nIGsgeCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IHNpbmdsZXRvbiBrIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgYmFsIGwgdiBkIChhZGRfbWF4X2JpbmRpbmcgayB4IHIpXG5cbiAgICAoKiBTYW1lIGFzIGNyZWF0ZSBhbmQgYmFsLCBidXQgbm8gYXNzdW1wdGlvbnMgYXJlIG1hZGUgb24gdGhlXG4gICAgICAgcmVsYXRpdmUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuXG4gICAgbGV0IHJlYyBqb2luIGwgdiBkIHIgPVxuICAgICAgbWF0Y2ggKGwsIHIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSAtPiBhZGRfbWluX2JpbmRpbmcgdiBkIHJcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBhZGRfbWF4X2JpbmRpbmcgdiBkIGxcbiAgICAgIHwgKE5vZGV7bD1sbDsgdj1sdjsgZD1sZDsgcj1scjsgaD1saH0sXG4gICAgICAgICBOb2Rle2w9cmw7IHY9cnY7IGQ9cmQ7IHI9cnI7IGg9cmh9KSAtPlxuICAgICAgICAgIGlmIGxoID4gcmggKyAyIHRoZW4gYmFsIGxsIGx2IGxkIChqb2luIGxyIHYgZCByKSBlbHNlXG4gICAgICAgICAgaWYgcmggPiBsaCArIDIgdGhlbiBiYWwgKGpvaW4gbCB2IGQgcmwpIHJ2IHJkIHJyIGVsc2VcbiAgICAgICAgICBjcmVhdGUgbCB2IGQgclxuXG4gICAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuXG4gICAgICAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICAgIE5vIGFzc3VtcHRpb24gb24gdGhlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCBjb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPlxuICAgICAgICAgIGxldCAoeCwgZCkgPSBtaW5fYmluZGluZyB0MiBpblxuICAgICAgICAgIGpvaW4gdDEgeCBkIChyZW1vdmVfbWluX2JpbmRpbmcgdDIpXG5cbiAgICBsZXQgY29uY2F0X29yX2pvaW4gdDEgdiBkIHQyID1cbiAgICAgIG1hdGNoIGQgd2l0aFxuICAgICAgfCBTb21lIGQgLT4gam9pbiB0MSB2IGQgdDJcbiAgICAgIHwgTm9uZSAtPiBjb25jYXQgdDEgdDJcblxuICAgIGxldCByZWMgc3BsaXQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgKEVtcHR5LCBOb25lLCBFbXB0eSlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gKGwsIFNvbWUgZCwgcilcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCAobGwsIHByZXMsIHJsKSA9IHNwbGl0IHggbCBpbiAobGwsIHByZXMsIGpvaW4gcmwgdiBkIHIpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IChsciwgcHJlcywgcnIpID0gc3BsaXQgeCByIGluIChqb2luIGwgdiBkIGxyLCBwcmVzLCBycilcblxuICAgIGxldCByZWMgbWVyZ2UgZiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgRW1wdHkpIC0+IEVtcHR5XG4gICAgICB8IChOb2RlIHtsPWwxOyB2PXYxOyBkPWQxOyByPXIxOyBoPWgxfSwgXykgd2hlbiBoMSA+PSBoZWlnaHQgczIgLT5cbiAgICAgICAgICBsZXQgKGwyLCBkMiwgcjIpID0gc3BsaXQgdjEgczIgaW5cbiAgICAgICAgICBjb25jYXRfb3Jfam9pbiAobWVyZ2UgZiBsMSBsMikgdjEgKGYgdjEgKFNvbWUgZDEpIGQyKSAobWVyZ2UgZiByMSByMilcbiAgICAgIHwgKF8sIE5vZGUge2w9bDI7IHY9djI7IGQ9ZDI7IHI9cjJ9KSAtPlxuICAgICAgICAgIGxldCAobDEsIGQxLCByMSkgPSBzcGxpdCB2MiBzMSBpblxuICAgICAgICAgIGNvbmNhdF9vcl9qb2luIChtZXJnZSBmIGwxIGwyKSB2MiAoZiB2MiBkMSAoU29tZSBkMikpIChtZXJnZSBmIHIxIHIyKVxuICAgICAgfCBfIC0+XG4gICAgICAgICAgYXNzZXJ0IGZhbHNlXG5cbiAgICBsZXQgcmVjIHVuaW9uIGYgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgfCAoRW1wdHksIHMpIHwgKHMsIEVtcHR5KSAtPiBzXG4gICAgICB8IChOb2RlIHtsPWwxOyB2PXYxOyBkPWQxOyByPXIxOyBoPWgxfSxcbiAgICAgICAgIE5vZGUge2w9bDI7IHY9djI7IGQ9ZDI7IHI9cjI7IGg9aDJ9KSAtPlxuICAgICAgICAgIGlmIGgxID49IGgyIHRoZW5cbiAgICAgICAgICAgIGxldCAobDIsIGQyLCByMikgPSBzcGxpdCB2MSBzMiBpblxuICAgICAgICAgICAgbGV0IGwgPSB1bmlvbiBmIGwxIGwyIGFuZCByID0gdW5pb24gZiByMSByMiBpblxuICAgICAgICAgICAgbWF0Y2ggZDIgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IGpvaW4gbCB2MSBkMSByXG4gICAgICAgICAgICB8IFNvbWUgZDIgLT4gY29uY2F0X29yX2pvaW4gbCB2MSAoZiB2MSBkMSBkMikgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCAobDEsIGQxLCByMSkgPSBzcGxpdCB2MiBzMSBpblxuICAgICAgICAgICAgbGV0IGwgPSB1bmlvbiBmIGwxIGwyIGFuZCByID0gdW5pb24gZiByMSByMiBpblxuICAgICAgICAgICAgbWF0Y2ggZDEgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IGpvaW4gbCB2MiBkMiByXG4gICAgICAgICAgICB8IFNvbWUgZDEgLT4gY29uY2F0X29yX2pvaW4gbCB2MiAoZiB2MiBkMSBkMikgclxuXG4gICAgbGV0IHJlYyBmaWx0ZXIgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IGFzIG0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCBsJyA9IGZpbHRlciBwIGwgaW5cbiAgICAgICAgICBsZXQgcHZkID0gcCB2IGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBmaWx0ZXIgcCByIGluXG4gICAgICAgICAgaWYgcHZkIHRoZW4gaWYgbD09bCcgJiYgcj09cicgdGhlbiBtIGVsc2Ugam9pbiBsJyB2IGQgcidcbiAgICAgICAgICBlbHNlIGNvbmNhdCBsJyByJ1xuXG4gICAgbGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgICgqIGNhbGwgW2ZdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IGwnID0gZmlsdGVyX21hcCBmIGwgaW5cbiAgICAgICAgICBsZXQgZnZkID0gZiB2IGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBmaWx0ZXJfbWFwIGYgciBpblxuICAgICAgICAgIGJlZ2luIG1hdGNoIGZ2ZCB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgZCcgLT4gam9pbiBsJyB2IGQnIHInXG4gICAgICAgICAgICB8IE5vbmUgLT4gY29uY2F0IGwnIHInXG4gICAgICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIHBhcnRpdGlvbiBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKEVtcHR5LCBFbXB0eSlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCAobHQsIGxmKSA9IHBhcnRpdGlvbiBwIGwgaW5cbiAgICAgICAgICBsZXQgcHZkID0gcCB2IGQgaW5cbiAgICAgICAgICBsZXQgKHJ0LCByZikgPSBwYXJ0aXRpb24gcCByIGluXG4gICAgICAgICAgaWYgcHZkXG4gICAgICAgICAgdGhlbiAoam9pbiBsdCB2IGQgcnQsIGNvbmNhdCBsZiByZilcbiAgICAgICAgICBlbHNlIChjb25jYXQgbHQgcnQsIGpvaW4gbGYgdiBkIHJmKVxuXG4gICAgdHlwZSAnYSBlbnVtZXJhdGlvbiA9IEVuZCB8IE1vcmUgb2Yga2V5ICogJ2EgKiAnYSB0ICogJ2EgZW51bWVyYXRpb25cblxuICAgIGxldCByZWMgY29uc19lbnVtIG0gZSA9XG4gICAgICBtYXRjaCBtIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBjb25zX2VudW0gbCAoTW9yZSh2LCBkLCByLCBlKSlcblxuICAgIGxldCBjb21wYXJlIGNtcCBtMSBtMiA9XG4gICAgICBsZXQgcmVjIGNvbXBhcmVfYXV4IGUxIGUyID1cbiAgICAgICAgICBtYXRjaCAoZTEsIGUyKSB3aXRoXG4gICAgICAgICAgKEVuZCwgRW5kKSAtPiAwXG4gICAgICAgIHwgKEVuZCwgXykgIC0+IC0xXG4gICAgICAgIHwgKF8sIEVuZCkgLT4gMVxuICAgICAgICB8IChNb3JlKHYxLCBkMSwgcjEsIGUxKSwgTW9yZSh2MiwgZDIsIHIyLCBlMikpIC0+XG4gICAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHYxIHYyIGluXG4gICAgICAgICAgICBpZiBjIDw+IDAgdGhlbiBjIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIGQxIGQyIGluXG4gICAgICAgICAgICBpZiBjIDw+IDAgdGhlbiBjIGVsc2VcbiAgICAgICAgICAgIGNvbXBhcmVfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG4gICAgICBpbiBjb21wYXJlX2F1eCAoY29uc19lbnVtIG0xIEVuZCkgKGNvbnNfZW51bSBtMiBFbmQpXG5cbiAgICBsZXQgZXF1YWwgY21wIG0xIG0yID1cbiAgICAgIGxldCByZWMgZXF1YWxfYXV4IGUxIGUyID1cbiAgICAgICAgICBtYXRjaCAoZTEsIGUyKSB3aXRoXG4gICAgICAgICAgKEVuZCwgRW5kKSAtPiB0cnVlXG4gICAgICAgIHwgKEVuZCwgXykgIC0+IGZhbHNlXG4gICAgICAgIHwgKF8sIEVuZCkgLT4gZmFsc2VcbiAgICAgICAgfCAoTW9yZSh2MSwgZDEsIHIxLCBlMSksIE1vcmUodjIsIGQyLCByMiwgZTIpKSAtPlxuICAgICAgICAgICAgT3JkLmNvbXBhcmUgdjEgdjIgPSAwICYmIGNtcCBkMSBkMiAmJlxuICAgICAgICAgICAgZXF1YWxfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG4gICAgICBpbiBlcXVhbF9hdXggKGNvbnNfZW51bSBtMSBFbmQpIChjb25zX2VudW0gbTIgRW5kKVxuXG4gICAgbGV0IHJlYyBjYXJkaW5hbCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZSB7bDsgcn0gLT4gY2FyZGluYWwgbCArIDEgKyBjYXJkaW5hbCByXG5cbiAgICBsZXQgcmVjIGJpbmRpbmdzX2F1eCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBiaW5kaW5nc19hdXggKCh2LCBkKSA6OiBiaW5kaW5nc19hdXggYWNjdSByKSBsXG5cbiAgICBsZXQgYmluZGluZ3MgcyA9XG4gICAgICBiaW5kaW5nc19hdXggW10gc1xuXG4gICAgbGV0IGNob29zZSA9IG1pbl9iaW5kaW5nXG5cbiAgICBsZXQgY2hvb3NlX29wdCA9IG1pbl9iaW5kaW5nX29wdFxuXG4gICAgbGV0IGFkZF9zZXEgaSBtID1cbiAgICAgIFNlcS5mb2xkX2xlZnQgKGZ1biBtIChrLHYpIC0+IGFkZCBrIHYgbSkgbSBpXG5cbiAgICBsZXQgb2Zfc2VxIGkgPSBhZGRfc2VxIGkgZW1wdHlcblxuICAgIGxldCByZWMgc2VxX29mX2VudW1fIGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICAgIHwgRW5kIC0+IFNlcS5OaWxcbiAgICAgIHwgTW9yZSAoayx2LHQscmVzdCkgLT4gU2VxLkNvbnMgKChrLHYpLCBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3NlcSBtID1cbiAgICAgIHNlcV9vZl9lbnVtXyAoY29uc19lbnVtIG0gRW5kKVxuXG4gICAgbGV0IHJlYyBzbm9jX2VudW0gcyBlID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgICBFbXB0eSAtPiBlXG4gICAgICB8IE5vZGV7bDsgdjsgZDsgcn0gLT4gc25vY19lbnVtIHIgKE1vcmUodiwgZCwgbCwgZSkpXG5cbiAgICBsZXQgcmVjIHJldl9zZXFfb2ZfZW51bV8gYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgICAgfCBFbmQgLT4gU2VxLk5pbFxuICAgICAgfCBNb3JlIChrLHYsdCxyZXN0KSAtPlxuICAgICAgICAgIFNlcS5Db25zICgoayx2KSwgcmV2X3NlcV9vZl9lbnVtXyAoc25vY19lbnVtIHQgcmVzdCkpXG5cbiAgICBsZXQgdG9fcmV2X3NlcSBjID1cbiAgICAgIHJldl9zZXFfb2ZfZW51bV8gKHNub2NfZW51bSBjIEVuZClcblxuICAgIGxldCB0b19zZXFfZnJvbSBsb3cgbSA9XG4gICAgICBsZXQgcmVjIGF1eCBsb3cgbSBjID0gbWF0Y2ggbSB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gY1xuICAgICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IF99IC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBPcmQuY29tcGFyZSB2IGxvdyB3aXRoXG4gICAgICAgICAgICAgIHwgMCAtPiBNb3JlICh2LCBkLCByLCBjKVxuICAgICAgICAgICAgICB8IG4gd2hlbiBuPDAgLT4gYXV4IGxvdyByIGNcbiAgICAgICAgICAgICAgfCBfIC0+IGF1eCBsb3cgbCAoTW9yZSAodiwgZCwgciwgYykpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGluXG4gICAgICBzZXFfb2ZfZW51bV8gKGF1eCBsb3cgbSBFbmQpXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAnYSB0ID0geyBtdXRhYmxlIGMgOiAnYSBsaXN0OyBtdXRhYmxlIGxlbiA6IGludDsgfVxuXG5leGNlcHRpb24gRW1wdHlcblxubGV0IGNyZWF0ZSAoKSA9IHsgYyA9IFtdOyBsZW4gPSAwOyB9XG5cbmxldCBjbGVhciBzID0gcy5jIDwtIFtdOyBzLmxlbiA8LSAwXG5cbmxldCBjb3B5IHMgPSB7IGMgPSBzLmM7IGxlbiA9IHMubGVuOyB9XG5cbmxldCBwdXNoIHggcyA9IHMuYyA8LSB4IDo6IHMuYzsgcy5sZW4gPC0gcy5sZW4gKyAxXG5cbmxldCBwb3AgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6OnRsIC0+IHMuYyA8LSB0bDsgcy5sZW4gPC0gcy5sZW4gLSAxOyBoZFxuICB8IFtdICAgICAtPiByYWlzZSBFbXB0eVxuXG5sZXQgcG9wX29wdCBzID1cbiAgbWF0Y2ggcy5jIHdpdGhcbiAgfCBoZDo6dGwgLT4gcy5jIDwtIHRsOyBzLmxlbiA8LSBzLmxlbiAtIDE7IFNvbWUgaGRcbiAgfCBbXSAgICAgLT4gTm9uZVxuXG5sZXQgdG9wIHMgPVxuICBtYXRjaCBzLmMgd2l0aFxuICB8IGhkOjpfIC0+IGhkXG4gIHwgW10gICAgLT4gcmFpc2UgRW1wdHlcblxubGV0IHRvcF9vcHQgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6Ol8gLT4gU29tZSBoZFxuICB8IFtdICAgIC0+IE5vbmVcblxubGV0IGlzX2VtcHR5IHMgPSAocy5jID0gW10pXG5cbmxldCBsZW5ndGggcyA9IHMubGVuXG5cbmxldCBpdGVyIGYgcyA9IExpc3QuaXRlciBmIHMuY1xuXG5sZXQgZm9sZCBmIGFjYyBzID0gTGlzdC5mb2xkX2xlZnQgZiBhY2Mgcy5jXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgcyA9IExpc3QudG9fc2VxIHMuY1xuXG5sZXQgYWRkX3NlcSBxIGkgPSBTZXEuaXRlciAoZnVuIHggLT4gcHVzaCB4IHEpIGlcblxubGV0IG9mX3NlcSBnID1cbiAgbGV0IHMgPSBjcmVhdGUoKSBpblxuICBhZGRfc2VxIHMgZztcbiAgc1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICBGcmFuY29pcyBQb3R0aWVyLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICBKZXJlbWllIERpbWlubywgSmFuZSBTdHJlZXQgRXVyb3BlICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leGNlcHRpb24gRW1wdHlcblxudHlwZSAnYSBjZWxsID1cbiAgfCBOaWxcbiAgfCBDb25zIG9mIHsgY29udGVudDogJ2E7IG11dGFibGUgbmV4dDogJ2EgY2VsbCB9XG5cbnR5cGUgJ2EgdCA9IHtcbiAgbXV0YWJsZSBsZW5ndGg6IGludDtcbiAgbXV0YWJsZSBmaXJzdDogJ2EgY2VsbDtcbiAgbXV0YWJsZSBsYXN0OiAnYSBjZWxsXG59XG5cbmxldCBjcmVhdGUgKCkgPSB7XG4gIGxlbmd0aCA9IDA7XG4gIGZpcnN0ID0gTmlsO1xuICBsYXN0ID0gTmlsXG59XG5cbmxldCBjbGVhciBxID1cbiAgcS5sZW5ndGggPC0gMDtcbiAgcS5maXJzdCA8LSBOaWw7XG4gIHEubGFzdCA8LSBOaWxcblxubGV0IGFkZCB4IHEgPVxuICBsZXQgY2VsbCA9IENvbnMge1xuICAgIGNvbnRlbnQgPSB4O1xuICAgIG5leHQgPSBOaWxcbiAgfSBpblxuICBtYXRjaCBxLmxhc3Qgd2l0aFxuICB8IE5pbCAtPlxuICAgIHEubGVuZ3RoIDwtIDE7XG4gICAgcS5maXJzdCA8LSBjZWxsO1xuICAgIHEubGFzdCA8LSBjZWxsXG4gIHwgQ29ucyBsYXN0IC0+XG4gICAgcS5sZW5ndGggPC0gcS5sZW5ndGggKyAxO1xuICAgIGxhc3QubmV4dCA8LSBjZWxsO1xuICAgIHEubGFzdCA8LSBjZWxsXG5cbmxldCBwdXNoID1cbiAgYWRkXG5cbmxldCBwZWVrIHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gcmFpc2UgRW1wdHlcbiAgfCBDb25zIHsgY29udGVudCB9IC0+IGNvbnRlbnRcblxubGV0IHBlZWtfb3B0IHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gTm9uZVxuICB8IENvbnMgeyBjb250ZW50IH0gLT4gU29tZSBjb250ZW50XG5cbmxldCB0b3AgPVxuICBwZWVrXG5cbmxldCB0YWtlIHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gcmFpc2UgRW1wdHlcbiAgfCBDb25zIHsgY29udGVudDsgbmV4dCA9IE5pbCB9IC0+XG4gICAgY2xlYXIgcTtcbiAgICBjb250ZW50XG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgIHEubGVuZ3RoIDwtIHEubGVuZ3RoIC0gMTtcbiAgICBxLmZpcnN0IDwtIG5leHQ7XG4gICAgY29udGVudFxuXG5sZXQgdGFrZV9vcHQgcSA9XG4gIG1hdGNoIHEuZmlyc3Qgd2l0aFxuICB8IE5pbCAtPiBOb25lXG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgPSBOaWwgfSAtPlxuICAgIGNsZWFyIHE7XG4gICAgU29tZSBjb250ZW50XG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgIHEubGVuZ3RoIDwtIHEubGVuZ3RoIC0gMTtcbiAgICBxLmZpcnN0IDwtIG5leHQ7XG4gICAgU29tZSBjb250ZW50XG5cbmxldCBwb3AgPVxuICB0YWtlXG5cbmxldCBjb3B5ID1cbiAgbGV0IHJlYyBjb3B5IHFfcmVzIHByZXYgY2VsbCA9XG4gICAgbWF0Y2ggY2VsbCB3aXRoXG4gICAgfCBOaWwgLT4gcV9yZXMubGFzdCA8LSBwcmV2OyBxX3Jlc1xuICAgIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgICAgbGV0IHJlcyA9IENvbnMgeyBjb250ZW50OyBuZXh0ID0gTmlsIH0gaW5cbiAgICAgIGJlZ2luIG1hdGNoIHByZXYgd2l0aFxuICAgICAgfCBOaWwgLT4gcV9yZXMuZmlyc3QgPC0gcmVzXG4gICAgICB8IENvbnMgcCAtPiBwLm5leHQgPC0gcmVzXG4gICAgICBlbmQ7XG4gICAgICBjb3B5IHFfcmVzIHJlcyBuZXh0XG4gIGluXG4gIGZ1biBxIC0+IGNvcHkgeyBsZW5ndGggPSBxLmxlbmd0aDsgZmlyc3QgPSBOaWw7IGxhc3QgPSBOaWwgfSBOaWwgcS5maXJzdFxuXG5sZXQgaXNfZW1wdHkgcSA9XG4gIHEubGVuZ3RoID0gMFxuXG5sZXQgbGVuZ3RoIHEgPVxuICBxLmxlbmd0aFxuXG5sZXQgaXRlciA9XG4gIGxldCByZWMgaXRlciBmIGNlbGwgPVxuICAgIG1hdGNoIGNlbGwgd2l0aFxuICAgIHwgTmlsIC0+ICgpXG4gICAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgICBmIGNvbnRlbnQ7XG4gICAgICBpdGVyIGYgbmV4dFxuICBpblxuICBmdW4gZiBxIC0+IGl0ZXIgZiBxLmZpcnN0XG5cbmxldCBmb2xkID1cbiAgbGV0IHJlYyBmb2xkIGYgYWNjdSBjZWxsID1cbiAgICBtYXRjaCBjZWxsIHdpdGhcbiAgICB8IE5pbCAtPiBhY2N1XG4gICAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgICBsZXQgYWNjdSA9IGYgYWNjdSBjb250ZW50IGluXG4gICAgICBmb2xkIGYgYWNjdSBuZXh0XG4gIGluXG4gIGZ1biBmIGFjY3UgcSAtPiBmb2xkIGYgYWNjdSBxLmZpcnN0XG5cbmxldCB0cmFuc2ZlciBxMSBxMiA9XG4gIGlmIHExLmxlbmd0aCA+IDAgdGhlblxuICAgIG1hdGNoIHEyLmxhc3Qgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICBxMi5sZW5ndGggPC0gcTEubGVuZ3RoO1xuICAgICAgcTIuZmlyc3QgPC0gcTEuZmlyc3Q7XG4gICAgICBxMi5sYXN0IDwtIHExLmxhc3Q7XG4gICAgICBjbGVhciBxMVxuICAgIHwgQ29ucyBsYXN0IC0+XG4gICAgICBxMi5sZW5ndGggPC0gcTIubGVuZ3RoICsgcTEubGVuZ3RoO1xuICAgICAgbGFzdC5uZXh0IDwtIHExLmZpcnN0O1xuICAgICAgcTIubGFzdCA8LSBxMS5sYXN0O1xuICAgICAgY2xlYXIgcTFcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBxID1cbiAgbGV0IHJlYyBhdXggYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgIHwgTmlsIC0+IFNlcS5OaWxcbiAgICB8IENvbnMgeyBjb250ZW50PXg7IG5leHQ7IH0gLT4gU2VxLkNvbnMgKHgsIGF1eCBuZXh0KVxuICBpblxuICBhdXggcS5maXJzdFxuXG5sZXQgYWRkX3NlcSBxIGkgPSBTZXEuaXRlciAoZnVuIHggLT4gcHVzaCB4IHEpIGlcblxubGV0IG9mX3NlcSBnID1cbiAgbGV0IHEgPSBjcmVhdGUoKSBpblxuICBhZGRfc2VxIHEgZztcbiAgcVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICBEYW5pZWwgZGUgUmF1Z2xhdWRyZSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBjZWxsIG9wdGlvblxuYW5kICdhIGNlbGwgPSB7IG11dGFibGUgY291bnQgOiBpbnQ7IG11dGFibGUgZGF0YSA6ICdhIGRhdGEgfVxuYW5kICdhIGRhdGEgPVxuICAgIFNlbXB0eVxuICB8IFNjb25zIG9mICdhICogJ2EgZGF0YVxuICB8IFNhcHAgb2YgJ2EgZGF0YSAqICdhIGRhdGFcbiAgfCBTbGF6eSBvZiAnYSBkYXRhIExhenkudFxuICB8IFNnZW4gb2YgJ2EgZ2VuXG4gIHwgU2J1ZmZpbyA6IGJ1ZmZpbyAtPiBjaGFyIGRhdGFcbmFuZCAnYSBnZW4gPSB7IG11dGFibGUgY3VyciA6ICdhIG9wdGlvbiBvcHRpb247IGZ1bmMgOiBpbnQgLT4gJ2Egb3B0aW9uIH1cbmFuZCBidWZmaW8gPVxuICB7IGljIDogaW5fY2hhbm5lbDsgYnVmZiA6IGJ5dGVzOyBtdXRhYmxlIGxlbiA6IGludDsgbXV0YWJsZSBpbmQgOiBpbnQgfVxuXG5leGNlcHRpb24gRmFpbHVyZVxuZXhjZXB0aW9uIEVycm9yIG9mIHN0cmluZ1xuXG5sZXQgY291bnQgPSBmdW5jdGlvblxuICB8IE5vbmUgLT4gMFxuICB8IFNvbWUgeyBjb3VudCB9IC0+IGNvdW50XG5sZXQgZGF0YSA9IGZ1bmN0aW9uXG4gIHwgTm9uZSAtPiBTZW1wdHlcbiAgfCBTb21lIHsgZGF0YSB9IC0+IGRhdGFcblxubGV0IGZpbGxfYnVmZiBiID1cbiAgYi5sZW4gPC0gaW5wdXQgYi5pYyBiLmJ1ZmYgMCAoQnl0ZXMubGVuZ3RoIGIuYnVmZik7IGIuaW5kIDwtIDBcblxuXG5sZXQgcmVjIGdldF9kYXRhIDogdHlwZSB2LiBpbnQgLT4gdiBkYXRhIC0+IHYgZGF0YSA9IGZ1biBjb3VudCBkIC0+IG1hdGNoIGQgd2l0aFxuICgqIFJldHVybnMgZWl0aGVyIFNlbXB0eSBvciBTY29ucyhhLCBfKSBldmVuIHdoZW4gZCBpcyBhIGdlbmVyYXRvclxuICAgIG9yIGEgYnVmZmVyLiBJbiB0aG9zZSBjYXNlcywgdGhlIGl0ZW0gYSBpcyBzZWVuIGFzIGV4dHJhY3RlZCBmcm9tXG4gdGhlIGdlbmVyYXRvci9idWZmZXIuXG4gVGhlIGNvdW50IHBhcmFtZXRlciBpcyB1c2VkIGZvciBjYWxsaW5nIGBTZ2VuLWZ1bmN0aW9ucycuICAqKVxuICAgU2VtcHR5IHwgU2NvbnMgKF8sIF8pIC0+IGRcbiB8IFNhcHAgKGQxLCBkMikgLT5cbiAgICAgYmVnaW4gbWF0Y2ggZ2V0X2RhdGEgY291bnQgZDEgd2l0aFxuICAgICAgIFNjb25zIChhLCBkMTEpIC0+IFNjb25zIChhLCBTYXBwIChkMTEsIGQyKSlcbiAgICAgfCBTZW1wdHkgLT4gZ2V0X2RhdGEgY291bnQgZDJcbiAgICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuICAgICBlbmRcbiB8IFNnZW4ge2N1cnIgPSBTb21lIE5vbmV9IC0+IFNlbXB0eVxuIHwgU2dlbiAoe2N1cnIgPSBTb21lKFNvbWUgYSl9IGFzIGcpIC0+XG4gICAgIGcuY3VyciA8LSBOb25lOyBTY29ucyhhLCBkKVxuIHwgU2dlbiBnIC0+XG4gICAgIGJlZ2luIG1hdGNoIGcuZnVuYyBjb3VudCB3aXRoXG4gICAgICAgTm9uZSAtPiBnLmN1cnIgPC0gU29tZShOb25lKTsgU2VtcHR5XG4gICAgIHwgU29tZSBhIC0+IFNjb25zKGEsIGQpXG4gICAgICAgICAoKiBXYXJuaW5nOiBhbnlvbmUgdXNpbmcgZyB0aGlua3MgdGhhdCBhbiBpdGVtIGhhcyBiZWVuIHJlYWQgKilcbiAgICAgZW5kXG4gfCBTYnVmZmlvIGIgLT5cbiAgICAgaWYgYi5pbmQgPj0gYi5sZW4gdGhlbiBmaWxsX2J1ZmYgYjtcbiAgICAgaWYgYi5sZW4gPT0gMCB0aGVuIFNlbXB0eSBlbHNlXG4gICAgICAgbGV0IHIgPSBCeXRlcy51bnNhZmVfZ2V0IGIuYnVmZiBiLmluZCBpblxuICAgICAgICgqIFdhcm5pbmc6IGFueW9uZSB1c2luZyBnIHRoaW5rcyB0aGF0IGFuIGl0ZW0gaGFzIGJlZW4gcmVhZCAqKVxuICAgICAgIGIuaW5kIDwtIHN1Y2MgYi5pbmQ7IFNjb25zKHIsIGQpXG4gfCBTbGF6eSBmIC0+IGdldF9kYXRhIGNvdW50IChMYXp5LmZvcmNlIGYpXG5cblxubGV0IHJlYyBwZWVrX2RhdGEgOiB0eXBlIHYuIHYgY2VsbCAtPiB2IG9wdGlvbiA9IGZ1biBzIC0+XG4gKCogY29uc3VsdCB0aGUgZmlyc3QgaXRlbSBvZiBzICopXG4gbWF0Y2ggcy5kYXRhIHdpdGhcbiAgIFNlbXB0eSAtPiBOb25lXG4gfCBTY29ucyAoYSwgXykgLT4gU29tZSBhXG4gfCBTYXBwIChfLCBfKSAtPlxuICAgICBiZWdpbiBtYXRjaCBnZXRfZGF0YSBzLmNvdW50IHMuZGF0YSB3aXRoXG4gICAgICAgU2NvbnMoYSwgXykgYXMgZCAtPiBzLmRhdGEgPC0gZDsgU29tZSBhXG4gICAgIHwgU2VtcHR5IC0+IE5vbmVcbiAgICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuICAgICBlbmRcbiB8IFNsYXp5IGYgLT4gcy5kYXRhIDwtIChMYXp5LmZvcmNlIGYpOyBwZWVrX2RhdGEgc1xuIHwgU2dlbiB7Y3VyciA9IFNvbWUgYX0gLT4gYVxuIHwgU2dlbiBnIC0+IGxldCB4ID0gZy5mdW5jIHMuY291bnQgaW4gZy5jdXJyIDwtIFNvbWUgeDsgeFxuIHwgU2J1ZmZpbyBiIC0+XG4gICAgIGlmIGIuaW5kID49IGIubGVuIHRoZW4gZmlsbF9idWZmIGI7XG4gICAgIGlmIGIubGVuID09IDAgdGhlbiBiZWdpbiBzLmRhdGEgPC0gU2VtcHR5OyBOb25lIGVuZFxuICAgICBlbHNlIFNvbWUgKEJ5dGVzLnVuc2FmZV9nZXQgYi5idWZmIGIuaW5kKVxuXG5cbmxldCBwZWVrID0gZnVuY3Rpb25cbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIHMgLT4gcGVla19kYXRhIHNcblxuXG5sZXQgcmVjIGp1bmtfZGF0YSA6IHR5cGUgdi4gdiBjZWxsIC0+IHVuaXQgPSBmdW4gcyAtPlxuICBtYXRjaCBzLmRhdGEgd2l0aFxuICAgIFNjb25zIChfLCBkKSAtPiBzLmNvdW50IDwtIChzdWNjIHMuY291bnQpOyBzLmRhdGEgPC0gZFxuICB8IFNnZW4gKHtjdXJyID0gU29tZSBffSBhcyBnKSAtPiBzLmNvdW50IDwtIChzdWNjIHMuY291bnQpOyBnLmN1cnIgPC0gTm9uZVxuICB8IFNidWZmaW8gYiAtPlxuICAgICAgaWYgYi5pbmQgPj0gYi5sZW4gdGhlbiBmaWxsX2J1ZmYgYjtcbiAgICAgIGlmIGIubGVuID09IDAgdGhlbiBzLmRhdGEgPC0gU2VtcHR5XG4gICAgICBlbHNlIChzLmNvdW50IDwtIChzdWNjIHMuY291bnQpOyBiLmluZCA8LSBzdWNjIGIuaW5kKVxuICB8IF8gLT5cbiAgICAgIG1hdGNoIHBlZWtfZGF0YSBzIHdpdGhcbiAgICAgICAgTm9uZSAtPiAoKVxuICAgICAgfCBTb21lIF8gLT4ganVua19kYXRhIHNcblxuXG5sZXQganVuayA9IGZ1bmN0aW9uXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgZGF0YSAtPiBqdW5rX2RhdGEgZGF0YVxuXG5sZXQgcmVjIG5nZXRfZGF0YSBuIHMgPVxuICBpZiBuIDw9IDAgdGhlbiBbXSwgcy5kYXRhLCAwXG4gIGVsc2VcbiAgICBtYXRjaCBwZWVrX2RhdGEgcyB3aXRoXG4gICAgICBTb21lIGEgLT5cbiAgICAgICAganVua19kYXRhIHM7XG4gICAgICAgIGxldCAoYWwsIGQsIGspID0gbmdldF9kYXRhIChwcmVkIG4pIHMgaW4gYSA6OiBhbCwgU2NvbnMgKGEsIGQpLCBzdWNjIGtcbiAgICB8IE5vbmUgLT4gW10sIHMuZGF0YSwgMFxuXG5cbmxldCBucGVla19kYXRhIG4gcyA9XG4gIGxldCAoYWwsIGQsIGxlbikgPSBuZ2V0X2RhdGEgbiBzIGluXG4gIHMuY291bnQgPC0gKHMuY291bnQgLSBsZW4pO1xuICBzLmRhdGEgPC0gZDtcbiAgYWxcblxuXG5sZXQgbnBlZWsgbiA9IGZ1bmN0aW9uXG4gIHwgTm9uZSAtPiBbXVxuICB8IFNvbWUgZCAtPiBucGVla19kYXRhIG4gZFxuXG5sZXQgbmV4dCBzID1cbiAgbWF0Y2ggcGVlayBzIHdpdGhcbiAgICBTb21lIGEgLT4ganVuayBzOyBhXG4gIHwgTm9uZSAtPiByYWlzZSBGYWlsdXJlXG5cblxubGV0IGVtcHR5IHMgPVxuICBtYXRjaCBwZWVrIHMgd2l0aFxuICAgIFNvbWUgXyAtPiByYWlzZSBGYWlsdXJlXG4gIHwgTm9uZSAtPiAoKVxuXG5cbmxldCBpdGVyIGYgc3RybSA9XG4gIGxldCByZWMgZG9fcmVjICgpID1cbiAgICBtYXRjaCBwZWVrIHN0cm0gd2l0aFxuICAgICAgU29tZSBhIC0+IGp1bmsgc3RybTsgaWdub3JlKGYgYSk7IGRvX3JlYyAoKVxuICAgIHwgTm9uZSAtPiAoKVxuICBpblxuICBkb19yZWMgKClcblxuXG4oKiBTdHJlYW0gYnVpbGRpbmcgZnVuY3Rpb25zICopXG5cbmxldCBmcm9tIGYgPSBTb21lIHtjb3VudCA9IDA7IGRhdGEgPSBTZ2VuIHtjdXJyID0gTm9uZTsgZnVuYyA9IGZ9fVxuXG5sZXQgb2ZfbGlzdCBsID1cbiAgU29tZSB7Y291bnQgPSAwOyBkYXRhID0gTGlzdC5mb2xkX3JpZ2h0IChmdW4geCBsIC0+IFNjb25zICh4LCBsKSkgbCBTZW1wdHl9XG5cblxubGV0IG9mX3N0cmluZyBzID1cbiAgbGV0IGNvdW50ID0gcmVmIDAgaW5cbiAgZnJvbSAoZnVuIF8gLT5cbiAgICAoKiBXZSBjYW5ub3QgdXNlIHRoZSBpbmRleCBwYXNzZWQgYnkgdGhlIFtmcm9tXSBmdW5jdGlvbiBkaXJlY3RseVxuICAgICAgIGJlY2F1c2UgaXQgcmV0dXJucyB0aGUgY3VycmVudCBzdHJlYW0gY291bnQsIHdpdGggYWJzb2x1dGVseSBub1xuICAgICAgIGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgc3RhcnQgZnJvbSAwLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2VcbiAgICAgICBvZiBbU3RyZWFtLmljb25zICdjJyAoU3RyZWFtLmZyb21fc3RyaW5nIFwiYWJcIildLCB0aGUgZmlyc3RcbiAgICAgICBhY2Nlc3MgdG8gdGhlIHN0cmluZyB3aWxsIGJlIG1hZGUgd2l0aCBjb3VudCBbMV0gYWxyZWFkeS5cbiAgICAqKVxuICAgIGxldCBjID0gIWNvdW50IGluXG4gICAgaWYgYyA8IFN0cmluZy5sZW5ndGggc1xuICAgIHRoZW4gKGluY3IgY291bnQ7IFNvbWUgcy5bY10pXG4gICAgZWxzZSBOb25lKVxuXG5cbmxldCBvZl9ieXRlcyBzID1cbiAgbGV0IGNvdW50ID0gcmVmIDAgaW5cbiAgZnJvbSAoZnVuIF8gLT5cbiAgICBsZXQgYyA9ICFjb3VudCBpblxuICAgIGlmIGMgPCBCeXRlcy5sZW5ndGggc1xuICAgIHRoZW4gKGluY3IgY291bnQ7IFNvbWUgKEJ5dGVzLmdldCBzIGMpKVxuICAgIGVsc2UgTm9uZSlcblxuXG5sZXQgb2ZfY2hhbm5lbCBpYyA9XG4gIFNvbWUge2NvdW50ID0gMDtcbiAgICAgICAgZGF0YSA9IFNidWZmaW8ge2ljID0gaWM7IGJ1ZmYgPSBCeXRlcy5jcmVhdGUgNDA5NjsgbGVuID0gMDsgaW5kID0gMH19XG5cblxuKCogU3RyZWFtIGV4cHJlc3Npb25zIGJ1aWxkZXJzICopXG5cbmxldCBpYXBwIGkgcyA9IFNvbWUge2NvdW50ID0gMDsgZGF0YSA9IFNhcHAgKGRhdGEgaSwgZGF0YSBzKX1cbmxldCBpY29ucyBpIHMgPSBTb21lIHtjb3VudCA9IDA7IGRhdGEgPSBTY29ucyAoaSwgZGF0YSBzKX1cbmxldCBpc2luZyBpID0gU29tZSB7Y291bnQgPSAwOyBkYXRhID0gU2NvbnMgKGksIFNlbXB0eSl9XG5cbmxldCBsYXBwIGYgcyA9XG4gIFNvbWUge2NvdW50ID0gMDsgZGF0YSA9IFNsYXp5IChsYXp5KFNhcHAgKGRhdGEgKGYgKCkpLCBkYXRhIHMpKSl9XG5cbmxldCBsY29ucyBmIHMgPSBTb21lIHtjb3VudCA9IDA7IGRhdGEgPSBTbGF6eSAobGF6eShTY29ucyAoZiAoKSwgZGF0YSBzKSkpfVxubGV0IGxzaW5nIGYgPSBTb21lIHtjb3VudCA9IDA7IGRhdGEgPSBTbGF6eSAobGF6eShTY29ucyAoZiAoKSwgU2VtcHR5KSkpfVxuXG5sZXQgc2VtcHR5ID0gTm9uZVxubGV0IHNsYXp5IGYgPSBTb21lIHtjb3VudCA9IDA7IGRhdGEgPSBTbGF6eSAobGF6eShkYXRhIChmICgpKSkpfVxuXG4oKiBGb3IgZGVidWdnaW5nIHVzZSAqKVxuXG5sZXQgcmVjIGR1bXAgOiB0eXBlIHYuICh2IC0+IHVuaXQpIC0+IHYgdCAtPiB1bml0ID0gZnVuIGYgcyAtPlxuICBwcmludF9zdHJpbmcgXCJ7Y291bnQgPSBcIjtcbiAgcHJpbnRfaW50IChjb3VudCBzKTtcbiAgcHJpbnRfc3RyaW5nIFwiOyBkYXRhID0gXCI7XG4gIGR1bXBfZGF0YSBmIChkYXRhIHMpO1xuICBwcmludF9zdHJpbmcgXCJ9XCI7XG4gIHByaW50X25ld2xpbmUgKClcbmFuZCBkdW1wX2RhdGEgOiB0eXBlIHYuICh2IC0+IHVuaXQpIC0+IHYgZGF0YSAtPiB1bml0ID0gZnVuIGYgLT5cbiAgZnVuY3Rpb25cbiAgICBTZW1wdHkgLT4gcHJpbnRfc3RyaW5nIFwiU2VtcHR5XCJcbiAgfCBTY29ucyAoYSwgZCkgLT5cbiAgICAgIHByaW50X3N0cmluZyBcIlNjb25zIChcIjtcbiAgICAgIGYgYTtcbiAgICAgIHByaW50X3N0cmluZyBcIiwgXCI7XG4gICAgICBkdW1wX2RhdGEgZiBkO1xuICAgICAgcHJpbnRfc3RyaW5nIFwiKVwiXG4gIHwgU2FwcCAoZDEsIGQyKSAtPlxuICAgICAgcHJpbnRfc3RyaW5nIFwiU2FwcCAoXCI7XG4gICAgICBkdW1wX2RhdGEgZiBkMTtcbiAgICAgIHByaW50X3N0cmluZyBcIiwgXCI7XG4gICAgICBkdW1wX2RhdGEgZiBkMjtcbiAgICAgIHByaW50X3N0cmluZyBcIilcIlxuICB8IFNsYXp5IF8gLT4gcHJpbnRfc3RyaW5nIFwiU2xhenlcIlxuICB8IFNnZW4gXyAtPiBwcmludF9zdHJpbmcgXCJTZ2VuXCJcbiAgfCBTYnVmZmlvIF8gLT4gcHJpbnRfc3RyaW5nIFwiU2J1ZmZpb1wiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICBQaWVycmUgV2VpcyBhbmQgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk5IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEV4dGVuc2libGUgYnVmZmVycyAqKVxuXG50eXBlIHQgPVxuIHttdXRhYmxlIGJ1ZmZlciA6IGJ5dGVzO1xuICBtdXRhYmxlIHBvc2l0aW9uIDogaW50O1xuICBtdXRhYmxlIGxlbmd0aCA6IGludDtcbiAgaW5pdGlhbF9idWZmZXIgOiBieXRlc31cbigqIEludmFyaWFudHM6IGFsbCBwYXJ0cyBvZiB0aGUgY29kZSBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50cyB0aGF0OlxuICAgLSBbMCA8PSBiLnBvc2l0aW9uIDw9IGIubGVuZ3RoXVxuICAgLSBbYi5sZW5ndGggPSBCeXRlcy5sZW5ndGggYi5idWZmZXJdXG5cbiAgIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IFtiLnBvc2l0aW9uID0gYi5sZW5ndGhdIGlzIGxlZ2FsLFxuICAgaXQgbWVhbnMgdGhhdCB0aGUgYnVmZmVyIGlzIGZ1bGwgYW5kIHdpbGwgaGF2ZSB0byBiZSBleHRlbmRlZFxuICAgYmVmb3JlIGFueSBmdXJ0aGVyIGFkZGl0aW9uLiAqKVxuXG5sZXQgY3JlYXRlIG4gPVxuIGxldCBuID0gaWYgbiA8IDEgdGhlbiAxIGVsc2UgbiBpblxuIGxldCBuID0gaWYgbiA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBlbHNlIG4gaW5cbiBsZXQgcyA9IEJ5dGVzLmNyZWF0ZSBuIGluXG4ge2J1ZmZlciA9IHM7IHBvc2l0aW9uID0gMDsgbGVuZ3RoID0gbjsgaW5pdGlhbF9idWZmZXIgPSBzfVxuXG5sZXQgY29udGVudHMgYiA9IEJ5dGVzLnN1Yl9zdHJpbmcgYi5idWZmZXIgMCBiLnBvc2l0aW9uXG5sZXQgdG9fYnl0ZXMgYiA9IEJ5dGVzLnN1YiBiLmJ1ZmZlciAwIGIucG9zaXRpb25cblxubGV0IHN1YiBiIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gYi5wb3NpdGlvbiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLnN1YlwiXG4gIGVsc2UgQnl0ZXMuc3ViX3N0cmluZyBiLmJ1ZmZlciBvZnMgbGVuXG5cblxubGV0IGJsaXQgc3JjIHNyY29mZiBkc3QgZHN0b2ZmIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgc3Jjb2ZmIDwgMCB8fCBzcmNvZmYgPiBzcmMucG9zaXRpb24gLSBsZW5cbiAgICAgICAgICAgICB8fCBkc3RvZmYgPCAwIHx8IGRzdG9mZiA+IChCeXRlcy5sZW5ndGggZHN0KSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLmJsaXRcIlxuICBlbHNlXG4gICAgQnl0ZXMudW5zYWZlX2JsaXQgc3JjLmJ1ZmZlciBzcmNvZmYgZHN0IGRzdG9mZiBsZW5cblxuXG5sZXQgbnRoIGIgb2ZzID1cbiAgaWYgb2ZzIDwgMCB8fCBvZnMgPj0gYi5wb3NpdGlvbiB0aGVuXG4gICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5udGhcIlxuICBlbHNlIEJ5dGVzLnVuc2FmZV9nZXQgYi5idWZmZXIgb2ZzXG5cblxubGV0IGxlbmd0aCBiID0gYi5wb3NpdGlvblxuXG5sZXQgY2xlYXIgYiA9IGIucG9zaXRpb24gPC0gMFxuXG5sZXQgcmVzZXQgYiA9XG4gIGIucG9zaXRpb24gPC0gMDtcbiAgYi5idWZmZXIgPC0gYi5pbml0aWFsX2J1ZmZlcjtcbiAgYi5sZW5ndGggPC0gQnl0ZXMubGVuZ3RoIGIuYnVmZmVyXG5cbigqIFtyZXNpemUgYiBtb3JlXSBlbnN1cmVzIHRoYXQgW2IucG9zaXRpb24gKyBtb3JlIDw9IGIubGVuZ3RoXSBob2xkc1xuICAgYnkgZHluYW1pY2FsbHkgZXh0ZW5kaW5nIFtiLmJ1ZmZlcl0gaWYgbmVjZXNzYXJ5IC0tIGFuZCB0aHVzXG4gICBpbmNyZWFzaW5nIFtiLmxlbmd0aF0uXG5cbiAgIEluIHBhcnRpY3VsYXIsIGFmdGVyIFtyZXNpemUgYiBtb3JlXSBpcyBjYWxsZWQsIGEgZGlyZWN0IGFjY2VzcyBvZlxuICAgc2l6ZSBbbW9yZV0gYXQgW2IucG9zaXRpb25dIHdpbGwgYWx3YXlzIGJlIGluLWJvdW5kcywgc28gdGhhdFxuICAgKHVuc2FmZV97Z2V0LHNldH0pIG1heSBiZSB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbiopXG5sZXQgcmVzaXplIGIgbW9yZSA9XG4gIGxldCBvbGRfcG9zID0gYi5wb3NpdGlvbiBpblxuICBsZXQgb2xkX2xlbiA9IGIubGVuZ3RoIGluXG4gIGxldCBuZXdfbGVuID0gcmVmIG9sZF9sZW4gaW5cbiAgd2hpbGUgb2xkX3BvcyArIG1vcmUgPiAhbmV3X2xlbiBkbyBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiBkb25lO1xuICBpZiAhbmV3X2xlbiA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuIGJlZ2luXG4gICAgaWYgb2xkX3BvcyArIG1vcmUgPD0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgdGhlbiBuZXdfbGVuIDo9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgIGVsc2UgZmFpbHdpdGggXCJCdWZmZXIuYWRkOiBjYW5ub3QgZ3JvdyBidWZmZXJcIlxuICBlbmQ7XG4gIGxldCBuZXdfYnVmZmVyID0gQnl0ZXMuY3JlYXRlICFuZXdfbGVuIGluXG4gICgqIFBSIzYxNDg6IGxldCdzIGtlZXAgdXNpbmcgW2JsaXRdIHJhdGhlciB0aGFuIFt1bnNhZmVfYmxpdF0gaW5cbiAgICAgdGhpcyB0cmlja3kgZnVuY3Rpb24gdGhhdCBpcyBzbG93IGFueXdheS4gKilcbiAgQnl0ZXMuYmxpdCBiLmJ1ZmZlciAwIG5ld19idWZmZXIgMCBiLnBvc2l0aW9uO1xuICBiLmJ1ZmZlciA8LSBuZXdfYnVmZmVyO1xuICBiLmxlbmd0aCA8LSAhbmV3X2xlbjtcbiAgYXNzZXJ0IChiLnBvc2l0aW9uICsgbW9yZSA8PSBiLmxlbmd0aCk7XG4gIGFzc2VydCAob2xkX3BvcyArIG1vcmUgPD0gYi5sZW5ndGgpO1xuICAoKVxuICAoKiBOb3RlOiB0aGVyZSBhcmUgdmFyaW91cyBzaXR1YXRpb25zIChwcmVlbXB0aXZlIHRocmVhZHMsIHNpZ25hbHMgYW5kXG4gICAgIGdjIGZpbmFsaXplcnMpIHdoZXJlIE9DYW1sIGNvZGUgbWF5IGJlIHJ1biBhc3luY2hyb25vdXNseTsgaW5cbiAgICAgcGFydGljdWxhciwgdGhlcmUgbWF5IGJlIGEgcmFjZSB3aXRoIGFub3RoZXIgdXNlciBvZiBbYl0sIGNoYW5naW5nXG4gICAgIGl0cyBtdXRhYmxlIGZpZWxkcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBbcmVzaXplXSBjYWxsLiBUaGUgQnVmZmVyXG4gICAgIG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIGFueSBjb3JyZWN0bmVzcyBndWFyYW50ZWUgaWYgdGhhdCBoYXBwZW5zLFxuICAgICBidXQgd2UgbXVzdCBzdGlsbCBlbnN1cmUgdGhhdCB0aGUgZGF0YXN0cnVjdHVyZSBpbnZhcmlhbnRzIGhvbGQgZm9yXG4gICAgIG1lbW9yeS1zYWZldHkgLS0gYXMgd2UgcGxhbiB0byB1c2UgW3Vuc2FmZV97Z2V0LHNldH1dLlxuXG4gICAgIFRoZXJlIGFyZSB0d28gcG90ZW50aWFsIGFsbG9jYXRpb24gcG9pbnRzIGluIHRoaXMgZnVuY3Rpb24sXG4gICAgIFtyZWZdIGFuZCBbQnl0ZXMuY3JlYXRlXSwgYnV0IGFsbCByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBmaWVsZHNcbiAgICAgb2YgW2JdIGhhcHBlbiBiZWZvcmUgYm90aCBvZiB0aGVtIG9yIGFmdGVyIGJvdGggb2YgdGhlbS5cblxuICAgICBXZSB0aGVyZWZvcmUgYXNzdW1lIHRoYXQgW2IucG9zaXRpb25dIG1heSBjaGFuZ2UgYXQgdGhlc2UgYWxsb2NhdGlvbnMsXG4gICAgIGFuZCBjaGVjayB0aGF0IHRoZSBbYi5wb3NpdGlvbiArIG1vcmUgPD0gYi5sZW5ndGhdIHBvc3Rjb25kaXRpb25cbiAgICAgaG9sZHMgZm9yIGJvdGggdmFsdWVzIG9mIFtiLnBvc2l0aW9uXSwgYmVmb3JlIG9yIGFmdGVyIHRoZSBmdW5jdGlvblxuICAgICBpcyBjYWxsZWQuIE1vcmUgcHJlY2lzZWx5LCB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgbXVzdCBob2xkIGlmIHRoZVxuICAgICBmdW5jdGlvbiByZXR1cm5zIGNvcnJlY3RseSwgaW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsIGJ1ZmZlciBpbnZhcmlhbnRzOlxuICAgICAtIFtvbGQoYi5wb3NpdGlvbikgKyBtb3JlIDw9IG5ldyhiLmxlbmd0aCldXG4gICAgIC0gW25ldyhiLnBvc2l0aW9uKSArIG1vcmUgPD0gbmV3KGIubGVuZ3RoKV1cbiAgICAgLSBbb2xkKGIubGVuZ3RoKSA8PSBuZXcoYi5sZW5ndGgpXVxuXG4gICAgIE5vdGU6IFtiLnBvc2l0aW9uICsgbW9yZSA8PSBvbGQoYi5sZW5ndGgpXSBkb2VzICpub3QqXG4gICAgIGhvbGQgaW4gZ2VuZXJhbCwgYXMgaXQgaXMgcHJlY2lzZWx5IHRoZSBjYXNlIHdoZXJlIHlvdSBuZWVkXG4gICAgIHRvIGNhbGwgW3Jlc2l6ZV0gdG8gaW5jcmVhc2UgW2IubGVuZ3RoXS5cblxuICAgICBOb3RlOiBbYXNzZXJ0XSBhYm92ZSBkb2VzIG5vdCBtZWFuIHRoYXQgd2Uga25vdyB0aGUgY29uZGl0aW9uc1xuICAgICBhbHdheXMgaG9sZCwgYnV0IHRoYXQgdGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gY29ycmVjdGx5XG4gICAgIG9ubHkgaWYgdGhleSBob2xkLlxuXG4gICAgIE5vdGU6IHRoZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgZG9lcyBub3QgbmVlZFxuICAgICB0byBiZSBjaGVja2VkIHdpdGggdGhpcyBsZXZlbCBvZiBzY3J1dGlueSwgZ2l2ZW4gdGhhdCB0aGV5XG4gICAgIHJlYWQvd3JpdGUgdGhlIGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBjaGVja2luZyB0aGF0XG4gICAgIFtiLnBvc2l0aW9uICsgbW9yZSA8PSBiLmxlbmd0aF0gaG9sZCBvciBjYWxsaW5nIFtyZXNpemVdLlxuICAqKVxuXG5sZXQgYWRkX2NoYXIgYiBjID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgMTtcbiAgQnl0ZXMudW5zYWZlX3NldCBiLmJ1ZmZlciBwb3MgYztcbiAgYi5wb3NpdGlvbiA8LSBwb3MgKyAxXG5cbmxldCB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXggPSA0XG5sZXQgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCA9IDRcblxubGV0IHJlYyBhZGRfdXRmXzhfdWNoYXIgYiB1ID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgdWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfOF91Y2hhciBiLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfOF91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IHJlYyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1ID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDtcbiAgbGV0IG4gPSBCeXRlcy5zZXRfdXRmXzE2YmVfdWNoYXIgYi5idWZmZXIgcG9zIHUgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiAocmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl8xNmJlX3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZsZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZsZV91Y2hhciBiLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2bGVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCBhZGRfc3Vic3RyaW5nIGIgcyBvZmZzZXQgbGVuID1cbiAgaWYgb2Zmc2V0IDwgMCB8fCBsZW4gPCAwIHx8IG9mZnNldCA+IFN0cmluZy5sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLmFkZF9zdWJzdHJpbmcvYWRkX3N1YmJ5dGVzXCI7XG4gIGxldCBuZXdfcG9zaXRpb24gPSBiLnBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyBvZmZzZXQgYi5idWZmZXIgYi5wb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfc3ViYnl0ZXMgYiBzIG9mZnNldCBsZW4gPVxuICBhZGRfc3Vic3RyaW5nIGIgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcykgb2Zmc2V0IGxlblxuXG5sZXQgYWRkX3N0cmluZyBiIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBiLnBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyAwIGIuYnVmZmVyIGIucG9zaXRpb24gbGVuO1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2J5dGVzIGIgcyA9IGFkZF9zdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKVxuXG5sZXQgYWRkX2J1ZmZlciBiIGJzID1cbiAgYWRkX3N1YmJ5dGVzIGIgYnMuYnVmZmVyIDAgYnMucG9zaXRpb25cblxuKCogdGhpcyAocHJpdmF0ZSkgZnVuY3Rpb24gY291bGQgbW92ZSBpbnRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG5sZXQgcmVhbGx5X2lucHV0X3VwX3RvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWQgPVxuICAgIGlmIHRvX3JlYWQgPSAwIHRoZW4gYWxyZWFkeV9yZWFkXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBpbnB1dCBpYyBidWYgb2ZzIHRvX3JlYWQgaW5cbiAgICAgIGlmIHIgPSAwIHRoZW4gYWxyZWFkeV9yZWFkXG4gICAgICBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBhbHJlYWR5X3JlYWQgPSBhbHJlYWR5X3JlYWQgKyByIGluXG4gICAgICAgIGxldCBvZnMgPSBvZnMgKyByIGluXG4gICAgICAgIGxldCB0b19yZWFkID0gdG9fcmVhZCAtIHIgaW5cbiAgICAgICAgbG9vcCBpYyBidWYgfmFscmVhZHlfcmVhZCB+b2ZzIH50b19yZWFkXG4gICAgICBlbmRcbiAgICBlbmRcbiAgaW4gbG9vcCBpYyBidWYgfmFscmVhZHlfcmVhZDowIH5vZnMgfnRvX3JlYWQ6bGVuXG5cblxubGV0IHVuc2FmZV9hZGRfY2hhbm5lbF91cF90byBiIGljIGxlbiA9XG4gIGlmIGIucG9zaXRpb24gKyBsZW4gPiBiLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIGxlbjtcbiAgbGV0IG4gPSByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYi5idWZmZXIgYi5wb3NpdGlvbiBsZW4gaW5cbiAgKCogVGhlIGFzc2VydGlvbiBiZWxvdyBtYXkgZmFpbCBpbiB3ZWlyZCBzY2VuYXJpbyB3aGVyZVxuICAgICB0aHJlYWRlZC9maW5hbGl6ZXIgY29kZSwgcnVuIGFzeW5jaHJvbm91c2x5IGR1cmluZyB0aGVcbiAgICAgW3JlYWxseV9pbnB1dF91cF90b10gY2FsbCwgcmFjZXMgb24gdGhlIGJ1ZmZlcjsgd2UgZG9uJ3QgZW5zdXJlXG4gICAgIGNvcnJlY3RuZXNzIGluIHRoaXMgY2FzZSwgYnV0IG5lZWQgdG8gcHJlc2VydmUgdGhlIGludmFyaWFudHMgZm9yXG4gICAgIG1lbW9yeS1zYWZldHkgKHNlZSBkaXNjdXNzaW9uIG9mIFtyZXNpemVdKS4gKilcbiAgYXNzZXJ0IChiLnBvc2l0aW9uICsgbiA8PSBiLmxlbmd0aCk7XG4gIGIucG9zaXRpb24gPC0gYi5wb3NpdGlvbiArIG47XG4gIG5cblxubGV0IGFkZF9jaGFubmVsIGIgaWMgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBsZW4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiAgICgqIFBSIzUwMDQgKilcbiAgICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5hZGRfY2hhbm5lbFwiO1xuICBsZXQgbiA9IHVuc2FmZV9hZGRfY2hhbm5lbF91cF90byBiIGljIGxlbiBpblxuICAoKiBJdCBpcyBpbnRlbnRpb25hbCB0aGF0IGEgY29uc3VtZXIgY2F0Y2hpbmcgRW5kX29mX2ZpbGVcbiAgICAgd2lsbCBzZWUgdGhlIGRhdGEgd3JpdHRlbiAoc2VlICM2NzE5LCAjNzEzNikuICopXG4gIGlmIG4gPCBsZW4gdGhlbiByYWlzZSBFbmRfb2ZfZmlsZTtcbiAgKClcblxubGV0IG91dHB1dF9idWZmZXIgb2MgYiA9XG4gIG91dHB1dCBvYyBiLmJ1ZmZlciAwIGIucG9zaXRpb25cblxubGV0IGNsb3NpbmcgPSBmdW5jdGlvblxuICB8ICcoJyAtPiAnKSdcbiAgfCAneycgLT4gJ30nXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuKCogb3BlbmluZyBhbmQgY2xvc2luZzogb3BlbiBhbmQgY2xvc2UgY2hhcmFjdGVycywgdHlwaWNhbGx5ICggYW5kIClcbiAgIGs6IGJhbGFuY2Ugb2Ygb3BlbmluZyBhbmQgY2xvc2luZyBjaGFyc1xuICAgczogdGhlIHN0cmluZyB3aGVyZSB3ZSBhcmUgc2VhcmNoaW5nXG4gICBzdGFydDogdGhlIGluZGV4IHdoZXJlIHdlIHN0YXJ0IHRoZSBzZWFyY2guICopXG5sZXQgYWR2YW5jZV90b19jbG9zaW5nIG9wZW5pbmcgY2xvc2luZyBrIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgayBpIGxpbSA9XG4gICAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICAgIGlmIHMuW2ldID0gb3BlbmluZyB0aGVuIGFkdmFuY2UgKGsgKyAxKSAoaSArIDEpIGxpbSBlbHNlXG4gICAgaWYgcy5baV0gPSBjbG9zaW5nIHRoZW5cbiAgICAgIGlmIGsgPSAwIHRoZW4gaSBlbHNlIGFkdmFuY2UgKGsgLSAxKSAoaSArIDEpIGxpbVxuICAgIGVsc2UgYWR2YW5jZSBrIChpICsgMSkgbGltIGluXG4gIGFkdmFuY2UgayBzdGFydCAoU3RyaW5nLmxlbmd0aCBzKVxuXG5sZXQgYWR2YW5jZV90b19ub25fYWxwaGEgcyBzdGFydCA9XG4gIGxldCByZWMgYWR2YW5jZSBpIGxpbSA9XG4gICAgaWYgaSA+PSBsaW0gdGhlbiBsaW0gZWxzZVxuICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICB8ICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyAtPiBhZHZhbmNlIChpICsgMSkgbGltXG4gICAgfCBfIC0+IGkgaW5cbiAgYWR2YW5jZSBzdGFydCAoU3RyaW5nLmxlbmd0aCBzKVxuXG4oKiBXZSBhcmUganVzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGlkZW50IGluIHMsIHN0YXJ0aW5nIGF0IHN0YXJ0LiAqKVxubGV0IGZpbmRfaWRlbnQgcyBzdGFydCBsaW0gPVxuICBpZiBzdGFydCA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBtYXRjaCBzLltzdGFydF0gd2l0aFxuICAoKiBQYXJlbnRoZXNpemVkIGlkZW50ID8gKilcbiAgfCAnKCcgfCAneycgYXMgYyAtPlxuICAgICBsZXQgbmV3X3N0YXJ0ID0gc3RhcnQgKyAxIGluXG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19jbG9zaW5nIGMgKGNsb3NpbmcgYykgMCBzIG5ld19zdGFydCBpblxuICAgICBTdHJpbmcuc3ViIHMgbmV3X3N0YXJ0IChzdG9wIC0gc3RhcnQgLSAxKSwgc3RvcCArIDFcbiAgKCogUmVndWxhciBpZGVudCAqKVxuICB8IF8gLT5cbiAgICAgbGV0IHN0b3AgPSBhZHZhbmNlX3RvX25vbl9hbHBoYSBzIChzdGFydCArIDEpIGluXG4gICAgIFN0cmluZy5zdWIgcyBzdGFydCAoc3RvcCAtIHN0YXJ0KSwgc3RvcFxuXG4oKiBTdWJzdGl0dXRlICRpZGVudCwgJChpZGVudCksIG9yICR7aWRlbnR9IGluIHMsXG4gICAgYWNjb3JkaW5nIHRvIHRoZSBmdW5jdGlvbiBtYXBwaW5nIGYuICopXG5sZXQgYWRkX3N1YnN0aXR1dGUgYiBmIHMgPVxuICBsZXQgbGltID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgc3Vic3QgcHJldmlvdXMgaSA9XG4gICAgaWYgaSA8IGxpbSB0aGVuIGJlZ2luXG4gICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICB8ICckJyBhcyBjdXJyZW50IHdoZW4gcHJldmlvdXMgPSAnXFxcXCcgLT5cbiAgICAgICAgIGFkZF9jaGFyIGIgY3VycmVudDtcbiAgICAgICAgIHN1YnN0ICcgJyAoaSArIDEpXG4gICAgICB8ICckJyAtPlxuICAgICAgICAgbGV0IGogPSBpICsgMSBpblxuICAgICAgICAgbGV0IGlkZW50LCBuZXh0X2kgPSBmaW5kX2lkZW50IHMgaiBsaW0gaW5cbiAgICAgICAgIGFkZF9zdHJpbmcgYiAoZiBpZGVudCk7XG4gICAgICAgICBzdWJzdCAnICcgbmV4dF9pXG4gICAgICB8IGN1cnJlbnQgd2hlbiBwcmV2aW91cyA9PSAnXFxcXCcgLT5cbiAgICAgICAgIGFkZF9jaGFyIGIgJ1xcXFwnO1xuICAgICAgICAgYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgJyAnIChpICsgMSlcbiAgICAgIHwgJ1xcXFwnIGFzIGN1cnJlbnQgLT5cbiAgICAgICAgIHN1YnN0IGN1cnJlbnQgKGkgKyAxKVxuICAgICAgfCBjdXJyZW50IC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCBjdXJyZW50IChpICsgMSlcbiAgICBlbmQgZWxzZVxuICAgIGlmIHByZXZpb3VzID0gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBwcmV2aW91cyBpblxuICBzdWJzdCAnICcgMFxuXG5sZXQgdHJ1bmNhdGUgYiBsZW4gPVxuICAgIGlmIGxlbiA8IDAgfHwgbGVuID4gbGVuZ3RoIGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJCdWZmZXIudHJ1bmNhdGVcIlxuICAgIGVsc2VcbiAgICAgIGIucG9zaXRpb24gPC0gbGVuXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYiA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICgqIE5vdGUgdGhhdCBiLnBvc2l0aW9uIGlzIG5vdCBhIGNvbnN0YW50IGFuZCBjYW5ub3QgYmUgbGlmdGVkIG91dCBvZiBhdXggKilcbiAgICBpZiBpID49IGIucG9zaXRpb24gdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBCeXRlcy51bnNhZmVfZ2V0IGIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMudW5zYWZlX2dldCBiLmJ1ZmZlciBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgaW5cbiAgYXV4IDBcblxubGV0IGFkZF9zZXEgYiBzZXEgPSBTZXEuaXRlciAoYWRkX2NoYXIgYikgc2VxXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBiID0gY3JlYXRlIDMyIGluXG4gIGFkZF9zZXEgYiBpO1xuICBiXG5cbigqKiB7NiBCaW5hcnkgZW5jb2Rpbmcgb2YgaW50ZWdlcnN9ICopXG5cbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQxNiA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZ1XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50MzIgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MzJ1XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjR1XCJcbmV4dGVybmFsIHN3YXAxNiA6IGludCAtPiBpbnQgPSBcIiVic3dhcDE2XCJcbmV4dGVybmFsIHN3YXAzMiA6IGludDMyIC0+IGludDMyID0gXCIlYnN3YXBfaW50MzJcIlxuZXh0ZXJuYWwgc3dhcDY0IDogaW50NjQgLT4gaW50NjQgPSBcIiVic3dhcF9pbnQ2NFwiXG5cblxubGV0IGFkZF9pbnQ4IGIgeCA9XG4gIGxldCBuZXdfcG9zaXRpb24gPSBiLnBvc2l0aW9uICsgMSBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBiLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIDE7XG4gIHVuc2FmZV9zZXRfaW50OCBiLmJ1ZmZlciBiLnBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbmUgYiB4ID1cbiAgbGV0IG5ld19wb3NpdGlvbiA9IGIucG9zaXRpb24gKyAyIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgMjtcbiAgdW5zYWZlX3NldF9pbnQxNiBiLmJ1ZmZlciBiLnBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MzJfbmUgYiB4ID1cbiAgbGV0IG5ld19wb3NpdGlvbiA9IGIucG9zaXRpb24gKyA0IGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgNDtcbiAgdW5zYWZlX3NldF9pbnQzMiBiLmJ1ZmZlciBiLnBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50NjRfbmUgYiB4ID1cbiAgbGV0IG5ld19wb3NpdGlvbiA9IGIucG9zaXRpb24gKyA4IGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGIubGVuZ3RoIHRoZW4gcmVzaXplIGIgODtcbiAgdW5zYWZlX3NldF9pbnQ2NCBiLmJ1ZmZlciBiLnBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbGUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDE2X2JlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMTYgeClcblxubGV0IGFkZF9pbnQzMl9sZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MzJfYmUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAzMiB4KVxuXG5sZXQgYWRkX2ludDY0X2xlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQ2NF9iZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDY0IHgpXG5cbmxldCBhZGRfdWludDggPSBhZGRfaW50OFxubGV0IGFkZF91aW50MTZfbmUgPSBhZGRfaW50MTZfbmVcbmxldCBhZGRfdWludDE2X2xlID0gYWRkX2ludDE2X2xlXG5sZXQgYWRkX3VpbnQxNl9iZSA9IGFkZF9pbnQxNl9iZVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBYYXZpZXIgTGVyb3kgYW5kIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxubGV0IGtmcHJpbnRmIGsgbyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgbyBhY2M7IGsgbykgRW5kX29mX2FjYyBmbXRcbmxldCBrYnByaW50ZiBrIGIgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBidWZwdXRfYWNjIGIgYWNjOyBrIGIpIEVuZF9vZl9hY2MgZm10XG5sZXQgaWtmcHJpbnRmIGsgb2MgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBvYyBmbXRcbmxldCBpa2JwcmludGYgPSBpa2ZwcmludGZcblxubGV0IGZwcmludGYgb2MgZm10ID0ga2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGJwcmludGYgYiBmbXQgPSBrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBpZnByaW50ZiBvYyBmbXQgPSBpa2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGlicHJpbnRmIGIgZm10ID0gaWticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IHByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZG91dCBmbXRcbmxldCBlcHJpbnRmIGZtdCA9IGZwcmludGYgc3RkZXJyIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBrJyBhY2MgPVxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gICAgc3RycHV0X2FjYyBidWYgYWNjO1xuICAgIGsgKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10XG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAtPiBzKSBmbXRcblxubGV0IGtwcmludGYgPSBrc3ByaW50ZlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGtleSA9IHN0cmluZ1xudHlwZSBkb2MgPSBzdHJpbmdcbnR5cGUgdXNhZ2VfbXNnID0gc3RyaW5nXG50eXBlIGFub25fZnVuID0gKHN0cmluZyAtPiB1bml0KVxuXG50eXBlIHNwZWMgPVxuICB8IFVuaXQgb2YgKHVuaXQgLT4gdW5pdCkgICAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdW5pdCBhcmd1bWVudCAqKVxuICB8IEJvb2wgb2YgKGJvb2wgLT4gdW5pdCkgICAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBib29sIGFyZ3VtZW50ICopXG4gIHwgU2V0IG9mIGJvb2wgcmVmICAgICAgICAgICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gdHJ1ZSAqKVxuICB8IENsZWFyIG9mIGJvb2wgcmVmICAgICAgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIGZhbHNlICopXG4gIHwgU3RyaW5nIG9mIChzdHJpbmcgLT4gdW5pdCkgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIHN0cmluZyBhcmd1bWVudCAqKVxuICB8IFNldF9zdHJpbmcgb2Ygc3RyaW5nIHJlZiAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdHJpbmcgYXJndW1lbnQgKilcbiAgfCBJbnQgb2YgKGludCAtPiB1bml0KSAgICAgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGFuIGludCBhcmd1bWVudCAqKVxuICB8IFNldF9pbnQgb2YgaW50IHJlZiAgICAgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnQgYXJndW1lbnQgKilcbiAgfCBGbG9hdCBvZiAoZmxvYXQgLT4gdW5pdCkgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGEgZmxvYXQgYXJndW1lbnQgKilcbiAgfCBTZXRfZmxvYXQgb2YgZmxvYXQgcmVmICAgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmxvYXQgYXJndW1lbnQgKilcbiAgfCBUdXBsZSBvZiBzcGVjIGxpc3QgICAgICAgICAoKiBUYWtlIHNldmVyYWwgYXJndW1lbnRzIGFjY29yZGluZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjIGxpc3QgKilcbiAgfCBTeW1ib2wgb2Ygc3RyaW5nIGxpc3QgKiAoc3RyaW5nIC0+IHVuaXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVGFrZSBvbmUgb2YgdGhlIHN5bWJvbHMgYXMgYXJndW1lbnQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc3ltYm9sLiAqKVxuICB8IFJlc3Qgb2YgKHN0cmluZyAtPiB1bml0KSAgICgqIFN0b3AgaW50ZXJwcmV0aW5nIGtleXdvcmRzIGFuZCBjYWxsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggZWFjaCByZW1haW5pbmcgYXJndW1lbnQgKilcbiAgfCBSZXN0X2FsbCBvZiAoc3RyaW5nIGxpc3QgLT4gdW5pdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBTdG9wIGludGVycHJldGluZyBrZXl3b3JkcyBhbmQgY2FsbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aXRoIGFsbCByZW1haW5pbmcgYXJndW1lbnRzLiAqKVxuICB8IEV4cGFuZCBvZiAoc3RyaW5nIC0+IHN0cmluZyBhcnJheSkgKCogSWYgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG9mIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW1wiLWZvb1wiOyBcImFyZ1wiXSBAIHJlc3RdIHdoZXJlIFwiZm9vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJlZ2lzdGVyZWQgYXMgW0V4cGFuZCBmXSwgdGhlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBbZiBcImFyZ1wiIEAgcmVzdF0gYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuIE9ubHkgYWxsb3dlZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljXS4gKilcblxuZXhjZXB0aW9uIEJhZCBvZiBzdHJpbmdcbmV4Y2VwdGlvbiBIZWxwIG9mIHN0cmluZ1xuXG50eXBlIGVycm9yID1cbiAgfCBVbmtub3duIG9mIHN0cmluZ1xuICB8IFdyb25nIG9mIHN0cmluZyAqIHN0cmluZyAqIHN0cmluZyAgKCogb3B0aW9uLCBhY3R1YWwsIGV4cGVjdGVkICopXG4gIHwgTWlzc2luZyBvZiBzdHJpbmdcbiAgfCBNZXNzYWdlIG9mIHN0cmluZ1xuXG5leGNlcHRpb24gU3RvcCBvZiBlcnJvciAoKiB1c2VkIGludGVybmFsbHkgKilcblxub3BlbiBQcmludGZcblxubGV0IHJlYyBhc3NvYzMgeCBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgKHkxLCB5MiwgXykgOjogXyB3aGVuIHkxID0geCAtPiB5MlxuICB8IF8gOjogdCAtPiBhc3NvYzMgeCB0XG5cblxubGV0IHNwbGl0IHMgPVxuICBsZXQgaSA9IFN0cmluZy5pbmRleCBzICc9JyBpblxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIFN0cmluZy5zdWIgcyAwIGksIFN0cmluZy5zdWIgcyAoaSsxKSAobGVuLShpKzEpKVxuXG5cbmxldCBtYWtlX3N5bWxpc3QgcHJlZml4IHNlcCBzdWZmaXggbCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFwiPG5vbmU+XCJcbiAgfCBoOjp0IC0+IChMaXN0LmZvbGRfbGVmdCAoZnVuIHggeSAtPiB4IF4gc2VwIF4geSkgKHByZWZpeCBeIGgpIHQpIF4gc3VmZml4XG5cblxubGV0IHByaW50X3NwZWMgYnVmIChrZXksIHNwZWMsIGRvYykgPVxuICBpZiBTdHJpbmcubGVuZ3RoIGRvYyA+IDAgdGhlblxuICAgIG1hdGNoIHNwZWMgd2l0aFxuICAgIHwgU3ltYm9sIChsLCBfKSAtPlxuICAgICAgICBicHJpbnRmIGJ1ZiBcIiAgJXMgJXMlc1xcblwiIGtleSAobWFrZV9zeW1saXN0IFwie1wiIFwifFwiIFwifVwiIGwpIGRvY1xuICAgIHwgXyAtPlxuICAgICAgICBicHJpbnRmIGJ1ZiBcIiAgJXMgJXNcXG5cIiBrZXkgZG9jXG5cblxubGV0IGhlbHBfYWN0aW9uICgpID0gcmFpc2UgKFN0b3AgKFVua25vd24gXCItaGVscFwiKSlcblxubGV0IGFkZF9oZWxwIHNwZWNsaXN0ID1cbiAgbGV0IGFkZDEgPVxuICAgIHRyeSBpZ25vcmUgKGFzc29jMyBcIi1oZWxwXCIgc3BlY2xpc3QpOyBbXVxuICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgICAgICBbXCItaGVscFwiLCBVbml0IGhlbHBfYWN0aW9uLCBcIiBEaXNwbGF5IHRoaXMgbGlzdCBvZiBvcHRpb25zXCJdXG4gIGFuZCBhZGQyID1cbiAgICB0cnkgaWdub3JlIChhc3NvYzMgXCItLWhlbHBcIiBzcGVjbGlzdCk7IFtdXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICAgIFtcIi0taGVscFwiLCBVbml0IGhlbHBfYWN0aW9uLCBcIiBEaXNwbGF5IHRoaXMgbGlzdCBvZiBvcHRpb25zXCJdXG4gIGluXG4gIHNwZWNsaXN0IEAgKGFkZDEgQCBhZGQyKVxuXG5cbmxldCB1c2FnZV9iIGJ1ZiBzcGVjbGlzdCBlcnJtc2cgPVxuICBicHJpbnRmIGJ1ZiBcIiVzXFxuXCIgZXJybXNnO1xuICBMaXN0Lml0ZXIgKHByaW50X3NwZWMgYnVmKSAoYWRkX2hlbHAgc3BlY2xpc3QpXG5cblxubGV0IHVzYWdlX3N0cmluZyBzcGVjbGlzdCBlcnJtc2cgPVxuICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgMjAwIGluXG4gIHVzYWdlX2IgYiBzcGVjbGlzdCBlcnJtc2c7XG4gIEJ1ZmZlci5jb250ZW50cyBiXG5cblxubGV0IHVzYWdlIHNwZWNsaXN0IGVycm1zZyA9XG4gIGVwcmludGYgXCIlc1wiICh1c2FnZV9zdHJpbmcgc3BlY2xpc3QgZXJybXNnKVxuXG5cbmxldCBjdXJyZW50ID0gcmVmIDBcblxubGV0IGJvb2xfb2Zfc3RyaW5nX29wdCB4ID1cbiAgdHJ5IFNvbWUgKGJvb2xfb2Zfc3RyaW5nIHgpXG4gIHdpdGggSW52YWxpZF9hcmd1bWVudCBfIC0+IE5vbmVcblxubGV0IGludF9vZl9zdHJpbmdfb3B0IHggPVxuICB0cnkgU29tZSAoaW50X29mX3N0cmluZyB4KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmbG9hdF9vZl9zdHJpbmdfb3B0IHggPVxuICB0cnkgU29tZSAoZmxvYXRfb2Zfc3RyaW5nIHgpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxubGV0IHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljX2F1eCBhbGxvd19leHBhbmQgY3VycmVudCBhcmd2IHNwZWNsaXN0IGFub25mdW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnID1cbiAgbGV0IGluaXRwb3MgPSAhY3VycmVudCBpblxuICBsZXQgY29udmVydF9lcnJvciBlcnJvciA9XG4gICAgKCogY29udmVydCBhbiBpbnRlcm5hbCBlcnJvciB0byBhIEJhZC9IZWxwIGV4Y2VwdGlvblxuICAgICAgICpvciogYWRkIHRoZSBwcm9ncmFtIG5hbWUgYXMgYSBwcmVmaXggYW5kIHRoZSB1c2FnZSBtZXNzYWdlIGFzIGEgc3VmZml4XG4gICAgICAgdG8gYW4gdXNlci1yYWlzZWQgQmFkIGV4Y2VwdGlvbi5cbiAgICAqKVxuICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAyMDAgaW5cbiAgICBsZXQgcHJvZ25hbWUgPVxuICAgICAgaWYgaW5pdHBvcyA8IChBcnJheS5sZW5ndGggIWFyZ3YpIHRoZW4gIWFyZ3YuKGluaXRwb3MpIGVsc2UgXCIoPylcIiBpblxuICAgIGJlZ2luIG1hdGNoIGVycm9yIHdpdGhcbiAgICAgIHwgVW5rbm93biBcIi1oZWxwXCIgLT4gKClcbiAgICAgIHwgVW5rbm93biBcIi0taGVscFwiIC0+ICgpXG4gICAgICB8IFVua25vd24gcyAtPlxuICAgICAgICAgIGJwcmludGYgYiBcIiVzOiB1bmtub3duIG9wdGlvbiAnJXMnLlxcblwiIHByb2duYW1lIHNcbiAgICAgIHwgTWlzc2luZyBzIC0+XG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6IG9wdGlvbiAnJXMnIG5lZWRzIGFuIGFyZ3VtZW50LlxcblwiIHByb2duYW1lIHNcbiAgICAgIHwgV3JvbmcgKG9wdCwgYXJnLCBleHBlY3RlZCkgLT5cbiAgICAgICAgICBicHJpbnRmIGIgXCIlczogd3JvbmcgYXJndW1lbnQgJyVzJzsgb3B0aW9uICclcycgZXhwZWN0cyAlcy5cXG5cIlxuICAgICAgICAgICAgICAgICAgcHJvZ25hbWUgYXJnIG9wdCBleHBlY3RlZFxuICAgICAgfCBNZXNzYWdlIHMgLT4gKCogdXNlciBlcnJvciBtZXNzYWdlICopXG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6ICVzLlxcblwiIHByb2duYW1lIHNcbiAgICBlbmQ7XG4gICAgdXNhZ2VfYiBiICFzcGVjbGlzdCBlcnJtc2c7XG4gICAgaWYgZXJyb3IgPSBVbmtub3duIFwiLWhlbHBcIiB8fCBlcnJvciA9IFVua25vd24gXCItLWhlbHBcIlxuICAgIHRoZW4gSGVscCAoQnVmZmVyLmNvbnRlbnRzIGIpXG4gICAgZWxzZSBCYWQgKEJ1ZmZlci5jb250ZW50cyBiKVxuICBpblxuICBpbmNyIGN1cnJlbnQ7XG4gIHdoaWxlICFjdXJyZW50IDwgKEFycmF5Lmxlbmd0aCAhYXJndikgZG9cbiAgICBiZWdpbiB0cnlcbiAgICAgIGxldCBzID0gIWFyZ3YuKCFjdXJyZW50KSBpblxuICAgICAgaWYgU3RyaW5nLmxlbmd0aCBzID49IDEgJiYgcy5bMF0gPSAnLScgdGhlbiBiZWdpblxuICAgICAgICBsZXQgYWN0aW9uLCBmb2xsb3cgPVxuICAgICAgICAgIHRyeSBhc3NvYzMgcyAhc3BlY2xpc3QsIE5vbmVcbiAgICAgICAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICAgIHRyeVxuICAgICAgICAgICAgbGV0IGtleXdvcmQsIGFyZyA9IHNwbGl0IHMgaW5cbiAgICAgICAgICAgIGFzc29jMyBrZXl3b3JkICFzcGVjbGlzdCwgU29tZSBhcmdcbiAgICAgICAgICB3aXRoIE5vdF9mb3VuZCAtPiByYWlzZSAoU3RvcCAoVW5rbm93biBzKSlcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5vX2FyZyAoKSA9XG4gICAgICAgICAgbWF0Y2ggZm9sbG93IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgYXJnIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcIm5vIGFyZ3VtZW50XCIpKSkgaW5cbiAgICAgICAgbGV0IGdldF9hcmcgKCkgPVxuICAgICAgICAgIG1hdGNoIGZvbGxvdyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgIGlmICFjdXJyZW50ICsgMSA8IChBcnJheS5sZW5ndGggIWFyZ3YpIHRoZW4gIWFyZ3YuKCFjdXJyZW50ICsgMSlcbiAgICAgICAgICAgICAgZWxzZSByYWlzZSAoU3RvcCAoTWlzc2luZyBzKSlcbiAgICAgICAgICB8IFNvbWUgYXJnIC0+IGFyZ1xuICAgICAgICBpblxuICAgICAgICBsZXQgY29uc3VtZV9hcmcgKCkgPVxuICAgICAgICAgIG1hdGNoIGZvbGxvdyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGluY3IgY3VycmVudFxuICAgICAgICAgIHwgU29tZSBfIC0+ICgpXG4gICAgICAgIGluXG4gICAgICAgIGxldCByZWMgdHJlYXRfYWN0aW9uID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbml0IGYgLT4gbm9fYXJnICgpOyBmICgpO1xuICAgICAgICB8IEJvb2wgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGJvb2xfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImEgYm9vbGVhblwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgcyAtPiBmIHNcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFNldCByIC0+IG5vX2FyZyAoKTsgciA6PSB0cnVlO1xuICAgICAgICB8IENsZWFyIHIgLT4gbm9fYXJnICgpOyByIDo9IGZhbHNlO1xuICAgICAgICB8IFN0cmluZyBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgZiBhcmc7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBTeW1ib2wgKHN5bWIsIGYpIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgaWYgTGlzdC5tZW0gYXJnIHN5bWIgdGhlbiBiZWdpblxuICAgICAgICAgICAgICBmIGFyZztcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgICByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJvbmUgb2Y6IFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIChtYWtlX3N5bWxpc3QgXCJcIiBcIiBcIiBcIlwiIHN5bWIpKSkpXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfCBTZXRfc3RyaW5nIHIgLT5cbiAgICAgICAgICAgIHIgOj0gZ2V0X2FyZyAoKTtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IEludCBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggaW50X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhbiBpbnRlZ2VyXCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IGYgeFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU2V0X2ludCByIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggaW50X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhbiBpbnRlZ2VyXCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IHIgOj0geFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgRmxvYXQgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGZsb2F0X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhIGZsb2F0XCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IGYgeFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU2V0X2Zsb2F0IHIgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYSBmbG9hdFwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgeCAtPiByIDo9IHhcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFR1cGxlIHNwZWNzIC0+XG4gICAgICAgICAgICBub19hcmcgKCk7XG4gICAgICAgICAgICBMaXN0Lml0ZXIgdHJlYXRfYWN0aW9uIHNwZWNzO1xuICAgICAgICB8IFJlc3QgZiAtPlxuICAgICAgICAgICAgbm9fYXJnICgpO1xuICAgICAgICAgICAgd2hpbGUgIWN1cnJlbnQgPCAoQXJyYXkubGVuZ3RoICFhcmd2KSAtIDEgZG9cbiAgICAgICAgICAgICAgZiAhYXJndi4oIWN1cnJlbnQgKyAxKTtcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBkb25lO1xuICAgICAgICB8IFJlc3RfYWxsIGYgLT5cbiAgICAgICAgICAgIG5vX2FyZyAoKTtcbiAgICAgICAgICAgIGxldCBhY2MgPSByZWYgW10gaW5cbiAgICAgICAgICAgIHdoaWxlICFjdXJyZW50IDwgQXJyYXkubGVuZ3RoICFhcmd2IC0gMSBkb1xuICAgICAgICAgICAgICBhY2MgOj0gIWFyZ3YuKCFjdXJyZW50ICsgMSkgOjogIWFjYztcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBkb25lO1xuICAgICAgICAgICAgZiAoTGlzdC5yZXYgIWFjYylcbiAgICAgICAgfCBFeHBhbmQgZiAtPlxuICAgICAgICAgICAgaWYgbm90IGFsbG93X2V4cGFuZCB0aGVuXG4gICAgICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiQXJnLkV4cGFuZCBpcyBpcyBvbmx5IGFsbG93ZWQgd2l0aCBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLnBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljXCIpO1xuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGxldCBuZXdhcmcgPSBmIGFyZyBpblxuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gQXJyYXkuc3ViICFhcmd2IDAgKCFjdXJyZW50ICsgMSlcbiAgICAgICAgICAgIGFuZCBhZnRlciA9XG4gICAgICAgICAgICAgIEFycmF5LnN1YiAhYXJndiAoIWN1cnJlbnQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJheS5sZW5ndGggIWFyZ3YpIC0gIWN1cnJlbnQgLSAxKSBpblxuICAgICAgICAgICAgYXJndjo9IEFycmF5LmNvbmNhdCBbYmVmb3JlO25ld2FyZzthZnRlcl07XG4gICAgICAgIGluXG4gICAgICAgIHRyZWF0X2FjdGlvbiBhY3Rpb24gZW5kXG4gICAgICBlbHNlIGFub25mdW4gc1xuICAgIHdpdGggfCBCYWQgbSAtPiByYWlzZSAoY29udmVydF9lcnJvciAoTWVzc2FnZSBtKSk7XG4gICAgICAgICB8IFN0b3AgZSAtPiByYWlzZSAoY29udmVydF9lcnJvciBlKTtcbiAgICBlbmQ7XG4gICAgaW5jciBjdXJyZW50XG4gIGRvbmVcblxubGV0IHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljIGN1cnJlbnQgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZyA9XG4gIHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljX2F1eCB0cnVlIGN1cnJlbnQgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZ1xuXG5sZXQgcGFyc2VfYXJndl9keW5hbWljID8oY3VycmVudD1jdXJyZW50KSBhcmd2IHNwZWNsaXN0IGFub25mdW4gZXJybXNnID1cbiAgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNfYXV4IGZhbHNlIGN1cnJlbnQgKHJlZiBhcmd2KSBzcGVjbGlzdCBhbm9uZnVuXG4gICAgZXJybXNnXG5cblxubGV0IHBhcnNlX2FyZ3YgPyhjdXJyZW50PWN1cnJlbnQpIGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1biBlcnJtc2cgPVxuICBwYXJzZV9hcmd2X2R5bmFtaWMgfmN1cnJlbnQ6Y3VycmVudCBhcmd2IChyZWYgc3BlY2xpc3QpIGFub25mdW4gZXJybXNnXG5cblxubGV0IHBhcnNlIGwgZiBtc2cgPVxuICB0cnlcbiAgICBwYXJzZV9hcmd2IFN5cy5hcmd2IGwgZiBtc2dcbiAgd2l0aFxuICB8IEJhZCBtc2cgLT4gZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDJcbiAgfCBIZWxwIG1zZyAtPiBwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG5cblxubGV0IHBhcnNlX2R5bmFtaWMgbCBmIG1zZyA9XG4gIHRyeVxuICAgIHBhcnNlX2FyZ3ZfZHluYW1pYyBTeXMuYXJndiBsIGYgbXNnXG4gIHdpdGhcbiAgfCBCYWQgbXNnIC0+IGVwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAyXG4gIHwgSGVscCBtc2cgLT4gcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMFxuXG5sZXQgcGFyc2VfZXhwYW5kIGwgZiBtc2cgPVxuICB0cnlcbiAgICBsZXQgYXJndiA9IHJlZiBTeXMuYXJndiBpblxuICAgIGxldCBzcGVjID0gcmVmIGwgaW5cbiAgICBsZXQgY3VycmVudCA9IHJlZiAoIWN1cnJlbnQpIGluXG4gICAgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWMgY3VycmVudCBhcmd2IHNwZWMgZiBtc2dcbiAgd2l0aFxuICB8IEJhZCBtc2cgLT4gZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDJcbiAgfCBIZWxwIG1zZyAtPiBwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG5cblxubGV0IHNlY29uZF93b3JkIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBuID1cbiAgICBpZiBuID49IGxlbiB0aGVuIGxlblxuICAgIGVsc2UgaWYgcy5bbl0gPSAnICcgdGhlbiBsb29wIChuKzEpXG4gICAgZWxzZSBuXG4gIGluXG4gIG1hdGNoIFN0cmluZy5pbmRleCBzICdcXHQnIHdpdGhcbiAgfCBuIC0+IGxvb3AgKG4rMSlcbiAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgICBiZWdpbiBtYXRjaCBTdHJpbmcuaW5kZXggcyAnICcgd2l0aFxuICAgICAgfCBuIC0+IGxvb3AgKG4rMSlcbiAgICAgIHwgZXhjZXB0aW9uIE5vdF9mb3VuZCAtPiBsZW5cbiAgICAgIGVuZFxuXG5cbmxldCBtYXhfYXJnX2xlbiBjdXIgKGt3ZCwgc3BlYywgZG9jKSA9XG4gIG1hdGNoIHNwZWMgd2l0aFxuICB8IFN5bWJvbCBfIC0+IEludC5tYXggY3VyIChTdHJpbmcubGVuZ3RoIGt3ZClcbiAgfCBfIC0+IEludC5tYXggY3VyIChTdHJpbmcubGVuZ3RoIGt3ZCArIHNlY29uZF93b3JkIGRvYylcblxuXG5sZXQgcmVwbGFjZV9sZWFkaW5nX3RhYiBzID1cbiAgbGV0IHNlZW4gPSByZWYgZmFsc2UgaW5cbiAgU3RyaW5nLm1hcCAoZnVuY3Rpb24gJ1xcdCcgd2hlbiBub3QgIXNlZW4gLT4gc2VlbiA6PSB0cnVlOyAnICcgfCBjIC0+IGMpIHNcblxubGV0IGFkZF9wYWRkaW5nIGxlbiBrc2QgPVxuICBtYXRjaCBrc2Qgd2l0aFxuICB8IChfLCBfLCBcIlwiKSAtPlxuICAgICAgKCogRG8gbm90IHBhZCB1bmRvY3VtZW50ZWQgb3B0aW9ucywgc28gdGhhdCB0aGV5IHN0aWxsIGRvbid0IHNob3cgdXAgd2hlblxuICAgICAgICogcnVuIHRocm91Z2ggW3VzYWdlXSBvciBbcGFyc2VdLiAqKVxuICAgICAga3NkXG4gIHwgKGt3ZCwgKFN5bWJvbCBfIGFzIHNwZWMpLCBtc2cpIC0+XG4gICAgICBsZXQgY3V0Y29sID0gc2Vjb25kX3dvcmQgbXNnIGluXG4gICAgICBsZXQgc3BhY2VzID0gU3RyaW5nLm1ha2UgKChJbnQubWF4IDAgKGxlbiAtIGN1dGNvbCkpICsgMykgJyAnIGluXG4gICAgICAoa3dkLCBzcGVjLCBcIlxcblwiIF4gc3BhY2VzIF4gcmVwbGFjZV9sZWFkaW5nX3RhYiBtc2cpXG4gIHwgKGt3ZCwgc3BlYywgbXNnKSAtPlxuICAgICAgbGV0IGN1dGNvbCA9IHNlY29uZF93b3JkIG1zZyBpblxuICAgICAgbGV0IGt3ZF9sZW4gPSBTdHJpbmcubGVuZ3RoIGt3ZCBpblxuICAgICAgbGV0IGRpZmYgPSBsZW4gLSBrd2RfbGVuIC0gY3V0Y29sIGluXG4gICAgICBpZiBkaWZmIDw9IDAgdGhlblxuICAgICAgICAoa3dkLCBzcGVjLCByZXBsYWNlX2xlYWRpbmdfdGFiIG1zZylcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IHNwYWNlcyA9IFN0cmluZy5tYWtlIGRpZmYgJyAnIGluXG4gICAgICAgIGxldCBwcmVmaXggPSBTdHJpbmcuc3ViIChyZXBsYWNlX2xlYWRpbmdfdGFiIG1zZykgMCBjdXRjb2wgaW5cbiAgICAgICAgbGV0IHN1ZmZpeCA9IFN0cmluZy5zdWIgbXNnIGN1dGNvbCAoU3RyaW5nLmxlbmd0aCBtc2cgLSBjdXRjb2wpIGluXG4gICAgICAgIChrd2QsIHNwZWMsIHByZWZpeCBeIHNwYWNlcyBeIHN1ZmZpeClcblxuXG5sZXQgYWxpZ24gPyhsaW1pdD1tYXhfaW50KSBzcGVjbGlzdCA9XG4gIGxldCBjb21wbGV0ZWQgPSBhZGRfaGVscCBzcGVjbGlzdCBpblxuICBsZXQgbGVuID0gTGlzdC5mb2xkX2xlZnQgbWF4X2FyZ19sZW4gMCBjb21wbGV0ZWQgaW5cbiAgbGV0IGxlbiA9IEludC5taW4gbGVuIGxpbWl0IGluXG4gIExpc3QubWFwIChhZGRfcGFkZGluZyBsZW4pIGNvbXBsZXRlZFxuXG5sZXQgdHJpbV9jciBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBpZiBsZW4gPiAwICYmIFN0cmluZy5nZXQgcyAobGVuIC0gMSkgPSAnXFxyJyB0aGVuXG4gICAgU3RyaW5nLnN1YiBzIDAgKGxlbiAtIDEpXG4gIGVsc2VcbiAgICBzXG5cbmxldCByZWFkX2F1eCB0cmltIHNlcCBmaWxlID1cbiAgbGV0IGljID0gb3Blbl9pbl9iaW4gZmlsZSBpblxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyMDAgaW5cbiAgbGV0IHdvcmRzID0gcmVmIFtdIGluXG4gIGxldCBzdGFzaCAoKSA9XG4gICAgbGV0IHdvcmQgPSBCdWZmZXIuY29udGVudHMgYnVmIGluXG4gICAgbGV0IHdvcmQgPSBpZiB0cmltIHRoZW4gdHJpbV9jciB3b3JkIGVsc2Ugd29yZCBpblxuICAgIHdvcmRzIDo9IHdvcmQgOjogIXdvcmRzO1xuICAgIEJ1ZmZlci5jbGVhciBidWZcbiAgaW5cbiAgYmVnaW5cbiAgICB0cnkgd2hpbGUgdHJ1ZSBkb1xuICAgICAgICBsZXQgYyA9IGlucHV0X2NoYXIgaWMgaW5cbiAgICAgICAgaWYgYyA9IHNlcCB0aGVuIHN0YXNoICgpIGVsc2UgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjXG4gICAgICBkb25lXG4gICAgd2l0aCBFbmRfb2ZfZmlsZSAtPiAoKVxuICBlbmQ7XG4gIGlmIEJ1ZmZlci5sZW5ndGggYnVmID4gMCB0aGVuIHN0YXNoICgpO1xuICBjbG9zZV9pbiBpYztcbiAgQXJyYXkub2ZfbGlzdCAoTGlzdC5yZXYgIXdvcmRzKVxuXG5sZXQgcmVhZF9hcmcgPSByZWFkX2F1eCB0cnVlICdcXG4nXG5cbmxldCByZWFkX2FyZzAgPSByZWFkX2F1eCBmYWxzZSAnXFx4MDAnXG5cbmxldCB3cml0ZV9hdXggc2VwIGZpbGUgYXJncyA9XG4gIGxldCBvYyA9IG9wZW5fb3V0X2JpbiBmaWxlIGluXG4gIEFycmF5Lml0ZXIgKGZ1biBzIC0+IGZwcmludGYgb2MgXCIlcyVjXCIgcyBzZXApIGFyZ3M7XG4gIGNsb3NlX291dCBvY1xuXG5sZXQgd3JpdGVfYXJnID0gd3JpdGVfYXV4ICdcXG4nXG5cbmxldCB3cml0ZV9hcmcwID0gd3JpdGVfYXV4ICdcXHgwMCdcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmxldCBjb25zdCBjIF8gPSBjXG5sZXQgZmxpcCBmIHggeSA9IGYgeSB4XG5sZXQgbmVnYXRlIHAgdiA9IG5vdCAocCB2KVxuXG5leGNlcHRpb24gRmluYWxseV9yYWlzZWQgb2YgZXhuXG5cbmxldCAoKSA9IFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgQEAgZnVuY3Rpb25cbnwgRmluYWxseV9yYWlzZWQgZXhuIC0+IFNvbWUgKFwiRnVuLkZpbmFsbHlfcmFpc2VkOiBcIiBeIFByaW50ZXhjLnRvX3N0cmluZyBleG4pXG58IF8gLT4gTm9uZVxuXG5sZXQgcHJvdGVjdCB+KGZpbmFsbHkgOiB1bml0IC0+IHVuaXQpIHdvcmsgPVxuICBsZXQgZmluYWxseV9ub19leG4gKCkgPVxuICAgIHRyeSBmaW5hbGx5ICgpIHdpdGggZSAtPlxuICAgICAgbGV0IGJ0ID0gUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIChGaW5hbGx5X3JhaXNlZCBlKSBidFxuICBpblxuICBtYXRjaCB3b3JrICgpIHdpdGhcbiAgfCByZXN1bHQgLT4gZmluYWxseV9ub19leG4gKCkgOyByZXN1bHRcbiAgfCBleGNlcHRpb24gd29ya19leG4gLT5cbiAgICAgIGxldCB3b3JrX2J0ID0gUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGZpbmFsbHlfbm9fZXhuICgpIDtcbiAgICAgIFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIHdvcmtfZXhuIHdvcmtfYnRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgSmFjcXVlcy1IZW5yaSBKb3VyZGFuLCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUGFyaXMgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYtMjAxNiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlICAgKilcbigqICAgICBldCBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBzdGF0ID0ge1xuICBtaW5vcl93b3JkcyA6IGZsb2F0O1xuICBwcm9tb3RlZF93b3JkcyA6IGZsb2F0O1xuICBtYWpvcl93b3JkcyA6IGZsb2F0O1xuICBtaW5vcl9jb2xsZWN0aW9ucyA6IGludDtcbiAgbWFqb3JfY29sbGVjdGlvbnMgOiBpbnQ7XG4gIGhlYXBfd29yZHMgOiBpbnQ7XG4gIGhlYXBfY2h1bmtzIDogaW50O1xuICBsaXZlX3dvcmRzIDogaW50O1xuICBsaXZlX2Jsb2NrcyA6IGludDtcbiAgZnJlZV93b3JkcyA6IGludDtcbiAgZnJlZV9ibG9ja3MgOiBpbnQ7XG4gIGxhcmdlc3RfZnJlZSA6IGludDtcbiAgZnJhZ21lbnRzIDogaW50O1xuICBjb21wYWN0aW9ucyA6IGludDtcbiAgdG9wX2hlYXBfd29yZHMgOiBpbnQ7XG4gIHN0YWNrX3NpemUgOiBpbnQ7XG4gIGZvcmNlZF9tYWpvcl9jb2xsZWN0aW9uczogaW50O1xufVxuXG50eXBlIGNvbnRyb2wgPSB7XG4gIG11dGFibGUgbWlub3JfaGVhcF9zaXplIDogaW50O1xuICBtdXRhYmxlIG1ham9yX2hlYXBfaW5jcmVtZW50IDogaW50O1xuICBtdXRhYmxlIHNwYWNlX292ZXJoZWFkIDogaW50O1xuICBtdXRhYmxlIHZlcmJvc2UgOiBpbnQ7XG4gIG11dGFibGUgbWF4X292ZXJoZWFkIDogaW50O1xuICBtdXRhYmxlIHN0YWNrX2xpbWl0IDogaW50O1xuICBtdXRhYmxlIGFsbG9jYXRpb25fcG9saWN5IDogaW50O1xuICB3aW5kb3dfc2l6ZSA6IGludDtcbiAgY3VzdG9tX21ham9yX3JhdGlvIDogaW50O1xuICBjdXN0b21fbWlub3JfcmF0aW8gOiBpbnQ7XG4gIGN1c3RvbV9taW5vcl9tYXhfc2l6ZSA6IGludDtcbn1cblxuZXh0ZXJuYWwgc3RhdCA6IHVuaXQgLT4gc3RhdCA9IFwiY2FtbF9nY19zdGF0XCJcbmV4dGVybmFsIHF1aWNrX3N0YXQgOiB1bml0IC0+IHN0YXQgPSBcImNhbWxfZ2NfcXVpY2tfc3RhdFwiXG5leHRlcm5hbCBjb3VudGVycyA6IHVuaXQgLT4gKGZsb2F0ICogZmxvYXQgKiBmbG9hdCkgPSBcImNhbWxfZ2NfY291bnRlcnNcIlxuZXh0ZXJuYWwgbWlub3Jfd29yZHMgOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKVxuICA9IFwiY2FtbF9nY19taW5vcl93b3Jkc1wiIFwiY2FtbF9nY19taW5vcl93b3Jkc191bmJveGVkXCJcbmV4dGVybmFsIGdldCA6IHVuaXQgLT4gY29udHJvbCA9IFwiY2FtbF9nY19nZXRcIlxuZXh0ZXJuYWwgc2V0IDogY29udHJvbCAtPiB1bml0ID0gXCJjYW1sX2djX3NldFwiXG5leHRlcm5hbCBtaW5vciA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19taW5vclwiXG5leHRlcm5hbCBtYWpvcl9zbGljZSA6IGludCAtPiBpbnQgPSBcImNhbWxfZ2NfbWFqb3Jfc2xpY2VcIlxuZXh0ZXJuYWwgbWFqb3IgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfbWFqb3JcIlxuZXh0ZXJuYWwgZnVsbF9tYWpvciA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19mdWxsX21ham9yXCJcbmV4dGVybmFsIGNvbXBhY3QgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfY29tcGFjdGlvblwiXG5leHRlcm5hbCBnZXRfbWlub3JfZnJlZSA6IHVuaXQgLT4gaW50ID0gXCJjYW1sX2dldF9taW5vcl9mcmVlXCJcbmV4dGVybmFsIGdldF9idWNrZXQgOiBpbnQgLT4gaW50ID0gXCJjYW1sX2dldF9tYWpvcl9idWNrZXRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZ2V0X2NyZWRpdCA6IHVuaXQgLT4gaW50ID0gXCJjYW1sX2dldF9tYWpvcl9jcmVkaXRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHVnZV9mYWxsYmFja19jb3VudCA6IHVuaXQgLT4gaW50ID0gXCJjYW1sX2djX2h1Z2VfZmFsbGJhY2tfY291bnRcIlxuZXh0ZXJuYWwgZXZlbnRsb2dfcGF1c2UgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZXZlbnRsb2dfcGF1c2VcIlxuZXh0ZXJuYWwgZXZlbnRsb2dfcmVzdW1lIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2V2ZW50bG9nX3Jlc3VtZVwiXG5cbm9wZW4gUHJpbnRmXG5cbmxldCBwcmludF9zdGF0IGMgPVxuICBsZXQgc3QgPSBzdGF0ICgpIGluXG4gIGZwcmludGYgYyBcIm1pbm9yX2NvbGxlY3Rpb25zOiAgICAgICVkXFxuXCIgc3QubWlub3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcIm1ham9yX2NvbGxlY3Rpb25zOiAgICAgICVkXFxuXCIgc3QubWFqb3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcImNvbXBhY3Rpb25zOiAgICAgICAgICAgICVkXFxuXCIgc3QuY29tcGFjdGlvbnM7XG4gIGZwcmludGYgYyBcImZvcmNlZF9tYWpvcl9jb2xsZWN0aW9uczogJWRcXG5cIiBzdC5mb3JjZWRfbWFqb3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcIlxcblwiO1xuICBsZXQgbDEgPSBTdHJpbmcubGVuZ3RoIChzcHJpbnRmIFwiJS4wZlwiIHN0Lm1pbm9yX3dvcmRzKSBpblxuICBmcHJpbnRmIGMgXCJtaW5vcl93b3JkczogICAgJSouMGZcXG5cIiBsMSBzdC5taW5vcl93b3JkcztcbiAgZnByaW50ZiBjIFwicHJvbW90ZWRfd29yZHM6ICUqLjBmXFxuXCIgbDEgc3QucHJvbW90ZWRfd29yZHM7XG4gIGZwcmludGYgYyBcIm1ham9yX3dvcmRzOiAgICAlKi4wZlxcblwiIGwxIHN0Lm1ham9yX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJcXG5cIjtcbiAgbGV0IGwyID0gU3RyaW5nLmxlbmd0aCAoc3ByaW50ZiBcIiVkXCIgc3QudG9wX2hlYXBfd29yZHMpIGluXG4gIGZwcmludGYgYyBcInRvcF9oZWFwX3dvcmRzOiAlKmRcXG5cIiBsMiBzdC50b3BfaGVhcF93b3JkcztcbiAgZnByaW50ZiBjIFwiaGVhcF93b3JkczogICAgICUqZFxcblwiIGwyIHN0LmhlYXBfd29yZHM7XG4gIGZwcmludGYgYyBcImxpdmVfd29yZHM6ICAgICAlKmRcXG5cIiBsMiBzdC5saXZlX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJmcmVlX3dvcmRzOiAgICAgJSpkXFxuXCIgbDIgc3QuZnJlZV93b3JkcztcbiAgZnByaW50ZiBjIFwibGFyZ2VzdF9mcmVlOiAgICUqZFxcblwiIGwyIHN0Lmxhcmdlc3RfZnJlZTtcbiAgZnByaW50ZiBjIFwiZnJhZ21lbnRzOiAgICAgICUqZFxcblwiIGwyIHN0LmZyYWdtZW50cztcbiAgZnByaW50ZiBjIFwiXFxuXCI7XG4gIGZwcmludGYgYyBcImxpdmVfYmxvY2tzOiAlZFxcblwiIHN0LmxpdmVfYmxvY2tzO1xuICBmcHJpbnRmIGMgXCJmcmVlX2Jsb2NrczogJWRcXG5cIiBzdC5mcmVlX2Jsb2NrcztcbiAgZnByaW50ZiBjIFwiaGVhcF9jaHVua3M6ICVkXFxuXCIgc3QuaGVhcF9jaHVua3NcblxuXG5sZXQgYWxsb2NhdGVkX2J5dGVzICgpID1cbiAgbGV0IChtaSwgcHJvLCBtYSkgPSBjb3VudGVycyAoKSBpblxuICAobWkgKy4gbWEgLS4gcHJvKSAqLiBmbG9hdF9vZl9pbnQgKFN5cy53b3JkX3NpemUgLyA4KVxuXG5cbmV4dGVybmFsIGZpbmFsaXNlIDogKCdhIC0+IHVuaXQpIC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfZmluYWxfcmVnaXN0ZXJcIlxuZXh0ZXJuYWwgZmluYWxpc2VfbGFzdCA6ICh1bml0IC0+IHVuaXQpIC0+ICdhIC0+IHVuaXQgPVxuICBcImNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWVcIlxuZXh0ZXJuYWwgZmluYWxpc2VfcmVsZWFzZSA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9maW5hbF9yZWxlYXNlXCJcblxuXG50eXBlIGFsYXJtID0gYm9vbCByZWZcbnR5cGUgYWxhcm1fcmVjID0ge2FjdGl2ZSA6IGFsYXJtOyBmIDogdW5pdCAtPiB1bml0fVxuXG5sZXQgcmVjIGNhbGxfYWxhcm0gYXJlYyA9XG4gIGlmICEoYXJlYy5hY3RpdmUpIHRoZW4gYmVnaW5cbiAgICBmaW5hbGlzZSBjYWxsX2FsYXJtIGFyZWM7XG4gICAgYXJlYy5mICgpO1xuICBlbmRcblxuXG5sZXQgY3JlYXRlX2FsYXJtIGYgPVxuICBsZXQgYXJlYyA9IHsgYWN0aXZlID0gcmVmIHRydWU7IGYgPSBmIH0gaW5cbiAgZmluYWxpc2UgY2FsbF9hbGFybSBhcmVjO1xuICBhcmVjLmFjdGl2ZVxuXG5cbmxldCBkZWxldGVfYWxhcm0gYSA9IGEgOj0gZmFsc2VcblxubW9kdWxlIE1lbXByb2YgPVxuICBzdHJ1Y3RcbiAgICB0eXBlIGFsbG9jYXRpb25fc291cmNlID0gTm9ybWFsIHwgTWFyc2hhbCB8IEN1c3RvbVxuICAgIHR5cGUgYWxsb2NhdGlvbiA9XG4gICAgICB7IG5fc2FtcGxlcyA6IGludDtcbiAgICAgICAgc2l6ZSA6IGludDtcbiAgICAgICAgc291cmNlIDogYWxsb2NhdGlvbl9zb3VyY2U7XG4gICAgICAgIGNhbGxzdGFjayA6IFByaW50ZXhjLnJhd19iYWNrdHJhY2UgfVxuXG4gICAgdHlwZSAoJ21pbm9yLCAnbWFqb3IpIHRyYWNrZXIgPSB7XG4gICAgICBhbGxvY19taW5vcjogYWxsb2NhdGlvbiAtPiAnbWlub3Igb3B0aW9uO1xuICAgICAgYWxsb2NfbWFqb3I6IGFsbG9jYXRpb24gLT4gJ21ham9yIG9wdGlvbjtcbiAgICAgIHByb21vdGU6ICdtaW5vciAtPiAnbWFqb3Igb3B0aW9uO1xuICAgICAgZGVhbGxvY19taW5vcjogJ21pbm9yIC0+IHVuaXQ7XG4gICAgICBkZWFsbG9jX21ham9yOiAnbWFqb3IgLT4gdW5pdDtcbiAgICB9XG5cbiAgICBsZXQgbnVsbF90cmFja2VyID0ge1xuICAgICAgYWxsb2NfbWlub3IgPSAoZnVuIF8gLT4gTm9uZSk7XG4gICAgICBhbGxvY19tYWpvciA9IChmdW4gXyAtPiBOb25lKTtcbiAgICAgIHByb21vdGUgPSAoZnVuIF8gLT4gTm9uZSk7XG4gICAgICBkZWFsbG9jX21pbm9yID0gKGZ1biBfIC0+ICgpKTtcbiAgICAgIGRlYWxsb2NfbWFqb3IgPSAoZnVuIF8gLT4gKCkpO1xuICAgIH1cblxuICAgIGV4dGVybmFsIGNfc3RhcnQgOlxuICAgICAgZmxvYXQgLT4gaW50IC0+ICgnbWlub3IsICdtYWpvcikgdHJhY2tlciAtPiB1bml0XG4gICAgICA9IFwiY2FtbF9tZW1wcm9mX3N0YXJ0XCJcblxuICAgIGxldCBzdGFydFxuICAgICAgfnNhbXBsaW5nX3JhdGVcbiAgICAgID8oY2FsbHN0YWNrX3NpemUgPSBtYXhfaW50KVxuICAgICAgdHJhY2tlciA9XG4gICAgICBjX3N0YXJ0IHNhbXBsaW5nX3JhdGUgY2FsbHN0YWNrX3NpemUgdHJhY2tlclxuXG4gICAgZXh0ZXJuYWwgc3RvcCA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9tZW1wcm9mX3N0b3BcIlxuICBlbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTWVzc2FnZSBkaWdlc3QgKE1ENSkgKilcblxudHlwZSB0ID0gc3RyaW5nXG5cbmxldCBjb21wYXJlID0gU3RyaW5nLmNvbXBhcmVcbmxldCBlcXVhbCA9IFN0cmluZy5lcXVhbFxuXG5leHRlcm5hbCB1bnNhZmVfc3RyaW5nOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9zdHJpbmdcIlxuZXh0ZXJuYWwgY2hhbm5lbDogaW5fY2hhbm5lbCAtPiBpbnQgLT4gdCA9IFwiY2FtbF9tZDVfY2hhblwiXG5cbmxldCBzdHJpbmcgc3RyID1cbiAgdW5zYWZlX3N0cmluZyBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbmxldCBieXRlcyBiID0gc3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpXG5cbmxldCBzdWJzdHJpbmcgc3RyIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gU3RyaW5nLmxlbmd0aCBzdHIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5zdWJzdHJpbmdcIlxuICBlbHNlIHVuc2FmZV9zdHJpbmcgc3RyIG9mcyBsZW5cblxubGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9IHN1YnN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKSBvZnMgbGVuXG5cbmxldCBmaWxlIGZpbGVuYW1lID1cbiAgbGV0IGljID0gb3Blbl9pbl9iaW4gZmlsZW5hbWUgaW5cbiAgbWF0Y2ggY2hhbm5lbCBpYyAoLTEpIHdpdGhcbiAgICB8IGQgLT4gY2xvc2VfaW4gaWM7IGRcbiAgICB8IGV4Y2VwdGlvbiBlIC0+IGNsb3NlX2luIGljOyByYWlzZSBlXG5cbmxldCBvdXRwdXQgY2hhbiBkaWdlc3QgPVxuICBvdXRwdXRfc3RyaW5nIGNoYW4gZGlnZXN0XG5cbmxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIDE2XG5cbmxldCBjaGFyX2hleCBuID1cbiAgQ2hhci51bnNhZmVfY2hyIChuICsgaWYgbiA8IDEwIHRoZW4gQ2hhci5jb2RlICcwJyBlbHNlIChDaGFyLmNvZGUgJ2EnIC0gMTApKVxuXG5sZXQgdG9faGV4IGQgPVxuICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gMTYgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAzMiBpblxuICBmb3IgaSA9IDAgdG8gMTUgZG9cbiAgICBsZXQgeCA9IENoYXIuY29kZSBkLltpXSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIpIChjaGFyX2hleCAoeCBsc3IgNCkpO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIrMSkgKGNoYXJfaGV4ICh4IGxhbmQgMHgwZikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuXG5sZXQgZnJvbV9oZXggcyA9XG4gIGlmIFN0cmluZy5sZW5ndGggcyA8PiAzMiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LmZyb21faGV4XCI7XG4gIGxldCBkaWdpdCBjID1cbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8ICcwJy4uJzknIC0+IENoYXIuY29kZSBjIC0gQ2hhci5jb2RlICcwJ1xuICAgIHwgJ0EnLi4nRicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ0EnICsgMTBcbiAgICB8ICdhJy4uJ2YnIC0+IENoYXIuY29kZSBjIC0gQ2hhci5jb2RlICdhJyArIDEwXG4gICAgfCBfIC0+IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiRGlnZXN0LmZyb21faGV4XCIpXG4gIGluXG4gIGxldCBieXRlIGkgPSBkaWdpdCBzLltpXSBsc2wgNCArIGRpZ2l0IHMuW2krMV0gaW5cbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAxNiBpblxuICBmb3IgaSA9IDAgdG8gMTUgZG9cbiAgICBCeXRlcy5zZXQgcmVzdWx0IGkgKENoYXIuY2hyIChieXRlICgyICogaSkpKTtcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXN1bHRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSGFzaCB0YWJsZXMgKilcblxuKCogV2UgZG8gZHluYW1pYyBoYXNoaW5nLCBhbmQgcmVzaXplIHRoZSB0YWJsZSBhbmQgcmVoYXNoIHRoZSBlbGVtZW50c1xuICAgd2hlbiBidWNrZXRzIGJlY29tZSB0b28gbG9uZy4gKilcblxudHlwZSAoJ2EsICdiKSB0ID1cbiAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgIG11dGFibGUgZGF0YTogKCdhLCAnYikgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgbXV0YWJsZSBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gIH1cblxuYW5kICgnYSwgJ2IpIGJ1Y2tldGxpc3QgPVxuICAgIEVtcHR5XG4gIHwgQ29ucyBvZiB7IG11dGFibGUga2V5OiAnYTtcbiAgICAgICAgICAgICAgbXV0YWJsZSBkYXRhOiAnYjtcbiAgICAgICAgICAgICAgbXV0YWJsZSBuZXh0OiAoJ2EsICdiKSBidWNrZXRsaXN0IH1cblxuKCogVGhlIHNpZ24gb2YgaW5pdGlhbF9zaXplIGVuY29kZXMgdGhlIGZhY3QgdGhhdCBhIHRyYXZlcnNhbCBpc1xuICAgb25nb2luZyBvciBub3QuXG5cbiAgIFRoaXMgZGlzYWJsZXMgdGhlIGVmZmljaWVudCBpbiBwbGFjZSBpbXBsZW1lbnRhdGlvbiBvZiByZXNpemluZy5cbiopXG5cbmxldCBvbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gIHx8IGguaW5pdGlhbF9zaXplIDwgMFxuXG5sZXQgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgaC5pbml0aWFsX3NpemUgPC0gLSBoLmluaXRpYWxfc2l6ZVxuXG4oKiBUbyBwaWNrIHJhbmRvbSBzZWVkcyBpZiByZXF1ZXN0ZWQgKilcblxubGV0IHJhbmRvbWl6ZWRfZGVmYXVsdCA9XG4gIGxldCBwYXJhbXMgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJDQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPiBcIlwiIGluXG4gIFN0cmluZy5jb250YWlucyBwYXJhbXMgJ1InXG5cbmxldCByYW5kb21pemVkID0gcmVmIHJhbmRvbWl6ZWRfZGVmYXVsdFxuXG5sZXQgcmFuZG9taXplICgpID0gcmFuZG9taXplZCA6PSB0cnVlXG5sZXQgaXNfcmFuZG9taXplZCAoKSA9ICFyYW5kb21pemVkXG5cbmxldCBwcm5nID0gbGF6eSAoUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0KCkpXG5cbigqIEZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgYmVmb3JlIHRoZSBmdW5jdG9yaWFsIGludGVyZmFjZSBtdXN0IGVpdGhlciBiZVxuICAgaW5kZXBlbmRlbnQgb2YgdGhlIGhhc2ggZnVuY3Rpb24gb3IgdGFrZSBpdCBhcyBhIHBhcmFtZXRlciAoc2VlICMyMjAyIGFuZFxuICAgY29kZSBiZWxvdyB0aGUgZnVuY3RvciBkZWZpbml0aW9ucy4gKilcblxuKCogQ3JlYXRpbmcgYSBmcmVzaCwgZW1wdHkgdGFibGUgKilcblxubGV0IHJlYyBwb3dlcl8yX2Fib3ZlIHggbiA9XG4gIGlmIHggPj0gbiB0aGVuIHhcbiAgZWxzZSBpZiB4ICogMiA+IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIHRoZW4geFxuICBlbHNlIHBvd2VyXzJfYWJvdmUgKHggKiAyKSBuXG5cbmxldCBjcmVhdGUgPyhyYW5kb20gPSAhcmFuZG9taXplZCkgaW5pdGlhbF9zaXplID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IGluaXRpYWxfc2l6ZSBpblxuICBsZXQgc2VlZCA9IGlmIHJhbmRvbSB0aGVuIFJhbmRvbS5TdGF0ZS5iaXRzIChMYXp5LmZvcmNlIHBybmcpIGVsc2UgMCBpblxuICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbmxldCBjbGVhciBoID1cbiAgaWYgaC5zaXplID4gMCB0aGVuIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgQXJyYXkuZmlsbCBoLmRhdGEgMCAoQXJyYXkubGVuZ3RoIGguZGF0YSkgRW1wdHlcbiAgZW5kXG5cbmxldCByZXNldCBoID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gICAgfHwgbGVuID0gYWJzIGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICBjbGVhciBoXG4gIGVsc2UgYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSAoYWJzIGguaW5pdGlhbF9zaXplKSBFbXB0eVxuICBlbmRcblxubGV0IGNvcHlfYnVja2V0bGlzdCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gRW1wdHlcbiAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICBsZXQgcmVjIGxvb3AgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgQ29ucyBwcmVjIC0+ICBwcmVjLm5leHQgPC0gclxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgbG9vcCByIG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgIGxvb3AgciBuZXh0O1xuICAgICAgclxuXG5sZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5Lm1hcCBjb3B5X2J1Y2tldGxpc3QgaC5kYXRhIH1cblxubGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbmxldCBpbnNlcnRfYWxsX2J1Y2tldHMgaW5kZXhmdW4gaW5wbGFjZSBvZGF0YSBuZGF0YSA9XG4gIGxldCBuc2l6ZSA9IEFycmF5Lmxlbmd0aCBuZGF0YSBpblxuICBsZXQgbmRhdGFfdGFpbCA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGFzIGNlbGwgLT5cbiAgICAgICAgbGV0IGNlbGwgPVxuICAgICAgICAgIGlmIGlucGxhY2UgdGhlbiBjZWxsXG4gICAgICAgICAgZWxzZSBDb25zIHtrZXk7IGRhdGE7IG5leHQgPSBFbXB0eX1cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5pZHggPSBpbmRleGZ1biBrZXkgaW5cbiAgICAgICAgYmVnaW4gbWF0Y2ggbmRhdGFfdGFpbC4obmlkeCkgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IG5kYXRhLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gY2VsbDtcbiAgICAgICAgZW5kO1xuICAgICAgICBuZGF0YV90YWlsLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICBpbnNlcnRfYnVja2V0IG5leHRcbiAgaW5cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvZGF0YSAtIDEgZG9cbiAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICBkb25lO1xuICBpZiBpbnBsYWNlIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbnNpemUgLSAxIGRvXG4gICAgICBtYXRjaCBuZGF0YV90YWlsLihpKSB3aXRoXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gRW1wdHlcbiAgICBkb25lXG5cbmxldCByZXNpemUgaW5kZXhmdW4gaCA9XG4gIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBiZWdpblxuICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICBsZXQgaW5wbGFjZSA9IG5vdCAob25nb2luZ190cmF2ZXJzYWwgaCkgaW5cbiAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICAgICgqIHNvIHRoYXQgaW5kZXhmdW4gc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgIGluc2VydF9hbGxfYnVja2V0cyAoaW5kZXhmdW4gaCkgaW5wbGFjZSBvZGF0YSBuZGF0YVxuICBlbmRcblxubGV0IGl0ZXIgZiBoID1cbiAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKClcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBmIGtleSBkYXRhOyBkb19idWNrZXQgbmV4dCBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBkb19idWNrZXQgZC4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCByZWMgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBFbXB0eVxuICAgICAgZW5kXG4gIHwgKENvbnMgKHtrZXk7IGRhdGE7IG5leHR9IGFzIGMpKSBhcyBzbG90IC0+XG4gICAgICBiZWdpbiBtYXRjaCBmIGtleSBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyBuZXh0XG4gICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBzbG90XG4gICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIHNsb3RcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgYy5kYXRhIDwtIGRhdGE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBzbG90IG5leHRcbiAgICAgIGVuZFxuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gIGxldCBkID0gaC5kYXRhIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIEVtcHR5IGguZGF0YS4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaFxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IGZvbGQgZiBoIGluaXQgPVxuICBsZXQgcmVjIGRvX2J1Y2tldCBiIGFjY3UgPVxuICAgIG1hdGNoIGIgd2l0aFxuICAgICAgRW1wdHkgLT5cbiAgICAgICAgYWNjdVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGRvX2J1Y2tldCBuZXh0IChmIGtleSBkYXRhIGFjY3UpIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGxldCBhY2N1ID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgICFhY2N1XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG50eXBlIHN0YXRpc3RpY3MgPSB7XG4gIG51bV9iaW5kaW5nczogaW50O1xuICBudW1fYnVja2V0czogaW50O1xuICBtYXhfYnVja2V0X2xlbmd0aDogaW50O1xuICBidWNrZXRfaGlzdG9ncmFtOiBpbnQgYXJyYXlcbn1cblxubGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFjY3VcbiAgfCBDb25ze25leHR9IC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSBuZXh0XG5cbmxldCBzdGF0cyBoID1cbiAgbGV0IG1ibCA9XG4gICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gIEFycmF5Lml0ZXJcbiAgICAoZnVuIGIgLT5cbiAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgIGguZGF0YTtcbiAgeyBudW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgdGJsID1cbiAgKCogY2FwdHVyZSBjdXJyZW50IGFycmF5LCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHRhYmxlIGlzIHJlc2l6ZWQgd2VcbiAgICAga2VlcCBpdGVyYXRpbmcgb24gdGhlIHNhbWUgYXJyYXkgKilcbiAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgKCogc3RhdGU6IGluZGV4ICogbmV4dCBidWNrZXQgdG8gdHJhdmVyc2UgKilcbiAgbGV0IHJlYyBhdXggaSBidWNrICgpID0gbWF0Y2ggYnVjayB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBpZiBpID0gQXJyYXkubGVuZ3RoIHRibF9kYXRhXG4gICAgICAgIHRoZW4gU2VxLk5pbFxuICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBTZXEuQ29ucyAoKGtleSwgZGF0YSksIGF1eCBpIG5leHQpXG4gIGluXG4gIGF1eCAwIEVtcHR5XG5cbmxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG5sZXQgdG9fc2VxX3ZhbHVlcyBtID0gU2VxLm1hcCBzbmQgKHRvX3NlcSBtKVxuXG4oKiBGdW5jdG9yaWFsIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBoYXNoOiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgaGFzaDogaW50IC0+IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTID1cbiAgc2lnXG4gICAgdHlwZSBrZXlcbiAgICB0eXBlICEnYSB0XG4gICAgdmFsIGNyZWF0ZTogaW50IC0+ICdhIHRcbiAgICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgY29weTogJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGFkZDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmU6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgICB2YWwgZmluZDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgICB2YWwgZmluZF9vcHQ6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICAgIHZhbCBmaW5kX2FsbDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXI6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZTogKGtleSAtPiAnYSAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmb2xkOiAoa2V5IC0+ICdhIC0+ICdiIC0+ICdiKSAtPiAnYSB0IC0+ICdiIC0+ICdiXG4gICAgdmFsIGxlbmd0aDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGUgOiA/cmFuZG9tOmJvb2wgLT4gaW50IC0+ICdhIHRcbiAgICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGwgOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gICAgdmFsIHJlcGxhY2UgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgICB2YWwgaXRlciA6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZTogKGtleSAtPiAnYSAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmb2xkIDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICAgIHZhbCBzdGF0czogJ2EgdCAtPiBzdGF0aXN0aWNzXG4gICAgdmFsIHRvX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19zZXFfa2V5cyA6IF8gdCAtPiBrZXkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX3ZhbHVlcyA6ICdhIHQgLT4gJ2EgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIHJlcGxhY2Vfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIGVuZFxuXG5tb2R1bGUgTWFrZVNlZWRlZChIOiBTZWVkZWRIYXNoZWRUeXBlKTogKFNlZWRlZFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICB0eXBlIGtleSA9IEgudFxuICAgIHR5cGUgJ2EgaGFzaHRibCA9IChrZXksICdhKSB0XG4gICAgdHlwZSAnYSB0ID0gJ2EgaGFzaHRibFxuICAgIGxldCBjcmVhdGUgPSBjcmVhdGVcbiAgICBsZXQgY2xlYXIgPSBjbGVhclxuICAgIGxldCByZXNldCA9IHJlc2V0XG4gICAgbGV0IGNvcHkgPSBjb3B5XG5cbiAgICBsZXQga2V5X2luZGV4IGgga2V5ID1cbiAgICAgIChILmhhc2ggaC5zZWVkIGtleSkgbGFuZCAoQXJyYXkubGVuZ3RoIGguZGF0YSAtIDEpXG5cbiAgICBsZXQgYWRkIGgga2V5IGRhdGEgPVxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgICAgIGxldCBidWNrZXQgPSBDb25ze2tleTsgZGF0YTsgbmV4dD1oLmRhdGEuKGkpfSBpblxuICAgICAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcblxuICAgIGxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICgpXG4gICAgICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiBiZWdpblxuICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBuZXh0XG4gICAgICAgICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gbmV4dFxuICAgICAgICAgIGVuZFxuICAgICAgICAgIGVsc2UgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IGMgbmV4dFxuXG4gICAgbGV0IHJlbW92ZSBoIGtleSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IEVtcHR5IGguZGF0YS4oaSlcblxuICAgIGxldCByZWMgZmluZF9yZWMga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrIHRoZW4gZGF0YSBlbHNlIGZpbmRfcmVjIGtleSBuZXh0XG5cbiAgICBsZXQgZmluZCBoIGtleSA9XG4gICAgICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBkMSBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxuICAgIGxldCByZWMgZmluZF9yZWNfb3B0IGtleSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBTb21lIGRhdGEgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHRcblxuICAgIGxldCBmaW5kX29wdCBoIGtleSA9XG4gICAgICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsxIHRoZW4gU29tZSBkMSBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsyIHRoZW4gU29tZSBkMiBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMyB0aGVuIFNvbWUgZDMgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHQzXG5cbiAgICBsZXQgZmluZF9hbGwgaCBrZXkgPVxuICAgICAgbGV0IHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgW11cbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YT1kOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGQgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICAgICAgZW5kXG5cbiAgICBsZXQgbWVtIGgga2V5ID1cbiAgICAgIGxldCByZWMgbWVtX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgICAgICBILmVxdWFsIGsga2V5IHx8IG1lbV9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgbWVtX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgICBsZXQgaXRlciA9IGl0ZXJcbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBzdGF0cyA9IHN0YXRzXG4gICAgbGV0IHRvX3NlcSA9IHRvX3NlcVxuICAgIGxldCB0b19zZXFfa2V5cyA9IHRvX3NlcV9rZXlzXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgPSB0b19zZXFfdmFsdWVzXG4gIGVuZFxuXG5tb2R1bGUgTWFrZShIOiBIYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBoYXNoIChfc2VlZDogaW50KSB4ID0gSC5oYXNoIHhcbiAgICAgIGVuZClcbiAgICBsZXQgY3JlYXRlIHN6ID0gY3JlYXRlIH5yYW5kb206ZmFsc2Ugc3pcbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcbiAgZW5kXG5cbigqIFBvbHltb3JwaGljIGhhc2ggZnVuY3Rpb24tYmFzZWQgdGFibGVzICopXG4oKiBDb2RlIGluY2x1ZGVkIGJlbG93IHRoZSBmdW5jdG9yaWFsIGludGVyZmFjZSB0byBndWFyZCBhZ2FpbnN0IGFjY2lkZW50YWxcbiAgIHVzZSAtIHNlZSAjMjIwMiAqKVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cblxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcbmxldCBoYXNoX3BhcmFtIG4xIG4yIHggPSBzZWVkZWRfaGFzaF9wYXJhbSBuMSBuMiAwIHhcbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5cbmxldCBrZXlfaW5kZXggaCBrZXkgPVxuICBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNFxuICB0aGVuIChzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgaC5zZWVkIGtleSkgbGFuZCAoQXJyYXkubGVuZ3RoIGguZGF0YSAtIDEpXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJIYXNodGJsOiB1bnN1cHBvcnRlZCBoYXNoIHRhYmxlIGZvcm1hdFwiXG5cbmxldCBhZGQgaCBrZXkgZGF0YSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIGxldCBidWNrZXQgPSBDb25ze2tleTsgZGF0YTsgbmV4dD1oLmRhdGEuKGkpfSBpblxuICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcblxubGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgICgpXG4gIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgaWYgY29tcGFyZSBrIGtleSA9IDBcbiAgICAgIHRoZW4gYmVnaW5cbiAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gbmV4dFxuICAgICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gbmV4dFxuICAgICAgZW5kXG4gICAgICBlbHNlIHJlbW92ZV9idWNrZXQgaCBpIGtleSBjIG5leHRcblxubGV0IHJlbW92ZSBoIGtleSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIHJlbW92ZV9idWNrZXQgaCBpIGtleSBFbXB0eSBoLmRhdGEuKGkpXG5cbmxldCByZWMgZmluZF9yZWMga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsgPSAwIHRoZW4gZGF0YSBlbHNlIGZpbmRfcmVjIGtleSBuZXh0XG5cbmxldCBmaW5kIGgga2V5ID1cbiAgbWF0Y2ggaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpIHdpdGhcbiAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIGQxIGVsc2VcbiAgICAgIG1hdGNoIG5leHQxIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIGQyIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MiB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG5sZXQgcmVjIGZpbmRfcmVjX29wdCBrZXkgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBOb25lXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsgPSAwIHRoZW4gU29tZSBkYXRhIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0XG5cbmxldCBmaW5kX29wdCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gTm9uZVxuICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgaWYgY29tcGFyZSBrZXkgazEgPSAwIHRoZW4gU29tZSBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgaWYgY29tcGFyZSBrZXkgazIgPSAwIHRoZW4gU29tZSBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGszID0gMCB0aGVuIFNvbWUgZDMgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHQzXG5cbmxldCBmaW5kX2FsbCBoIGtleSA9XG4gIGxldCByZWMgZmluZF9pbl9idWNrZXQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBbXVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGsga2V5ID0gMFxuICAgICAgdGhlbiBkYXRhIDo6IGZpbmRfaW5fYnVja2V0IG5leHRcbiAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICBmaW5kX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxubGV0IHJlYyByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh7a2V5PWs7IG5leHR9IGFzIHNsb3QpIC0+XG4gICAgICBpZiBjb21wYXJlIGsga2V5ID0gMFxuICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICBlbHNlIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIG5leHRcblxubGV0IHJlcGxhY2UgaCBrZXkgZGF0YSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIGxldCBsID0gaC5kYXRhLihpKSBpblxuICBpZiByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBsIHRoZW4gYmVnaW5cbiAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcbiAgZW5kXG5cbmxldCBtZW0gaCBrZXkgPVxuICBsZXQgcmVjIG1lbV9pbl9idWNrZXQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBmYWxzZVxuICB8IENvbnN7a2V5PWs7IG5leHR9IC0+XG4gICAgICBjb21wYXJlIGsga2V5ID0gMCB8fCBtZW1faW5fYnVja2V0IG5leHQgaW5cbiAgbWVtX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxubGV0IGFkZF9zZXEgdGJsIGkgPVxuICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IGFkZCB0YmwgayB2KSBpXG5cbmxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gcmVwbGFjZSB0YmwgayB2KSBpXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gIHRibFxuXG5sZXQgcmVidWlsZCA/KHJhbmRvbSA9ICFyYW5kb21pemVkKSBoID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IChBcnJheS5sZW5ndGggaC5kYXRhKSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKExhenkuZm9yY2UgcHJuZylcbiAgICBlbHNlIGlmIE9iai5zaXplIChPYmoucmVwciBoKSA+PSA0IHRoZW4gaC5zZWVkXG4gICAgZWxzZSAwIGluXG4gIGxldCBoJyA9IHtcbiAgICBzaXplID0gaC5zaXplO1xuICAgIGRhdGEgPSBBcnJheS5tYWtlIHMgRW1wdHk7XG4gICAgc2VlZCA9IHNlZWQ7XG4gICAgaW5pdGlhbF9zaXplID0gaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLmluaXRpYWxfc2l6ZSBlbHNlIHNcbiAgfSBpblxuICBpbnNlcnRfYWxsX2J1Y2tldHMgKGtleV9pbmRleCBoJykgZmFsc2UgaC5kYXRhIGgnLmRhdGE7XG4gIGgnXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqKiBXZWFrIGFycmF5IG9wZXJhdGlvbnMgKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gJ2EgdCA9IFwiY2FtbF93ZWFrX2NyZWF0ZVwiXG5cbmxldCBjcmVhdGUgbCA9XG4gIGlmIG5vdCAoMCA8PSBsICYmIGwgPD0gT2JqLkVwaGVtZXJvbi5tYXhfZXBoZV9sZW5ndGgpIHRoZW5cbiAgICBpbnZhbGlkX2FyZyhcIldlYWsuY3JlYXRlXCIpO1xuICBjcmVhdGUgbFxuXG4oKiogbnVtYmVyIG9mIGFkZGl0aW9uYWwgdmFsdWVzIGluIGEgd2VhayBwb2ludGVyICopXG5sZXQgYWRkaXRpb25hbF92YWx1ZXMgPSAyXG5cbmxldCBsZW5ndGggeCA9IE9iai5zaXplKE9iai5yZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxubGV0IHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBtc2cgPVxuICBpZiBub3QgKDAgPD0gbyAmJiBvIDwgbGVuZ3RoIGUpIHRoZW5cbiAgICBpbnZhbGlkX2FyZyhtc2cpXG5cbmV4dGVybmFsIHNldCcgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2tleVwiXG5leHRlcm5hbCB1bnNldCA6ICdhIHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxubGV0IHNldCBlIG8geCA9XG4gIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIldlYWsuc2V0XCI7XG4gIG1hdGNoIHggd2l0aFxuICB8IE5vbmUgLT4gdW5zZXQgZSBvXG4gIHwgU29tZSB4IC0+IHNldCcgZSBvIHhcblxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uID0gXCJjYW1sX3dlYWtfZ2V0XCJcbmxldCBnZXQgZSBvID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5nZXRcIjtcbiAgZ2V0IGUgb1xuXG5leHRlcm5hbCBnZXRfY29weSA6ICdhIHQgLT4gaW50IC0+ICdhIG9wdGlvbiA9IFwiY2FtbF93ZWFrX2dldF9jb3B5XCJcbmxldCBnZXRfY29weSBlIG8gPVxuICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJXZWFrLmdldF9jb3B5XCI7XG4gIGdldF9jb3B5IGUgb1xuXG5leHRlcm5hbCBjaGVjayA6ICdhIHQgLT4gaW50IC0+IGJvb2wgPSBcImNhbWxfd2Vha19jaGVja1wiXG5sZXQgY2hlY2sgZSBvID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5jaGVja1wiO1xuICBjaGVjayBlIG9cblxuZXh0ZXJuYWwgYmxpdCA6ICdhIHQgLT4gaW50IC0+ICdhIHQgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX3dlYWtfYmxpdFwiXG5cbigqIGJsaXQ6IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gKilcbmxldCBibGl0IGUxIG8xIGUyIG8yIGwgPVxuICBpZiBsIDwgMCB8fCBvMSA8IDAgfHwgbzEgPiBsZW5ndGggZTEgLSBsXG4gICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIldlYWsuYmxpdFwiXG4gIGVsc2UgaWYgbCA8PiAwIHRoZW4gYmxpdCBlMSBvMSBlMiBvMiBsXG5cbmxldCBmaWxsIGFyIG9mcyBsZW4geCA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYXIgLSBsZW5cbiAgdGhlbiByYWlzZSAoSW52YWxpZF9hcmd1bWVudCBcIldlYWsuZmlsbFwiKVxuICBlbHNlIGJlZ2luXG4gICAgZm9yIGkgPSBvZnMgdG8gKG9mcyArIGxlbiAtIDEpIGRvXG4gICAgICBzZXQgYXIgaSB4XG4gICAgZG9uZVxuICBlbmRcblxuXG4oKiogV2VhayBoYXNoIHRhYmxlcyAqKVxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgZGF0YVxuICB0eXBlIHRcbiAgdmFsIGNyZWF0ZSA6IGludCAtPiB0XG4gIHZhbCBjbGVhciA6IHQgLT4gdW5pdFxuICB2YWwgbWVyZ2UgOiB0IC0+IGRhdGEgLT4gZGF0YVxuICB2YWwgYWRkIDogdCAtPiBkYXRhIC0+IHVuaXRcbiAgdmFsIHJlbW92ZSA6IHQgLT4gZGF0YSAtPiB1bml0XG4gIHZhbCBmaW5kIDogdCAtPiBkYXRhIC0+IGRhdGFcbiAgdmFsIGZpbmRfb3B0IDogdCAtPiBkYXRhIC0+IGRhdGEgb3B0aW9uXG4gIHZhbCBmaW5kX2FsbCA6IHQgLT4gZGF0YSAtPiBkYXRhIGxpc3RcbiAgdmFsIG1lbSA6IHQgLT4gZGF0YSAtPiBib29sXG4gIHZhbCBpdGVyIDogKGRhdGEgLT4gdW5pdCkgLT4gdCAtPiB1bml0XG4gIHZhbCBmb2xkIDogKGRhdGEgLT4gJ2EgLT4gJ2EpIC0+IHQgLT4gJ2EgLT4gJ2FcbiAgdmFsIGNvdW50IDogdCAtPiBpbnRcbiAgdmFsIHN0YXRzIDogdCAtPiBpbnQgKiBpbnQgKiBpbnQgKiBpbnQgKiBpbnQgKiBpbnRcbmVuZFxuXG5tb2R1bGUgTWFrZSAoSCA6IEhhc2h0YmwuSGFzaGVkVHlwZSkgOiAoUyB3aXRoIHR5cGUgZGF0YSA9IEgudCkgPSBzdHJ1Y3RcblxuICB0eXBlICdhIHdlYWtfdCA9ICdhIHRcbiAgbGV0IHdlYWtfY3JlYXRlID0gY3JlYXRlXG4gIGxldCBlbXB0eWJ1Y2tldCA9IHdlYWtfY3JlYXRlIDBcblxuICB0eXBlIGRhdGEgPSBILnRcblxuICB0eXBlIHQgPSB7XG4gICAgbXV0YWJsZSB0YWJsZSA6IGRhdGEgd2Vha190IGFycmF5O1xuICAgIG11dGFibGUgaGFzaGVzIDogaW50IGFycmF5IGFycmF5O1xuICAgIG11dGFibGUgbGltaXQgOiBpbnQ7ICAgICAgICAgICAgICAgKCogYnVja2V0IHNpemUgbGltaXQgKilcbiAgICBtdXRhYmxlIG92ZXJzaXplIDogaW50OyAgICAgICAgICAgICgqIG51bWJlciBvZiBvdmVyc2l6ZSBidWNrZXRzICopXG4gICAgbXV0YWJsZSByb3ZlciA6IGludDsgICAgICAgICAgICAgICAoKiBmb3IgaW50ZXJuYWwgYm9va2tlZXBpbmcgKilcbiAgfVxuXG4gIGxldCBnZXRfaW5kZXggdCBoID0gKGggbGFuZCBtYXhfaW50KSBtb2QgKEFycmF5Lmxlbmd0aCB0LnRhYmxlKVxuXG4gIGxldCBsaW1pdCA9IDdcbiAgbGV0IG92ZXJfbGltaXQgPSAyXG5cbiAgbGV0IGNyZWF0ZSBzeiA9XG4gICAgbGV0IHN6ID0gaWYgc3ogPCA3IHRoZW4gNyBlbHNlIHN6IGluXG4gICAgbGV0IHN6ID0gaWYgc3ogPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIFN5cy5tYXhfYXJyYXlfbGVuZ3RoIGVsc2Ugc3ogaW5cbiAgICB7XG4gICAgICB0YWJsZSA9IEFycmF5Lm1ha2Ugc3ogZW1wdHlidWNrZXQ7XG4gICAgICBoYXNoZXMgPSBBcnJheS5tYWtlIHN6IFt8IHxdO1xuICAgICAgbGltaXQgPSBsaW1pdDtcbiAgICAgIG92ZXJzaXplID0gMDtcbiAgICAgIHJvdmVyID0gMDtcbiAgICB9XG5cbiAgbGV0IGNsZWFyIHQgPVxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggdC50YWJsZSAtIDEgZG9cbiAgICAgIHQudGFibGUuKGkpIDwtIGVtcHR5YnVja2V0O1xuICAgICAgdC5oYXNoZXMuKGkpIDwtIFt8IHxdO1xuICAgIGRvbmU7XG4gICAgdC5saW1pdCA8LSBsaW1pdDtcbiAgICB0Lm92ZXJzaXplIDwtIDBcblxuXG4gIGxldCBmb2xkIGYgdCBpbml0ID1cbiAgICBsZXQgcmVjIGZvbGRfYnVja2V0IGkgYiBhY2N1ID1cbiAgICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiBhY2N1IGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgICAgfCBTb21lIHYgLT4gZm9sZF9idWNrZXQgKGkrMSkgYiAoZiB2IGFjY3UpXG4gICAgICB8IE5vbmUgLT4gZm9sZF9idWNrZXQgKGkrMSkgYiBhY2N1XG4gICAgaW5cbiAgICBBcnJheS5mb2xkX3JpZ2h0IChmb2xkX2J1Y2tldCAwKSB0LnRhYmxlIGluaXRcblxuXG4gIGxldCBpdGVyIGYgdCA9XG4gICAgbGV0IHJlYyBpdGVyX2J1Y2tldCBpIGIgPVxuICAgICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuICgpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgICAgfCBTb21lIHYgLT4gZiB2OyBpdGVyX2J1Y2tldCAoaSsxKSBiXG4gICAgICB8IE5vbmUgLT4gaXRlcl9idWNrZXQgKGkrMSkgYlxuICAgIGluXG4gICAgQXJyYXkuaXRlciAoaXRlcl9idWNrZXQgMCkgdC50YWJsZVxuXG5cbiAgbGV0IGl0ZXJfd2VhayBmIHQgPVxuICAgIGxldCByZWMgaXRlcl9idWNrZXQgaSBqIGIgPVxuICAgICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuICgpIGVsc2VcbiAgICAgIG1hdGNoIGNoZWNrIGIgaSB3aXRoXG4gICAgICB8IHRydWUgLT4gZiBiIHQuaGFzaGVzLihqKSBpOyBpdGVyX2J1Y2tldCAoaSsxKSBqIGJcbiAgICAgIHwgZmFsc2UgLT4gaXRlcl9idWNrZXQgKGkrMSkgaiBiXG4gICAgaW5cbiAgICBBcnJheS5pdGVyaSAoaXRlcl9idWNrZXQgMCkgdC50YWJsZVxuXG5cbiAgbGV0IHJlYyBjb3VudF9idWNrZXQgaSBiIGFjY3UgPVxuICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiBhY2N1IGVsc2VcbiAgICBjb3VudF9idWNrZXQgKGkrMSkgYiAoYWNjdSArIChpZiBjaGVjayBiIGkgdGhlbiAxIGVsc2UgMCkpXG5cblxuICBsZXQgY291bnQgdCA9XG4gICAgQXJyYXkuZm9sZF9yaWdodCAoY291bnRfYnVja2V0IDApIHQudGFibGUgMFxuXG5cbiAgbGV0IG5leHRfc3ogbiA9IEludC5taW4gKDMgKiBuIC8gMiArIDMpIFN5cy5tYXhfYXJyYXlfbGVuZ3RoXG4gIGxldCBwcmV2X3N6IG4gPSAoKG4gLSAzKSAqIDIgKyAyKSAvIDNcblxuICBsZXQgdGVzdF9zaHJpbmtfYnVja2V0IHQgPVxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLih0LnJvdmVyKSBpblxuICAgIGxldCBoYnVja2V0ID0gdC5oYXNoZXMuKHQucm92ZXIpIGluXG4gICAgbGV0IGxlbiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcHJldl9sZW4gPSBwcmV2X3N6IGxlbiBpblxuICAgIGxldCBsaXZlID0gY291bnRfYnVja2V0IDAgYnVja2V0IDAgaW5cbiAgICBpZiBsaXZlIDw9IHByZXZfbGVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCByZWMgbG9vcCBpIGogPVxuICAgICAgICBpZiBqID49IHByZXZfbGVuIHRoZW4gYmVnaW5cbiAgICAgICAgICBpZiBjaGVjayBidWNrZXQgaSB0aGVuIGxvb3AgKGkgKyAxKSBqXG4gICAgICAgICAgZWxzZSBpZiBjaGVjayBidWNrZXQgaiB0aGVuIGJlZ2luXG4gICAgICAgICAgICBibGl0IGJ1Y2tldCBqIGJ1Y2tldCBpIDE7XG4gICAgICAgICAgICBoYnVja2V0LihpKSA8LSBoYnVja2V0LihqKTtcbiAgICAgICAgICAgIGxvb3AgKGkgKyAxKSAoaiAtIDEpO1xuICAgICAgICAgIGVuZCBlbHNlIGxvb3AgaSAoaiAtIDEpO1xuICAgICAgICBlbmQ7XG4gICAgICBpblxuICAgICAgbG9vcCAwIChsZW5ndGggYnVja2V0IC0gMSk7XG4gICAgICBpZiBwcmV2X2xlbiA9IDAgdGhlbiBiZWdpblxuICAgICAgICB0LnRhYmxlLih0LnJvdmVyKSA8LSBlbXB0eWJ1Y2tldDtcbiAgICAgICAgdC5oYXNoZXMuKHQucm92ZXIpIDwtIFt8IHxdO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IG5ld2J1Y2tldCA9IHdlYWtfY3JlYXRlIHByZXZfbGVuIGluXG4gICAgICAgIGJsaXQgYnVja2V0IDAgbmV3YnVja2V0IDAgcHJldl9sZW47XG4gICAgICAgIHQudGFibGUuKHQucm92ZXIpIDwtIG5ld2J1Y2tldDtcbiAgICAgICAgdC5oYXNoZXMuKHQucm92ZXIpIDwtIEFycmF5LnN1YiBoYnVja2V0IDAgcHJldl9sZW5cbiAgICAgIGVuZDtcbiAgICAgIGlmIGxlbiA+IHQubGltaXQgJiYgcHJldl9sZW4gPD0gdC5saW1pdCB0aGVuIHQub3ZlcnNpemUgPC0gdC5vdmVyc2l6ZSAtIDE7XG4gICAgZW5kO1xuICAgIHQucm92ZXIgPC0gKHQucm92ZXIgKyAxKSBtb2QgKEFycmF5Lmxlbmd0aCB0LnRhYmxlKVxuXG5cbiAgbGV0IHJlYyByZXNpemUgdCA9XG4gICAgbGV0IG9sZGxlbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IG5ld2xlbiA9IG5leHRfc3ogb2xkbGVuIGluXG4gICAgaWYgbmV3bGVuID4gb2xkbGVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCBuZXd0ID0gY3JlYXRlIG5ld2xlbiBpblxuICAgICAgbGV0IGFkZF93ZWFrIG9iIG9oIG9pID1cbiAgICAgICAgbGV0IHNldHRlciBuYiBuaSBfID0gYmxpdCBvYiBvaSBuYiBuaSAxIGluXG4gICAgICAgIGxldCBoID0gb2guKG9pKSBpblxuICAgICAgICBhZGRfYXV4IG5ld3Qgc2V0dGVyIE5vbmUgaCAoZ2V0X2luZGV4IG5ld3QgaCk7XG4gICAgICBpblxuICAgICAgaXRlcl93ZWFrIGFkZF93ZWFrIHQ7XG4gICAgICB0LnRhYmxlIDwtIG5ld3QudGFibGU7XG4gICAgICB0Lmhhc2hlcyA8LSBuZXd0Lmhhc2hlcztcbiAgICAgIHQubGltaXQgPC0gbmV3dC5saW1pdDtcbiAgICAgIHQub3ZlcnNpemUgPC0gbmV3dC5vdmVyc2l6ZTtcbiAgICAgIHQucm92ZXIgPC0gdC5yb3ZlciBtb2QgQXJyYXkubGVuZ3RoIG5ld3QudGFibGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHQubGltaXQgPC0gbWF4X2ludDsgICAgICAgICAgICAgKCogbWF4aW11bSBzaXplIGFscmVhZHkgcmVhY2hlZCAqKVxuICAgICAgdC5vdmVyc2l6ZSA8LSAwO1xuICAgIGVuZFxuXG4gIGFuZCBhZGRfYXV4IHQgc2V0dGVyIGQgaCBpbmRleCA9XG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBiZWdpblxuICAgICAgICBsZXQgbmV3c3ogPVxuICAgICAgICAgIEludC5taW4gKDMgKiBzeiAvIDIgKyAzKSAoU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlcylcbiAgICAgICAgaW5cbiAgICAgICAgaWYgbmV3c3ogPD0gc3ogdGhlbiBmYWlsd2l0aCBcIldlYWsuTWFrZTogaGFzaCBidWNrZXQgY2Fubm90IGdyb3cgbW9yZVwiO1xuICAgICAgICBsZXQgbmV3YnVja2V0ID0gd2Vha19jcmVhdGUgbmV3c3ogaW5cbiAgICAgICAgbGV0IG5ld2hhc2hlcyA9IEFycmF5Lm1ha2UgbmV3c3ogMCBpblxuICAgICAgICBibGl0IGJ1Y2tldCAwIG5ld2J1Y2tldCAwIHN6O1xuICAgICAgICBBcnJheS5ibGl0IGhhc2hlcyAwIG5ld2hhc2hlcyAwIHN6O1xuICAgICAgICBzZXR0ZXIgbmV3YnVja2V0IHN6IGQ7XG4gICAgICAgIG5ld2hhc2hlcy4oc3opIDwtIGg7XG4gICAgICAgIHQudGFibGUuKGluZGV4KSA8LSBuZXdidWNrZXQ7XG4gICAgICAgIHQuaGFzaGVzLihpbmRleCkgPC0gbmV3aGFzaGVzO1xuICAgICAgICBpZiBzeiA8PSB0LmxpbWl0ICYmIG5ld3N6ID4gdC5saW1pdCB0aGVuIGJlZ2luXG4gICAgICAgICAgdC5vdmVyc2l6ZSA8LSB0Lm92ZXJzaXplICsgMTtcbiAgICAgICAgICBmb3IgX2kgPSAwIHRvIG92ZXJfbGltaXQgZG8gdGVzdF9zaHJpbmtfYnVja2V0IHQgZG9uZTtcbiAgICAgICAgZW5kO1xuICAgICAgICBpZiB0Lm92ZXJzaXplID4gQXJyYXkubGVuZ3RoIHQudGFibGUgLyBvdmVyX2xpbWl0IHRoZW4gcmVzaXplIHQ7XG4gICAgICBlbmQgZWxzZSBpZiBjaGVjayBidWNrZXQgaSB0aGVuIGJlZ2luXG4gICAgICAgIGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0dGVyIGJ1Y2tldCBpIGQ7XG4gICAgICAgIGhhc2hlcy4oaSkgPC0gaDtcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IGFkZCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBhZGRfYXV4IHQgc2V0IChTb21lIGQpIGggKGdldF9pbmRleCB0IGgpXG5cblxuICBsZXQgZmluZF9vciB0IGQgaWZub3Rmb3VuZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGxldCBpbmRleCA9IGdldF9pbmRleCB0IGggaW5cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGlmbm90Zm91bmQgaCBpbmRleFxuICAgICAgZWxzZSBpZiBoID0gaGFzaGVzLihpKSB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGdldF9jb3B5IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgfCBTb21lIHYgd2hlbiBILmVxdWFsIHYgZFxuICAgICAgICAgICAtPiBiZWdpbiBtYXRjaCBnZXQgYnVja2V0IGkgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgdiAtPiB2XG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSlcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgXyAtPiBsb29wIChpICsgMSlcbiAgICAgIGVuZCBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cblxuICBsZXQgbWVyZ2UgdCBkID1cbiAgICBmaW5kX29yIHQgZCAoZnVuIGggaW5kZXggLT4gYWRkX2F1eCB0IHNldCAoU29tZSBkKSBoIGluZGV4OyBkKVxuXG5cbiAgbGV0IGZpbmQgdCBkID0gZmluZF9vciB0IGQgKGZ1biBfaCBfaW5kZXggLT4gcmFpc2UgTm90X2ZvdW5kKVxuXG4gIGxldCBmaW5kX29wdCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBOb25lXG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkXG4gICAgICAgICAgIC0+IGJlZ2luIG1hdGNoIGdldCBidWNrZXQgaSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSBfIGFzIHYgLT4gdlxuICAgICAgICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICB8IF8gLT4gbG9vcCAoaSArIDEpXG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IGZpbmRfc2hhZG93IHQgZCBpZmZvdW5kIGlmbm90Zm91bmQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBpZm5vdGZvdW5kXG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkIC0+IGlmZm91bmQgYnVja2V0IGlcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuXG4gIGxldCByZW1vdmUgdCBkID0gZmluZF9zaGFkb3cgdCBkIChmdW4gdyBpIC0+IHNldCB3IGkgTm9uZSkgKClcblxuXG4gIGxldCBtZW0gdCBkID0gZmluZF9zaGFkb3cgdCBkIChmdW4gX3cgX2kgLT4gdHJ1ZSkgZmFsc2VcblxuXG4gIGxldCBmaW5kX2FsbCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpIGFjY3UgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGFjY3VcbiAgICAgIGVsc2UgaWYgaCA9IGhhc2hlcy4oaSkgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBnZXRfY29weSBidWNrZXQgaSB3aXRoXG4gICAgICAgIHwgU29tZSB2IHdoZW4gSC5lcXVhbCB2IGRcbiAgICAgICAgICAgLT4gYmVnaW4gbWF0Y2ggZ2V0IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIHYgLT4gbG9vcCAoaSArIDEpICh2IDo6IGFjY3UpXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSkgYWNjdVxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKSBhY2N1XG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSkgYWNjdVxuICAgIGluXG4gICAgbG9vcCAwIFtdXG5cblxuICBsZXQgc3RhdHMgdCA9XG4gICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IGxlbnMgPSBBcnJheS5tYXAgbGVuZ3RoIHQudGFibGUgaW5cbiAgICBBcnJheS5zb3J0IGNvbXBhcmUgbGVucztcbiAgICBsZXQgdG90bGVuID0gQXJyYXkuZm9sZF9sZWZ0ICggKyApIDAgbGVucyBpblxuICAgIChsZW4sIGNvdW50IHQsIHRvdGxlbiwgbGVucy4oMCksIGxlbnMuKGxlbi8yKSwgbGVucy4obGVuLTEpKVxuXG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgUGllcnJlIFdlaXMsIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBIHByZXR0eS1wcmludGluZyBmYWNpbGl0eSBhbmQgZGVmaW5pdGlvbiBvZiBmb3JtYXR0ZXJzIGZvciAncGFyYWxsZWwnXG4gICAoaS5lLiB1bnJlbGF0ZWQgb3IgaW5kZXBlbmRlbnQpIHByZXR0eS1wcmludGluZyBvbiBtdWx0aXBsZSBvdXQgY2hhbm5lbHMuICopXG5cbigqXG4gICBUaGUgcHJldHR5LXByaW50aW5nIGVuZ2luZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuXG4qKVxuXG5sZXQgaWQgeCA9IHhcblxuKCogQSBkZXZvdGVkIHR5cGUgZm9yIHNpemVzIHRvIGF2b2lkIGNvbmZ1c2lvblxuICAgYmV0d2VlbiBzaXplcyBhbmQgbWVyZSBpbnRlZ2Vycy4gKilcbm1vZHVsZSBTaXplIDogc2lnXG4gIHR5cGUgdFxuXG4gIHZhbCB0b19pbnQgOiB0IC0+IGludFxuICB2YWwgb2ZfaW50IDogaW50IC0+IHRcbiAgdmFsIHplcm8gOiB0XG4gIHZhbCB1bmtub3duIDogdFxuICB2YWwgaXNfa25vd24gOiB0IC0+IGJvb2xcbmVuZCAgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50XG5cbiAgbGV0IHRvX2ludCA9IGlkXG4gIGxldCBvZl9pbnQgPSBpZFxuICBsZXQgemVybyA9IDBcbiAgbGV0IHVua25vd24gPSAtMVxuICBsZXQgaXNfa25vd24gbiA9IG4gPj0gMFxuZW5kXG5cblxuXG4oKiBUaGUgcHJldHR5LXByaW50aW5nIGJveGVzIGRlZmluaXRpb246XG4gICBhIHByZXR0eS1wcmludGluZyBib3ggaXMgZWl0aGVyXG4gICAtIGhib3g6IGhvcml6b250YWwgYm94IChubyBsaW5lIHNwbGl0dGluZylcbiAgIC0gdmJveDogdmVydGljYWwgYm94IChldmVyeSBicmVhayBoaW50IHNwbGl0cyB0aGUgbGluZSlcbiAgIC0gaHZib3g6IGhvcml6b250YWwvdmVydGljYWwgYm94XG4gICAgICh0aGUgYm94IGJlaGF2ZXMgYXMgYW4gaG9yaXpvbnRhbCBib3ggaWYgaXQgZml0cyBvblxuICAgICAgdGhlIGN1cnJlbnQgbGluZSwgb3RoZXJ3aXNlIHRoZSBib3ggYmVoYXZlcyBhcyBhIHZlcnRpY2FsIGJveClcbiAgIC0gaG92Ym94OiBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGNvbXBhY3RpbmcgYm94XG4gICAgICh0aGUgYm94IGlzIGNvbXBhY3RpbmcgbWF0ZXJpYWwsIHByaW50aW5nIGFzIG11Y2ggbWF0ZXJpYWwgYXMgcG9zc2libGVcbiAgICAgIG9uIGV2ZXJ5IGxpbmVzKVxuICAgLSBib3g6IGhvcml6b250YWwgb3IgdmVydGljYWwgY29tcGFjdGluZyBib3ggd2l0aCBlbmhhbmNlZCBib3ggc3RydWN0dXJlXG4gICAgICh0aGUgYm94IGJlaGF2ZXMgYXMgYW4gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBib3ggYnV0IGJyZWFrIGhpbnRzIHNwbGl0XG4gICAgICB0aGUgbGluZSBpZiBzcGxpdHRpbmcgd291bGQgbW92ZSB0byB0aGUgbGVmdClcbiopXG50eXBlIGJveF90eXBlID0gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmJsb2NrX3R5cGUgPVxuICB8IFBwX2hib3ggfCBQcF92Ym94IHwgUHBfaHZib3ggfCBQcF9ob3Zib3ggfCBQcF9ib3ggfCBQcF9maXRzXG5cblxuKCogVGhlIHByZXR0eS1wcmludGluZyB0b2tlbnMgZGVmaW5pdGlvbjpcbiAgIGFyZSBlaXRoZXIgdGV4dCB0byBwcmludCBvciBwcmV0dHkgcHJpbnRpbmdcbiAgIGVsZW1lbnRzIHRoYXQgZHJpdmUgaW5kZW50YXRpb24gYW5kIGxpbmUgc3BsaXR0aW5nLiAqKVxudHlwZSBwcF90b2tlbiA9XG4gIHwgUHBfdGV4dCBvZiBzdHJpbmcgICAgICAgICAgKCogbm9ybWFsIHRleHQgKilcbiAgfCBQcF9icmVhayBvZiB7ICAgICAgICAgICAgICAoKiBjb21wbGV0ZSBicmVhayAqKVxuICAgICAgZml0czogc3RyaW5nICogaW50ICogc3RyaW5nOyAgICgqIGxpbmUgaXMgbm90IHNwbGl0ICopXG4gICAgICBicmVha3M6IHN0cmluZyAqIGludCAqIHN0cmluZzsgKCogbGluZSBpcyBzcGxpdCAqKVxuICAgIH1cbiAgfCBQcF90YnJlYWsgb2YgaW50ICogaW50ICAgICAoKiBnbyB0byBuZXh0IHRhYnVsYXRpb24gKilcbiAgfCBQcF9zdGFiICAgICAgICAgICAgICAgICAgICAoKiBzZXQgYSB0YWJ1bGF0aW9uICopXG4gIHwgUHBfYmVnaW4gb2YgaW50ICogYm94X3R5cGUgKCogYmVnaW5uaW5nIG9mIGEgYm94ICopXG4gIHwgUHBfZW5kICAgICAgICAgICAgICAgICAgICAgKCogZW5kIG9mIGEgYm94ICopXG4gIHwgUHBfdGJlZ2luIG9mIHRib3ggICAgICAgICAgKCogYmVnaW5uaW5nIG9mIGEgdGFidWxhdGlvbiBib3ggKilcbiAgfCBQcF90ZW5kICAgICAgICAgICAgICAgICAgICAoKiBlbmQgb2YgYSB0YWJ1bGF0aW9uIGJveCAqKVxuICB8IFBwX25ld2xpbmUgICAgICAgICAgICAgICAgICgqIHRvIGZvcmNlIGEgbmV3bGluZSBpbnNpZGUgYSBib3ggKilcbiAgfCBQcF9pZl9uZXdsaW5lICAgICAgICAgICAgICAoKiB0byBkbyBzb21ldGhpbmcgb25seSBpZiB0aGlzIHZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGhhcyBiZWVuIGJyb2tlbiAqKVxuICB8IFBwX29wZW5fdGFnIG9mIHN0YWcgICAgICAgICAoKiBvcGVuaW5nIGEgdGFnIG5hbWUgKilcbiAgfCBQcF9jbG9zZV90YWcgICAgICAgICAgICAgICAoKiBjbG9zaW5nIHRoZSBtb3N0IHJlY2VudGx5IG9wZW4gdGFnICopXG5cbmFuZCBzdGFnID0gLi5cblxuYW5kIHRib3ggPSBQcF90Ym94IG9mIGludCBsaXN0IHJlZiAgKCogVGFidWxhdGlvbiBib3ggKilcblxudHlwZSB0YWcgPSBzdHJpbmdcbnR5cGUgc3RhZyArPSBTdHJpbmdfdGFnIG9mIHRhZ1xuXG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZTpcbiAgIHByZXR0eS1wcmludGluZyBtYXRlcmlhbCBpcyBub3Qgd3JpdHRlbiBpbiB0aGUgb3V0cHV0IGFzIHNvb24gYXMgZW1pdHRlZDtcbiAgIGluc3RlYWQsIHRoZSBtYXRlcmlhbCBpcyBzaW1wbHkgcmVjb3JkZWQgaW4gdGhlIHByZXR0eS1wcmludGVyIHF1ZXVlLFxuICAgdW50aWwgdGhlIGVuY2xvc2luZyBib3ggaGFzIGEga25vd24gY29tcHV0ZWQgc2l6ZSBhbmQgcHJvcGVyIHNwbGl0dGluZ1xuICAgZGVjaXNpb25zIGNhbiBiZSBtYWRlLlxuXG4gICBUaGUgcHJldHR5LXByaW50ZXIgcXVldWUgY29udGFpbnMgZm9ybWF0dGluZyBlbGVtZW50cyB0byBiZSBwcmludGVkLlxuICAgRWFjaCBmb3JtYXR0aW5nIGVsZW1lbnQgaXMgYSB0dXBsZSAoc2l6ZSwgdG9rZW4sIGxlbmd0aCksIHdoZXJlXG4gICAtIGxlbmd0aCBpcyB0aGUgZGVjbGFyZWQgbGVuZ3RoIG9mIHRoZSB0b2tlbixcbiAgIC0gc2l6ZSBpcyBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgdG9rZW4gd2hlbiBpdCBpcyBwcmludGVkXG4gICAgIChzaXplIGlzIHNldCB3aGVuIHRoZSBzaXplIG9mIHRoZSBib3ggaXMga25vd24sIHNvIHRoYXQgc2l6ZSBvZiBicmVha1xuICAgICAgaGludHMgYXJlIGRlZmluaXRpdmUpLiAqKVxudHlwZSBwcF9xdWV1ZV9lbGVtID0ge1xuICBtdXRhYmxlIHNpemUgOiBTaXplLnQ7XG4gIHRva2VuIDogcHBfdG9rZW47XG4gIGxlbmd0aCA6IGludDtcbn1cblxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgcXVldWUgZGVmaW5pdGlvbi4gKilcbnR5cGUgcHBfcXVldWUgPSBwcF9xdWV1ZV9lbGVtIFF1ZXVlLnRcblxuKCogVGhlIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrLiAqKVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2s6IHNjYW5uaW5nIGVsZW1lbnQgZGVmaW5pdGlvbi4gKilcbnR5cGUgcHBfc2Nhbl9lbGVtID0ge1xuICBsZWZ0X3RvdGFsIDogaW50OyAoKiBWYWx1ZSBvZiBwcF9sZWZ0X3RvdGFsIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGVucXVldWVkLiAqKVxuICBxdWV1ZV9lbGVtIDogcHBfcXVldWVfZWxlbVxufVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjazpcbiAgIHRoZSBmb3JtYXR0aW5nIHN0YWNrIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiBhbGwgdGhlIGN1cnJlbnRseSBhY3RpdmVcbiAgIGJveGVzOyB0aGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjayBpcyB1c2VkIHRvIHNwbGl0IHRoZSBsaW5lc1xuICAgd2hpbGUgcHJpbnRpbmcgdG9rZW5zLiAqKVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjazogZm9ybWF0dGluZyBzdGFjayBlbGVtZW50IGRlZmluaXRpb24uXG4gICBFYWNoIHN0YWNrIGVsZW1lbnQgZGVzY3JpYmVzIGEgcHJldHR5LXByaW50aW5nIGJveC4gKilcbnR5cGUgcHBfZm9ybWF0X2VsZW0gPSB7IGJveF90eXBlIDogYm94X3R5cGU7IHdpZHRoIDogaW50IH1cblxuKCogVGhlIGZvcm1hdHRlciBkZWZpbml0aW9uLlxuICAgRWFjaCBmb3JtYXR0ZXIgdmFsdWUgaXMgYSBwcmV0dHktcHJpbnRlciBpbnN0YW5jZSB3aXRoIGFsbCBpdHNcbiAgIG1hY2hpbmVyeS4gKilcbnR5cGUgZm9ybWF0dGVyID0ge1xuICAoKiBUaGUgcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2suICopXG4gIHBwX3NjYW5fc3RhY2sgOiBwcF9zY2FuX2VsZW0gU3RhY2sudDtcbiAgKCogVGhlIHByZXR0eS1wcmludGVyIGZvcm1hdHRpbmcgc3RhY2suICopXG4gIHBwX2Zvcm1hdF9zdGFjayA6IHBwX2Zvcm1hdF9lbGVtIFN0YWNrLnQ7XG4gIHBwX3Rib3hfc3RhY2sgOiB0Ym94IFN0YWNrLnQ7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBzZW1hbnRpY3MgdGFnIHN0YWNrLiAqKVxuICBwcF90YWdfc3RhY2sgOiBzdGFnIFN0YWNrLnQ7XG4gIHBwX21hcmtfc3RhY2sgOiBzdGFnIFN0YWNrLnQ7XG4gICgqIFZhbHVlIG9mIHJpZ2h0IG1hcmdpbi4gKilcbiAgbXV0YWJsZSBwcF9tYXJnaW4gOiBpbnQ7XG4gICgqIE1pbmltYWwgc3BhY2UgbGVmdCBiZWZvcmUgbWFyZ2luLCB3aGVuIG9wZW5pbmcgYSBib3guICopXG4gIG11dGFibGUgcHBfbWluX3NwYWNlX2xlZnQgOiBpbnQ7XG4gICgqIE1heGltdW0gdmFsdWUgb2YgaW5kZW50YXRpb246XG4gICAgIG5vIGJveCBjYW4gYmUgb3BlbmVkIGZ1cnRoZXIuICopXG4gIG11dGFibGUgcHBfbWF4X2luZGVudCA6IGludDtcbiAgKCogU3BhY2UgcmVtYWluaW5nIG9uIHRoZSBjdXJyZW50IGxpbmUuICopXG4gIG11dGFibGUgcHBfc3BhY2VfbGVmdCA6IGludDtcbiAgKCogQ3VycmVudCB2YWx1ZSBvZiBpbmRlbnRhdGlvbi4gKilcbiAgbXV0YWJsZSBwcF9jdXJyZW50X2luZGVudCA6IGludDtcbiAgKCogVHJ1ZSB3aGVuIHRoZSBsaW5lIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgcHJldHR5LXByaW50ZXIuICopXG4gIG11dGFibGUgcHBfaXNfbmV3X2xpbmUgOiBib29sO1xuICAoKiBUb3RhbCB3aWR0aCBvZiB0b2tlbnMgYWxyZWFkeSBwcmludGVkLiAqKVxuICBtdXRhYmxlIHBwX2xlZnRfdG90YWwgOiBpbnQ7XG4gICgqIFRvdGFsIHdpZHRoIG9mIHRva2VucyBldmVyIHB1dCBpbiBxdWV1ZS4gKilcbiAgbXV0YWJsZSBwcF9yaWdodF90b3RhbCA6IGludDtcbiAgKCogQ3VycmVudCBudW1iZXIgb2Ygb3BlbiBib3hlcy4gKilcbiAgbXV0YWJsZSBwcF9jdXJyX2RlcHRoIDogaW50O1xuICAoKiBNYXhpbXVtIG51bWJlciBvZiBib3hlcyB3aGljaCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkgb3Blbi4gKilcbiAgbXV0YWJsZSBwcF9tYXhfYm94ZXMgOiBpbnQ7XG4gICgqIEVsbGlwc2lzIHN0cmluZy4gKilcbiAgbXV0YWJsZSBwcF9lbGxpcHNpcyA6IHN0cmluZztcbiAgKCogT3V0cHV0IGZ1bmN0aW9uLiAqKVxuICBtdXRhYmxlIHBwX291dF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0O1xuICAoKiBGbHVzaGluZyBmdW5jdGlvbi4gKilcbiAgbXV0YWJsZSBwcF9vdXRfZmx1c2ggOiB1bml0IC0+IHVuaXQ7XG4gICgqIE91dHB1dCBvZiBuZXcgbGluZXMuICopXG4gIG11dGFibGUgcHBfb3V0X25ld2xpbmUgOiB1bml0IC0+IHVuaXQ7XG4gICgqIE91dHB1dCBvZiBicmVhayBoaW50cyBzcGFjZXMuICopXG4gIG11dGFibGUgcHBfb3V0X3NwYWNlcyA6IGludCAtPiB1bml0O1xuICAoKiBPdXRwdXQgb2YgaW5kZW50YXRpb24gb2YgbmV3IGxpbmVzLiAqKVxuICBtdXRhYmxlIHBwX291dF9pbmRlbnQgOiBpbnQgLT4gdW5pdDtcbiAgKCogQXJlIHRhZ3MgcHJpbnRlZCA/ICopXG4gIG11dGFibGUgcHBfcHJpbnRfdGFncyA6IGJvb2w7XG4gICgqIEFyZSB0YWdzIG1hcmtlZCA/ICopXG4gIG11dGFibGUgcHBfbWFya190YWdzIDogYm9vbDtcbiAgKCogRmluZCBvcGVuaW5nIGFuZCBjbG9zaW5nIG1hcmtlcnMgb2YgdGFncy4gKilcbiAgbXV0YWJsZSBwcF9tYXJrX29wZW5fdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIG11dGFibGUgcHBfbWFya19jbG9zZV90YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgbXV0YWJsZSBwcF9wcmludF9vcGVuX3RhZyA6IHN0YWcgLT4gdW5pdDtcbiAgbXV0YWJsZSBwcF9wcmludF9jbG9zZV90YWcgOiBzdGFnIC0+IHVuaXQ7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZS4gKilcbiAgcHBfcXVldWUgOiBwcF9xdWV1ZTtcbn1cblxuXG4oKiBUaGUgZm9ybWF0dGVyIHNwZWNpZmljIHRhZyBoYW5kbGluZyBmdW5jdGlvbnMuICopXG50eXBlIGZvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyA9IHtcbiAgbWFya19vcGVuX3N0YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgbWFya19jbG9zZV9zdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIHByaW50X29wZW5fc3RhZyA6IHN0YWcgLT4gdW5pdDtcbiAgcHJpbnRfY2xvc2Vfc3RhZyA6IHN0YWcgLT4gdW5pdDtcbn1cblxuXG4oKiBUaGUgZm9ybWF0dGVyIGZ1bmN0aW9ucyB0byBvdXRwdXQgbWF0ZXJpYWwuICopXG50eXBlIGZvcm1hdHRlcl9vdXRfZnVuY3Rpb25zID0ge1xuICBvdXRfc3RyaW5nIDogc3RyaW5nIC0+IGludCAtPiBpbnQgLT4gdW5pdDtcbiAgb3V0X2ZsdXNoIDogdW5pdCAtPiB1bml0O1xuICBvdXRfbmV3bGluZSA6IHVuaXQgLT4gdW5pdDtcbiAgb3V0X3NwYWNlcyA6IGludCAtPiB1bml0O1xuICBvdXRfaW5kZW50IDogaW50IC0+IHVuaXQ7XG59XG5cblxuKCpcblxuICBBdXhpbGlhcmllcyBhbmQgYmFzaWMgZnVuY3Rpb25zLlxuXG4qKVxuXG4oKiBFbnRlciBhIHRva2VuIGluIHRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZS4gKilcbmxldCBwcF9lbnF1ZXVlIHN0YXRlIHRva2VuID1cbiAgc3RhdGUucHBfcmlnaHRfdG90YWwgPC0gc3RhdGUucHBfcmlnaHRfdG90YWwgKyB0b2tlbi5sZW5ndGg7XG4gIFF1ZXVlLmFkZCB0b2tlbiBzdGF0ZS5wcF9xdWV1ZVxuXG5cbmxldCBwcF9jbGVhcl9xdWV1ZSBzdGF0ZSA9XG4gIHN0YXRlLnBwX2xlZnRfdG90YWwgPC0gMTsgc3RhdGUucHBfcmlnaHRfdG90YWwgPC0gMTtcbiAgUXVldWUuY2xlYXIgc3RhdGUucHBfcXVldWVcblxuXG4oKiBQcF9pbmZpbml0eTogbGFyZ2UgdmFsdWUgZm9yIGRlZmF1bHQgdG9rZW5zIHNpemUuXG5cbiAgIFBwX2luZmluaXR5IGlzIGRvY3VtZW50ZWQgYXMgYmVpbmcgZ3JlYXRlciB0aGFuIDFlMTA7IHRvIGF2b2lkXG4gICBjb25mdXNpb24gYWJvdXQgdGhlIHdvcmQgJ2dyZWF0ZXInLCB3ZSBjaG9vc2UgcHBfaW5maW5pdHkgZ3JlYXRlclxuICAgdGhhbiAxZTEwICsgMTsgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgdGVzdHMgaW4gdGhlIGFsZ29yaXRobSxcbiAgIHBwX2luZmluaXR5IG11c3QgYmUgZXZlbiBvbmUgbW9yZSB0aGFuIDFlMTAgKyAxOyBsZXQncyBzdGFuZCBvbiB0aGVcbiAgIHNhZmUgc2lkZSBieSBjaG9vc2luZyAxLmUxMCsxMC5cblxuICAgUHBfaW5maW5pdHkgY291bGQgcHJvYmFibHkgYmUgMTA3Mzc0MTgyMyB0aGF0IGlzIDJeMzAgLSAxLCB0aGF0IGlzXG4gICB0aGUgbWluaW1hbCB1cHBlciBib3VuZCBmb3IgaW50ZWdlcnM7IG5vdyB0aGF0IG1heF9pbnQgaXMgZGVmaW5lZCxcbiAgIHRoaXMgbGltaXQgY291bGQgYWxzbyBiZSBkZWZpbmVkIGFzIG1heF9pbnQgLSAxLlxuXG4gICBIb3dldmVyLCBiZWZvcmUgc2V0dGluZyBwcF9pbmZpbml0eSB0byBzb21ldGhpbmcgYXJvdW5kIG1heF9pbnQsIHdlXG4gICBtdXN0IGNhcmVmdWxseSBkb3VibGUtY2hlY2sgYWxsIHRoZSBpbnRlZ2VyIGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuICAgdGhhdCBpbnZvbHZlIHBwX2luZmluaXR5LCBzaW5jZSBhbnkgb3ZlcmZsb3cgd291bGQgd3JlY2sgaGF2b2MgdGhlXG4gICBwcmV0dHktcHJpbnRpbmcgYWxnb3JpdGhtJ3MgaW52YXJpYW50cy4gR2l2ZW4gdGhhdCB0aGlzIGFyaXRobWV0aWNcbiAgIGNvcnJlY3RuZXNzIGNoZWNrIGlzIGRpZmZpY3VsdCBhbmQgZXJyb3IgcHJvbmUgYW5kIGdpdmVuIHRoYXQgMWUxMFxuICAgKyAxIGlzIGluIHByYWN0aWNlIGxhcmdlIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZCB0byBhdHRlbXB0IHRvIHNldFxuICAgcHBfaW5maW5pdHkgdG8gdGhlIHRoZW9yZXRpY2FsbHkgbWF4aW11bSBsaW1pdC4gSXQgaXMgbm90IHdvcnRoIHRoZVxuICAgYnVyZGVuICEgKilcbmxldCBwcF9pbmZpbml0eSA9IDEwMDAwMDAwMTBcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBmb3IgdGhlIGZvcm1hdHRlci4gKilcbmxldCBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIHMgPSBzdGF0ZS5wcF9vdXRfc3RyaW5nIHMgMCAoU3RyaW5nLmxlbmd0aCBzKVxuYW5kIHBwX291dHB1dF9uZXdsaW5lIHN0YXRlID0gc3RhdGUucHBfb3V0X25ld2xpbmUgKClcbmFuZCBwcF9vdXRwdXRfc3BhY2VzIHN0YXRlIG4gPSBzdGF0ZS5wcF9vdXRfc3BhY2VzIG5cbmFuZCBwcF9vdXRwdXRfaW5kZW50IHN0YXRlIG4gPSBzdGF0ZS5wcF9vdXRfaW5kZW50IG5cblxuKCogRm9ybWF0IGEgdGV4dHVhbCB0b2tlbiAqKVxubGV0IGZvcm1hdF9wcF90ZXh0IHN0YXRlIHNpemUgdGV4dCA9XG4gIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfc3BhY2VfbGVmdCAtIHNpemU7XG4gIHBwX291dHB1dF9zdHJpbmcgc3RhdGUgdGV4dDtcbiAgc3RhdGUucHBfaXNfbmV3X2xpbmUgPC0gZmFsc2VcblxuKCogRm9ybWF0IGEgc3RyaW5nIGJ5IGl0cyBsZW5ndGgsIGlmIG5vdCBlbXB0eSAqKVxubGV0IGZvcm1hdF9zdHJpbmcgc3RhdGUgcyA9XG4gIGlmIHMgPD4gXCJcIiB0aGVuIGZvcm1hdF9wcF90ZXh0IHN0YXRlIChTdHJpbmcubGVuZ3RoIHMpIHNcblxuKCogVG8gZm9ybWF0IGEgYnJlYWssIGluZGVudGluZyBhIG5ldyBsaW5lLiAqKVxubGV0IGJyZWFrX25ld19saW5lIHN0YXRlIChiZWZvcmUsIG9mZnNldCwgYWZ0ZXIpIHdpZHRoID1cbiAgZm9ybWF0X3N0cmluZyBzdGF0ZSBiZWZvcmU7XG4gIHBwX291dHB1dF9uZXdsaW5lIHN0YXRlO1xuICBzdGF0ZS5wcF9pc19uZXdfbGluZSA8LSB0cnVlO1xuICBsZXQgaW5kZW50ID0gc3RhdGUucHBfbWFyZ2luIC0gd2lkdGggKyBvZmZzZXQgaW5cbiAgKCogRG9uJ3QgaW5kZW50IG1vcmUgdGhhbiBwcF9tYXhfaW5kZW50LiAqKVxuICBsZXQgcmVhbF9pbmRlbnQgPSBJbnQubWluIHN0YXRlLnBwX21heF9pbmRlbnQgaW5kZW50IGluXG4gIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50IDwtIHJlYWxfaW5kZW50O1xuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50O1xuICBwcF9vdXRwdXRfaW5kZW50IHN0YXRlIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50O1xuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGFmdGVyXG5cblxuKCogVG8gZm9yY2UgYSBsaW5lIGJyZWFrIGluc2lkZSBhIGJveDogbm8gb2Zmc2V0IGlzIGFkZGVkLiAqKVxubGV0IGJyZWFrX2xpbmUgc3RhdGUgd2lkdGggPSBicmVha19uZXdfbGluZSBzdGF0ZSAoXCJcIiwgMCwgXCJcIikgd2lkdGhcblxuKCogVG8gZm9ybWF0IGEgYnJlYWsgdGhhdCBmaXRzIG9uIHRoZSBjdXJyZW50IGxpbmUuICopXG5sZXQgYnJlYWtfc2FtZV9saW5lIHN0YXRlIChiZWZvcmUsIHdpZHRoLCBhZnRlcikgPVxuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGJlZm9yZTtcbiAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IC0gd2lkdGg7XG4gIHBwX291dHB1dF9zcGFjZXMgc3RhdGUgd2lkdGg7XG4gIGZvcm1hdF9zdHJpbmcgc3RhdGUgYWZ0ZXJcblxuXG4oKiBUbyBpbmRlbnQgbm8gbW9yZSB0aGFuIHBwX21heF9pbmRlbnQsIGlmIG9uZSB0cmllcyB0byBvcGVuIGEgYm94XG4gICBiZXlvbmQgcHBfbWF4X2luZGVudCwgdGhlbiB0aGUgYm94IGlzIHJlamVjdGVkIG9uIHRoZSBsZWZ0XG4gICBieSBzaW11bGF0aW5nIGEgYnJlYWsuICopXG5sZXQgcHBfZm9yY2VfYnJlYWtfbGluZSBzdGF0ZSA9XG4gIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfZm9ybWF0X3N0YWNrIHdpdGhcbiAgfCBOb25lIC0+IHBwX291dHB1dF9uZXdsaW5lIHN0YXRlXG4gIHwgU29tZSB7IGJveF90eXBlOyB3aWR0aCB9IC0+XG4gICAgaWYgd2lkdGggPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0IHRoZW5cbiAgICAgIG1hdGNoIGJveF90eXBlIHdpdGhcbiAgICAgIHwgUHBfZml0cyB8IFBwX2hib3ggLT4gKClcbiAgICAgIHwgUHBfdmJveCB8IFBwX2h2Ym94IHwgUHBfaG92Ym94IHwgUHBfYm94IC0+IGJyZWFrX2xpbmUgc3RhdGUgd2lkdGhcblxuXG4oKiBUbyBza2lwIGEgdG9rZW4sIGlmIHRoZSBwcmV2aW91cyBsaW5lIGhhcyBiZWVuIGJyb2tlbi4gKilcbmxldCBwcF9za2lwX3Rva2VuIHN0YXRlID1cbiAgbWF0Y2ggUXVldWUudGFrZV9vcHQgc3RhdGUucHBfcXVldWUgd2l0aFxuICB8IE5vbmUgLT4gKCkgKCogcHJpbnRfaWZfbmV3bGluZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBwcmludGluZyBjb21tYW5kICopXG4gIHwgU29tZSB7IHNpemU7IGxlbmd0aDsgXyB9IC0+XG4gICAgc3RhdGUucHBfbGVmdF90b3RhbCA8LSBzdGF0ZS5wcF9sZWZ0X3RvdGFsIC0gbGVuZ3RoO1xuICAgIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfc3BhY2VfbGVmdCArIFNpemUudG9faW50IHNpemVcblxuXG4oKlxuXG4gIFRoZSBtYWluIHByZXR0eSBwcmludGluZyBmdW5jdGlvbnMuXG5cbiopXG5cbigqIEZvcm1hdHRpbmcgYSB0b2tlbiB3aXRoIGEgZ2l2ZW4gc2l6ZS4gKilcbmxldCBmb3JtYXRfcHBfdG9rZW4gc3RhdGUgc2l6ZSA9IGZ1bmN0aW9uXG5cbiAgfCBQcF90ZXh0IHMgLT5cbiAgICBmb3JtYXRfcHBfdGV4dCBzdGF0ZSBzaXplIHNcblxuICB8IFBwX2JlZ2luIChvZmYsIHR5KSAtPlxuICAgIGxldCBpbnNlcnRpb25fcG9pbnQgPSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IGluXG4gICAgaWYgaW5zZXJ0aW9uX3BvaW50ID4gc3RhdGUucHBfbWF4X2luZGVudCB0aGVuXG4gICAgICAoKiBjYW4gbm90IG9wZW4gYSBib3ggcmlnaHQgdGhlcmUuICopXG4gICAgICBiZWdpbiBwcF9mb3JjZV9icmVha19saW5lIHN0YXRlIGVuZDtcbiAgICBsZXQgd2lkdGggPSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IC0gb2ZmIGluXG4gICAgbGV0IGJveF90eXBlID1cbiAgICAgIG1hdGNoIHR5IHdpdGhcbiAgICAgIHwgUHBfdmJveCAtPiBQcF92Ym94XG4gICAgICB8IFBwX2hib3ggfCBQcF9odmJveCB8IFBwX2hvdmJveCB8IFBwX2JveCB8IFBwX2ZpdHMgLT5cbiAgICAgICAgaWYgc2l6ZSA+IHN0YXRlLnBwX3NwYWNlX2xlZnQgdGhlbiB0eSBlbHNlIFBwX2ZpdHMgaW5cbiAgICBTdGFjay5wdXNoIHsgYm94X3R5cGU7IHdpZHRoIH0gc3RhdGUucHBfZm9ybWF0X3N0YWNrXG5cbiAgfCBQcF9lbmQgLT5cbiAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB8PiBpZ25vcmVcblxuICB8IFBwX3RiZWdpbiAoUHBfdGJveCBfIGFzIHRib3gpIC0+XG4gICAgU3RhY2sucHVzaCB0Ym94IHN0YXRlLnBwX3Rib3hfc3RhY2tcblxuICB8IFBwX3RlbmQgLT5cbiAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX3Rib3hfc3RhY2sgfD4gaWdub3JlXG5cbiAgfCBQcF9zdGFiIC0+XG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF90Ym94X3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gKCkgKCogTm8gb3BlbiB0YWJ1bGF0aW9uIGJveC4gKilcbiAgICB8IFNvbWUgKFBwX3Rib3ggdGFicykgLT5cbiAgICAgIGxldCByZWMgYWRkX3RhYiBuID0gZnVuY3Rpb25cbiAgICAgICAgfCBbXSAtPiBbbl1cbiAgICAgICAgfCB4IDo6IGwgYXMgbHMgLT4gaWYgbiA8IHggdGhlbiBuIDo6IGxzIGVsc2UgeCA6OiBhZGRfdGFiIG4gbCBpblxuICAgICAgdGFicyA6PSBhZGRfdGFiIChzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0KSAhdGFic1xuICAgIGVuZFxuXG4gIHwgUHBfdGJyZWFrIChuLCBvZmYpIC0+XG4gICAgbGV0IGluc2VydGlvbl9wb2ludCA9IHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnQgaW5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX3Rib3hfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBvcGVuIHRhYnVsYXRpb24gYm94LiAqKVxuICAgIHwgU29tZSAoUHBfdGJveCB0YWJzKSAtPlxuICAgICAgbGV0IHRhYiA9XG4gICAgICAgIG1hdGNoICF0YWJzIHdpdGhcbiAgICAgICAgfCBbXSAtPiBpbnNlcnRpb25fcG9pbnRcbiAgICAgICAgfCBmaXJzdCA6OiBfIC0+XG4gICAgICAgICAgbGV0IHJlYyBmaW5kID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgaGVhZCA6OiB0YWlsIC0+XG4gICAgICAgICAgICAgIGlmIGhlYWQgPj0gaW5zZXJ0aW9uX3BvaW50IHRoZW4gaGVhZCBlbHNlIGZpbmQgdGFpbFxuICAgICAgICAgICAgfCBbXSAtPiBmaXJzdCBpblxuICAgICAgICAgIGZpbmQgIXRhYnMgaW5cbiAgICAgIGxldCBvZmZzZXQgPSB0YWIgLSBpbnNlcnRpb25fcG9pbnQgaW5cbiAgICAgIGlmIG9mZnNldCA+PSAwXG4gICAgICB0aGVuIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSAoXCJcIiwgb2Zmc2V0ICsgbiwgXCJcIilcbiAgICAgIGVsc2UgYnJlYWtfbmV3X2xpbmUgc3RhdGUgKFwiXCIsIHRhYiArIG9mZiwgXCJcIikgc3RhdGUucHBfbWFyZ2luXG4gICAgZW5kXG5cbiAgfCBQcF9uZXdsaW5lIC0+XG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9mb3JtYXRfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZSAoKiBObyBvcGVuIGJveC4gKilcbiAgICB8IFNvbWUgeyB3aWR0aDsgX30gLT4gYnJlYWtfbGluZSBzdGF0ZSB3aWR0aFxuICAgIGVuZFxuXG4gIHwgUHBfaWZfbmV3bGluZSAtPlxuICAgIGlmIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50ICE9IHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnRcbiAgICB0aGVuIHBwX3NraXBfdG9rZW4gc3RhdGVcblxuICB8IFBwX2JyZWFrIHsgZml0czsgYnJlYWtzIH0gLT5cbiAgICBsZXQgYmVmb3JlLCBvZmYsIF8gPSBicmVha3MgaW5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+ICgpICgqIE5vIG9wZW4gYm94LiAqKVxuICAgIHwgU29tZSB7IGJveF90eXBlOyB3aWR0aCB9IC0+XG4gICAgICBiZWdpbiBtYXRjaCBib3hfdHlwZSB3aXRoXG4gICAgICB8IFBwX2hvdmJveCAtPlxuICAgICAgICBpZiBzaXplICsgU3RyaW5nLmxlbmd0aCBiZWZvcmUgPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0XG4gICAgICAgIHRoZW4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICAgIGVsc2UgYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIHwgUHBfYm94IC0+XG4gICAgICAgICgqIEhhdmUgdGhlIGxpbmUganVzdCBiZWVuIGJyb2tlbiBoZXJlID8gKilcbiAgICAgICAgaWYgc3RhdGUucHBfaXNfbmV3X2xpbmUgdGhlbiBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0cyBlbHNlXG4gICAgICAgIGlmIHNpemUgKyBTdHJpbmcubGVuZ3RoIGJlZm9yZSA+IHN0YXRlLnBwX3NwYWNlX2xlZnRcbiAgICAgICAgICB0aGVuIGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aCBlbHNlXG4gICAgICAgICgqIGJyZWFrIHRoZSBsaW5lIGhlcmUgbGVhZHMgdG8gbmV3IGluZGVudGF0aW9uID8gKilcbiAgICAgICAgaWYgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgPiBzdGF0ZS5wcF9tYXJnaW4gLSB3aWR0aCArIG9mZlxuICAgICAgICB0aGVuIGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgICBlbHNlIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICB8IFBwX2h2Ym94IC0+IGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgfCBQcF9maXRzIC0+IGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICB8IFBwX3Zib3ggLT4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICB8IFBwX2hib3ggLT4gYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIGVuZFxuICAgIGVuZFxuXG4gICB8IFBwX29wZW5fdGFnIHRhZ19uYW1lIC0+XG4gICAgIGxldCBtYXJrZXIgPSBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnIHRhZ19uYW1lIGluXG4gICAgIHBwX291dHB1dF9zdHJpbmcgc3RhdGUgbWFya2VyO1xuICAgICBTdGFjay5wdXNoIHRhZ19uYW1lIHN0YXRlLnBwX21hcmtfc3RhY2tcblxuICAgfCBQcF9jbG9zZV90YWcgLT5cbiAgICAgYmVnaW4gbWF0Y2ggU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9tYXJrX3N0YWNrIHdpdGhcbiAgICAgfCBOb25lIC0+ICgpICgqIE5vIG1vcmUgdGFnIHRvIGNsb3NlLiAqKVxuICAgICB8IFNvbWUgdGFnX25hbWUgLT5cbiAgICAgICBsZXQgbWFya2VyID0gc3RhdGUucHBfbWFya19jbG9zZV90YWcgdGFnX25hbWUgaW5cbiAgICAgICBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIG1hcmtlclxuICAgICBlbmRcblxuXG4oKiBQcmludCBpZiB0b2tlbiBzaXplIGlzIGtub3duIGVsc2UgcHJpbnRpbmcgaXMgZGVsYXllZC5cbiAgIFByaW50aW5nIGlzIGRlbGF5ZWQgd2hlbiB0aGUgdGV4dCB3YWl0aW5nIGluIHRoZSBxdWV1ZSByZXF1aXJlc1xuICAgbW9yZSByb29tIHRvIGZvcm1hdCB0aGFuIGV4aXN0cyBvbiB0aGUgY3VycmVudCBsaW5lLiAqKVxubGV0IHJlYyBhZHZhbmNlX2xlZnQgc3RhdGUgPVxuICBtYXRjaCBRdWV1ZS5wZWVrX29wdCBzdGF0ZS5wcF9xdWV1ZSB3aXRoXG4gIHwgTm9uZSAtPiAoKSAoKiBObyB0b2tlbnMgdG8gcHJpbnQgKilcbiAgfCBTb21lIHsgc2l6ZTsgdG9rZW47IGxlbmd0aCB9IC0+XG4gICAgbGV0IHBlbmRpbmdfY291bnQgPSBzdGF0ZS5wcF9yaWdodF90b3RhbCAtIHN0YXRlLnBwX2xlZnRfdG90YWwgaW5cbiAgICBpZiBTaXplLmlzX2tub3duIHNpemUgfHwgcGVuZGluZ19jb3VudCA+PSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IHRoZW4gYmVnaW5cbiAgICAgIFF1ZXVlLnRha2Ugc3RhdGUucHBfcXVldWUgfD4gaWdub3JlOyAoKiBOb3QgZW1wdHk6IHdlIHBlZWsgaW50byBpdCAqKVxuICAgICAgbGV0IHNpemUgPSBpZiBTaXplLmlzX2tub3duIHNpemUgdGhlbiBTaXplLnRvX2ludCBzaXplIGVsc2UgcHBfaW5maW5pdHkgaW5cbiAgICAgIGZvcm1hdF9wcF90b2tlbiBzdGF0ZSBzaXplIHRva2VuO1xuICAgICAgc3RhdGUucHBfbGVmdF90b3RhbCA8LSBsZW5ndGggKyBzdGF0ZS5wcF9sZWZ0X3RvdGFsO1xuICAgICAgKGFkdmFuY2VfbGVmdCBbQHRhaWxjYWxsXSkgc3RhdGVcbiAgICBlbmRcblxuXG4oKiBUbyBlbnF1ZXVlIGEgdG9rZW4gOiB0cnkgdG8gYWR2YW5jZS4gKilcbmxldCBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgdG9rID0gcHBfZW5xdWV1ZSBzdGF0ZSB0b2s7IGFkdmFuY2VfbGVmdCBzdGF0ZVxuXG5cbigqIFRvIGVucXVldWUgc3RyaW5ncy4gKilcbmxldCBlbnF1ZXVlX3N0cmluZ19hcyBzdGF0ZSBzaXplIHMgPVxuICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgeyBzaXplOyB0b2tlbiA9IFBwX3RleHQgczsgbGVuZ3RoID0gU2l6ZS50b19pbnQgc2l6ZSB9XG5cblxubGV0IGVucXVldWVfc3RyaW5nIHN0YXRlIHMgPVxuICBlbnF1ZXVlX3N0cmluZ19hcyBzdGF0ZSAoU2l6ZS5vZl9pbnQgKFN0cmluZy5sZW5ndGggcykpIHNcblxuXG4oKiBSb3V0aW5lcyBmb3Igc2NhbiBzdGFja1xuICAgZGV0ZXJtaW5lIHNpemUgb2YgYm94ZXMuICopXG5cbigqIFRoZSBzY2FuX3N0YWNrIGlzIG5ldmVyIGVtcHR5LiAqKVxubGV0IGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGFjayA9XG4gIFN0YWNrLmNsZWFyIHN0YWNrO1xuICBsZXQgcXVldWVfZWxlbSA9IHsgc2l6ZSA9IFNpemUudW5rbm93bjsgdG9rZW4gPSBQcF90ZXh0IFwiXCI7IGxlbmd0aCA9IDAgfSBpblxuICBTdGFjay5wdXNoIHsgbGVmdF90b3RhbCA9IC0xOyBxdWV1ZV9lbGVtIH0gc3RhY2tcblxuKCogU2V0dGluZyB0aGUgc2l6ZSBvZiBib3hlcyBvbiBzY2FuIHN0YWNrOlxuICAgaWYgdHkgPSB0cnVlIHRoZW4gc2l6ZSBvZiBicmVhayBpcyBzZXQgZWxzZSBzaXplIG9mIGJveCBpcyBzZXQ7XG4gICBpbiBlYWNoIGNhc2UgcHBfc2Nhbl9zdGFjayBpcyBwb3BwZWQuXG5cbiAgIE5vdGU6XG4gICBQYXR0ZXJuIG1hdGNoaW5nIG9uIHNjYW4gc3RhY2sgaXMgZXhoYXVzdGl2ZSwgc2luY2Ugc2Nhbl9zdGFjayBpcyBuZXZlclxuICAgZW1wdHkuXG4gICBQYXR0ZXJuIG1hdGNoaW5nIG9uIHRva2VuIGluIHNjYW4gc3RhY2sgaXMgYWxzbyBleGhhdXN0aXZlLFxuICAgc2luY2Ugc2Nhbl9wdXNoIGlzIHVzZWQgb24gYnJlYWtzIGFuZCBvcGVuaW5nIG9mIGJveGVzLiAqKVxubGV0IHNldF9zaXplIHN0YXRlIHR5ID1cbiAgbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9zY2FuX3N0YWNrIHdpdGhcbiAgfCBOb25lIC0+ICgpICgqIHNjYW5fc3RhY2sgaXMgbmV2ZXIgZW1wdHkuICopXG4gIHwgU29tZSB7IGxlZnRfdG90YWw7IHF1ZXVlX2VsZW0gfSAtPlxuICAgIGxldCBzaXplID0gU2l6ZS50b19pbnQgcXVldWVfZWxlbS5zaXplIGluXG4gICAgKCogdGVzdCBpZiBzY2FuIHN0YWNrIGNvbnRhaW5zIGFueSBkYXRhIHRoYXQgaXMgbm90IG9ic29sZXRlLiAqKVxuICAgIGlmIGxlZnRfdG90YWwgPCBzdGF0ZS5wcF9sZWZ0X3RvdGFsIHRoZW5cbiAgICAgIGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGF0ZS5wcF9zY2FuX3N0YWNrXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggcXVldWVfZWxlbS50b2tlbiB3aXRoXG4gICAgICB8IFBwX2JyZWFrIF8gfCBQcF90YnJlYWsgKF8sIF8pIC0+XG4gICAgICAgIGlmIHR5IHRoZW4gYmVnaW5cbiAgICAgICAgICBxdWV1ZV9lbGVtLnNpemUgPC0gU2l6ZS5vZl9pbnQgKHN0YXRlLnBwX3JpZ2h0X3RvdGFsICsgc2l6ZSk7XG4gICAgICAgICAgU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9zY2FuX3N0YWNrIHw+IGlnbm9yZVxuICAgICAgICBlbmRcbiAgICAgIHwgUHBfYmVnaW4gKF8sIF8pIC0+XG4gICAgICAgIGlmIG5vdCB0eSB0aGVuIGJlZ2luXG4gICAgICAgICAgcXVldWVfZWxlbS5zaXplIDwtIFNpemUub2ZfaW50IChzdGF0ZS5wcF9yaWdodF90b3RhbCArIHNpemUpO1xuICAgICAgICAgIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfc2Nhbl9zdGFjayB8PiBpZ25vcmVcbiAgICAgICAgZW5kXG4gICAgICB8IFBwX3RleHQgXyB8IFBwX3N0YWIgfCBQcF90YmVnaW4gXyB8IFBwX3RlbmQgfCBQcF9lbmRcbiAgICAgIHwgUHBfbmV3bGluZSB8IFBwX2lmX25ld2xpbmUgfCBQcF9vcGVuX3RhZyBfIHwgUHBfY2xvc2VfdGFnIC0+XG4gICAgICAgICgpICgqIHNjYW5fcHVzaCBpcyBvbmx5IHVzZWQgZm9yIGJyZWFrcyBhbmQgYm94ZXMuICopXG5cblxuKCogUHVzaCBhIHRva2VuIG9uIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrLlxuICAgSWYgYiBpcyB0cnVlIHNldF9zaXplIGlzIGNhbGxlZC4gKilcbmxldCBzY2FuX3B1c2ggc3RhdGUgYiB0b2tlbiA9XG4gIHBwX2VucXVldWUgc3RhdGUgdG9rZW47XG4gIGlmIGIgdGhlbiBzZXRfc2l6ZSBzdGF0ZSB0cnVlO1xuICBsZXQgZWxlbSA9IHsgbGVmdF90b3RhbCA9IHN0YXRlLnBwX3JpZ2h0X3RvdGFsOyBxdWV1ZV9lbGVtID0gdG9rZW4gfSBpblxuICBTdGFjay5wdXNoIGVsZW0gc3RhdGUucHBfc2Nhbl9zdGFja1xuXG5cbigqIFRvIG9wZW4gYSBuZXcgYm94IDpcbiAgIHRoZSB1c2VyIG1heSBzZXQgdGhlIGRlcHRoIGJvdW5kIHBwX21heF9ib3hlc1xuICAgYW55IHRleHQgbmVzdGVkIGRlZXBlciBpcyBwcmludGVkIGFzIHRoZSBlbGxpcHNpcyBzdHJpbmcuICopXG5sZXQgcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBicl90eSA9XG4gIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCArIDE7XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS5vZl9pbnQgKC0gc3RhdGUucHBfcmlnaHRfdG90YWwpIGluXG4gICAgbGV0IGVsZW0gPSB7IHNpemU7IHRva2VuID0gUHBfYmVnaW4gKGluZGVudCwgYnJfdHkpOyBsZW5ndGggPSAwIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgZmFsc2UgZWxlbSBlbHNlXG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPSBzdGF0ZS5wcF9tYXhfYm94ZXNcbiAgdGhlbiBlbnF1ZXVlX3N0cmluZyBzdGF0ZSBzdGF0ZS5wcF9lbGxpcHNpc1xuXG5cbigqIFRoZSBib3ggd2hpY2ggaXMgYWx3YXlzIG9wZW4uICopXG5sZXQgcHBfb3Blbl9zeXNfYm94IHN0YXRlID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIDAgUHBfaG92Ym94XG5cbigqIENsb3NlIGEgYm94LCBzZXR0aW5nIHNpemVzIG9mIGl0cyBzdWIgYm94ZXMuICopXG5sZXQgcHBfY2xvc2VfYm94IHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA+IDEgdGhlblxuICBiZWdpblxuICAgIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGJlZ2luXG4gICAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9lbmQ7IGxlbmd0aCA9IDAgfTtcbiAgICAgIHNldF9zaXplIHN0YXRlIHRydWU7IHNldF9zaXplIHN0YXRlIGZhbHNlXG4gICAgZW5kO1xuICAgIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCAtIDE7XG4gIGVuZFxuXG5cbigqIE9wZW4gYSB0YWcsIHB1c2hpbmcgaXQgb24gdGhlIHRhZyBzdGFjay4gKilcbmxldCBwcF9vcGVuX3N0YWcgc3RhdGUgdGFnX25hbWUgPVxuICBpZiBzdGF0ZS5wcF9wcmludF90YWdzIHRoZW5cbiAgYmVnaW5cbiAgICBTdGFjay5wdXNoIHRhZ19uYW1lIHN0YXRlLnBwX3RhZ19zdGFjaztcbiAgICBzdGF0ZS5wcF9wcmludF9vcGVuX3RhZyB0YWdfbmFtZVxuICBlbmQ7XG4gIGlmIHN0YXRlLnBwX21hcmtfdGFncyB0aGVuXG4gICAgbGV0IHRva2VuID0gUHBfb3Blbl90YWcgdGFnX25hbWUgaW5cbiAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW47IGxlbmd0aCA9IDAgfVxuXG5cbigqIENsb3NlIGEgdGFnLCBwb3BwaW5nIGl0IGZyb20gdGhlIHRhZyBzdGFjay4gKilcbmxldCBwcF9jbG9zZV9zdGFnIHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfbWFya190YWdzIHRoZW5cbiAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9jbG9zZV90YWc7IGxlbmd0aCA9IDAgfTtcbiAgaWYgc3RhdGUucHBfcHJpbnRfdGFncyB0aGVuXG4gICAgbWF0Y2ggU3RhY2sucG9wX29wdCBzdGF0ZS5wcF90YWdfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBtb3JlIHRhZyB0byBjbG9zZS4gKilcbiAgICB8IFNvbWUgdGFnX25hbWUgLT5cbiAgICAgIHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZyB0YWdfbmFtZVxuXG5sZXQgcHBfb3Blbl90YWcgc3RhdGUgcyA9IHBwX29wZW5fc3RhZyBzdGF0ZSAoU3RyaW5nX3RhZyBzKVxubGV0IHBwX2Nsb3NlX3RhZyBzdGF0ZSAoKSA9IHBwX2Nsb3NlX3N0YWcgc3RhdGUgKClcblxubGV0IHBwX3NldF9wcmludF90YWdzIHN0YXRlIGIgPSBzdGF0ZS5wcF9wcmludF90YWdzIDwtIGJcbmxldCBwcF9zZXRfbWFya190YWdzIHN0YXRlIGIgPSBzdGF0ZS5wcF9tYXJrX3RhZ3MgPC0gYlxubGV0IHBwX2dldF9wcmludF90YWdzIHN0YXRlICgpID0gc3RhdGUucHBfcHJpbnRfdGFnc1xubGV0IHBwX2dldF9tYXJrX3RhZ3Mgc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXJrX3RhZ3NcbmxldCBwcF9zZXRfdGFncyBzdGF0ZSBiID1cbiAgcHBfc2V0X3ByaW50X3RhZ3Mgc3RhdGUgYjsgcHBfc2V0X21hcmtfdGFncyBzdGF0ZSBiXG5cblxuKCogSGFuZGxpbmcgdGFnIGhhbmRsaW5nIGZ1bmN0aW9uczogZ2V0L3NldCBmdW5jdGlvbnMuICopXG5sZXQgcHBfZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyBzdGF0ZSAoKSA9IHtcbiAgbWFya19vcGVuX3N0YWcgPSBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnO1xuICBtYXJrX2Nsb3NlX3N0YWcgPSBzdGF0ZS5wcF9tYXJrX2Nsb3NlX3RhZztcbiAgcHJpbnRfb3Blbl9zdGFnID0gc3RhdGUucHBfcHJpbnRfb3Blbl90YWc7XG4gIHByaW50X2Nsb3NlX3N0YWcgPSBzdGF0ZS5wcF9wcmludF9jbG9zZV90YWc7XG59XG5cblxubGV0IHBwX3NldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgc3RhdGUge1xuICAgICBtYXJrX29wZW5fc3RhZyA9IG1vdDtcbiAgICAgbWFya19jbG9zZV9zdGFnID0gbWN0O1xuICAgICBwcmludF9vcGVuX3N0YWcgPSBwb3Q7XG4gICAgIHByaW50X2Nsb3NlX3N0YWcgPSBwY3Q7XG4gIH0gPVxuICBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnIDwtIG1vdDtcbiAgc3RhdGUucHBfbWFya19jbG9zZV90YWcgPC0gbWN0O1xuICBzdGF0ZS5wcF9wcmludF9vcGVuX3RhZyA8LSBwb3Q7XG4gIHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZyA8LSBwY3RcblxuXG4oKiBJbml0aWFsaXplIHByZXR0eS1wcmludGVyLiAqKVxubGV0IHBwX3Jpbml0IHN0YXRlID1cbiAgcHBfY2xlYXJfcXVldWUgc3RhdGU7XG4gIGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGF0ZS5wcF9zY2FuX3N0YWNrO1xuICBTdGFjay5jbGVhciBzdGF0ZS5wcF9mb3JtYXRfc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX3Rib3hfc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX3RhZ19zdGFjaztcbiAgU3RhY2suY2xlYXIgc3RhdGUucHBfbWFya19zdGFjaztcbiAgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgPC0gMDtcbiAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSAwO1xuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX21hcmdpbjtcbiAgcHBfb3Blbl9zeXNfYm94IHN0YXRlXG5cbmxldCBjbGVhcl90YWdfc3RhY2sgc3RhdGUgPVxuICBTdGFjay5pdGVyIChmdW4gXyAtPiBwcF9jbG9zZV90YWcgc3RhdGUgKCkpIHN0YXRlLnBwX3RhZ19zdGFja1xuXG5cbigqIEZsdXNoaW5nIHByZXR0eS1wcmludGVyIHF1ZXVlLiAqKVxubGV0IHBwX2ZsdXNoX3F1ZXVlIHN0YXRlIGIgPVxuICBjbGVhcl90YWdfc3RhY2sgc3RhdGU7XG4gIHdoaWxlIHN0YXRlLnBwX2N1cnJfZGVwdGggPiAxIGRvXG4gICAgcHBfY2xvc2VfYm94IHN0YXRlICgpXG4gIGRvbmU7XG4gIHN0YXRlLnBwX3JpZ2h0X3RvdGFsIDwtIHBwX2luZmluaXR5O1xuICBhZHZhbmNlX2xlZnQgc3RhdGU7XG4gIGlmIGIgdGhlbiBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZTtcbiAgcHBfcmluaXQgc3RhdGVcblxuKCpcblxuICBQcm9jZWR1cmVzIHRvIGZvcm1hdCB2YWx1ZXMgYW5kIHVzZSBib3hlcy5cblxuKilcblxuKCogVG8gZm9ybWF0IGEgc3RyaW5nLiAqKVxubGV0IHBwX3ByaW50X2FzX3NpemUgc3RhdGUgc2l6ZSBzID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlc1xuICB0aGVuIGVucXVldWVfc3RyaW5nX2FzIHN0YXRlIHNpemUgc1xuXG5cbmxldCBwcF9wcmludF9hcyBzdGF0ZSBpc2l6ZSBzID1cbiAgcHBfcHJpbnRfYXNfc2l6ZSBzdGF0ZSAoU2l6ZS5vZl9pbnQgaXNpemUpIHNcblxuXG5sZXQgcHBfcHJpbnRfc3RyaW5nIHN0YXRlIHMgPVxuICBwcF9wcmludF9hcyBzdGF0ZSAoU3RyaW5nLmxlbmd0aCBzKSBzXG5cbmxldCBwcF9wcmludF9ieXRlcyBzdGF0ZSBzID1cbiAgcHBfcHJpbnRfYXMgc3RhdGUgKEJ5dGVzLmxlbmd0aCBzKSAoQnl0ZXMudG9fc3RyaW5nIHMpXG5cbigqIFRvIGZvcm1hdCBhbiBpbnRlZ2VyLiAqKVxubGV0IHBwX3ByaW50X2ludCBzdGF0ZSBpID0gcHBfcHJpbnRfc3RyaW5nIHN0YXRlIChJbnQudG9fc3RyaW5nIGkpXG5cbigqIFRvIGZvcm1hdCBhIGZsb2F0LiAqKVxubGV0IHBwX3ByaW50X2Zsb2F0IHN0YXRlIGYgPSBwcF9wcmludF9zdHJpbmcgc3RhdGUgKHN0cmluZ19vZl9mbG9hdCBmKVxuXG4oKiBUbyBmb3JtYXQgYSBib29sZWFuLiAqKVxubGV0IHBwX3ByaW50X2Jvb2wgc3RhdGUgYiA9IHBwX3ByaW50X3N0cmluZyBzdGF0ZSAoc3RyaW5nX29mX2Jvb2wgYilcblxuKCogVG8gZm9ybWF0IGEgY2hhci4gKilcbmxldCBwcF9wcmludF9jaGFyIHN0YXRlIGMgPVxuICBwcF9wcmludF9hcyBzdGF0ZSAxIChTdHJpbmcubWFrZSAxIGMpXG5cblxuKCogT3BlbmluZyBib3hlcy4gKilcbmxldCBwcF9vcGVuX2hib3ggc3RhdGUgKCkgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgMCBQcF9oYm94XG5hbmQgcHBfb3Blbl92Ym94IHN0YXRlIGluZGVudCA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgUHBfdmJveFxuXG5hbmQgcHBfb3Blbl9odmJveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX2h2Ym94XG5hbmQgcHBfb3Blbl9ob3Zib3ggc3RhdGUgaW5kZW50ID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBQcF9ob3Zib3hcbmFuZCBwcF9vcGVuX2JveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX2JveFxuXG5cbigqIFByaW50aW5nIHF1ZXVlZCB0ZXh0LlxuXG4gICBbcHBfcHJpbnRfZmx1c2hdIHByaW50cyBhbGwgcGVuZGluZyBpdGVtcyBpbiB0aGUgcHJldHR5LXByaW50ZXIgcXVldWUgYW5kXG4gICB0aGVuIGZsdXNoZXMgdGhlIGxvdyBsZXZlbCBvdXRwdXQgZGV2aWNlIG9mIHRoZSBmb3JtYXR0ZXIgdG8gYWN0dWFsbHlcbiAgIGRpc3BsYXkgcHJpbnRpbmcgbWF0ZXJpYWwuXG5cbiAgIFtwcF9wcmludF9uZXdsaW5lXSBiZWhhdmVzIGFzIFtwcF9wcmludF9mbHVzaF0gYWZ0ZXIgcHJpbnRpbmcgYW4gYWRkaXRpb25hbFxuICAgbmV3IGxpbmUuICopXG5sZXQgcHBfcHJpbnRfbmV3bGluZSBzdGF0ZSAoKSA9XG4gIHBwX2ZsdXNoX3F1ZXVlIHN0YXRlIHRydWU7IHN0YXRlLnBwX291dF9mbHVzaCAoKVxuYW5kIHBwX3ByaW50X2ZsdXNoIHN0YXRlICgpID1cbiAgcHBfZmx1c2hfcXVldWUgc3RhdGUgZmFsc2U7IHN0YXRlLnBwX291dF9mbHVzaCAoKVxuXG5cbigqIFRvIGdldCBhIG5ld2xpbmUgd2hlbiBvbmUgZG9lcyBub3Qgd2FudCB0byBjbG9zZSB0aGUgY3VycmVudCBib3guICopXG5sZXQgcHBfZm9yY2VfbmV3bGluZSBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfbmV3bGluZTsgbGVuZ3RoID0gMCB9XG5cblxuKCogVG8gZm9ybWF0IHNvbWV0aGluZywgb25seSBpbiBjYXNlIHRoZSBsaW5lIGhhcyBqdXN0IGJlZW4gYnJva2VuLiAqKVxubGV0IHBwX3ByaW50X2lmX25ld2xpbmUgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGVcbiAgICAgIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9pZl9uZXdsaW5lOyBsZW5ndGggPSAwIH1cblxuXG4oKiBHZW5lcmFsaXplZCBicmVhayBoaW50IHRoYXQgYWxsb3dzIHByaW50aW5nIHN0cmluZ3MgYmVmb3JlL2FmdGVyXG4gICBzYW1lLWxpbmUgb2Zmc2V0ICh3aWR0aCkgb3IgbmV3LWxpbmUgb2Zmc2V0ICopXG5sZXQgcHBfcHJpbnRfY3VzdG9tX2JyZWFrIHN0YXRlIH5maXRzIH5icmVha3MgPVxuICBsZXQgYmVmb3JlLCB3aWR0aCwgYWZ0ZXIgPSBmaXRzIGluXG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS5vZl9pbnQgKC0gc3RhdGUucHBfcmlnaHRfdG90YWwpIGluXG4gICAgbGV0IHRva2VuID0gUHBfYnJlYWsgeyBmaXRzOyBicmVha3MgfSBpblxuICAgIGxldCBsZW5ndGggPSBTdHJpbmcubGVuZ3RoIGJlZm9yZSArIHdpZHRoICsgU3RyaW5nLmxlbmd0aCBhZnRlciBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbjsgbGVuZ3RoIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgdHJ1ZSBlbGVtXG5cbigqIFByaW50aW5nIGJyZWFrIGhpbnRzOlxuICAgQSBicmVhayBoaW50IGluZGljYXRlcyB3aGVyZSBhIGJveCBtYXkgYmUgYnJva2VuLlxuICAgSWYgbGluZSBpcyBicm9rZW4gdGhlbiBvZmZzZXQgaXMgYWRkZWQgdG8gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50XG4gICBib3ggZWxzZSAodGhlIHZhbHVlIG9mKSB3aWR0aCBibGFua3MgYXJlIHByaW50ZWQuICopXG5sZXQgcHBfcHJpbnRfYnJlYWsgc3RhdGUgd2lkdGggb2Zmc2V0ID1cbiAgcHBfcHJpbnRfY3VzdG9tX2JyZWFrIHN0YXRlXG4gICAgfmZpdHM6KFwiXCIsIHdpZHRoLCBcIlwiKSB+YnJlYWtzOihcIlwiLCBvZmZzZXQsIFwiXCIpXG5cblxuKCogUHJpbnQgYSBzcGFjZSA6XG4gICBhIHNwYWNlIGlzIGEgYnJlYWsgaGludCB0aGF0IHByaW50cyBhIHNpbmdsZSBzcGFjZSBpZiB0aGUgYnJlYWsgZG9lcyBub3RcbiAgIHNwbGl0IHRoZSBsaW5lO1xuICAgYSBjdXQgaXMgYSBicmVhayBoaW50IHRoYXQgcHJpbnRzIG5vdGhpbmcgaWYgdGhlIGJyZWFrIGRvZXMgbm90IHNwbGl0IHRoZVxuICAgbGluZS4gKilcbmxldCBwcF9wcmludF9zcGFjZSBzdGF0ZSAoKSA9IHBwX3ByaW50X2JyZWFrIHN0YXRlIDEgMFxuYW5kIHBwX3ByaW50X2N1dCBzdGF0ZSAoKSA9IHBwX3ByaW50X2JyZWFrIHN0YXRlIDAgMFxuXG5cbigqIFRhYnVsYXRpb24gYm94ZXMuICopXG5sZXQgcHBfb3Blbl90Ym94IHN0YXRlICgpID1cbiAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSBzdGF0ZS5wcF9jdXJyX2RlcHRoICsgMTtcbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IHNpemUgPSBTaXplLnplcm8gaW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZTsgdG9rZW4gPSBQcF90YmVnaW4gKFBwX3Rib3ggKHJlZiBbXSkpOyBsZW5ndGggPSAwIH0gaW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgZWxlbVxuXG5cbigqIENsb3NlIGEgdGFidWxhdGlvbiBib3guICopXG5sZXQgcHBfY2xvc2VfdGJveCBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPiAxIHRoZW5cbiAgYmVnaW5cbiAgIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgICBsZXQgZWxlbSA9IHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF90ZW5kOyBsZW5ndGggPSAwIH0gaW5cbiAgICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIGVsZW07XG4gICAgIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCAtIDFcbiAgZW5kXG5cblxuKCogUHJpbnQgYSB0YWJ1bGF0aW9uIGJyZWFrLiAqKVxubGV0IHBwX3ByaW50X3RicmVhayBzdGF0ZSB3aWR0aCBvZmZzZXQgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgc2l6ZSA9IFNpemUub2ZfaW50ICgtIHN0YXRlLnBwX3JpZ2h0X3RvdGFsKSBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbiA9IFBwX3RicmVhayAod2lkdGgsIG9mZnNldCk7IGxlbmd0aCA9IHdpZHRoIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgdHJ1ZSBlbGVtXG5cblxubGV0IHBwX3ByaW50X3RhYiBzdGF0ZSAoKSA9IHBwX3ByaW50X3RicmVhayBzdGF0ZSAwIDBcblxubGV0IHBwX3NldF90YWIgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9zdGFiOyBsZW5ndGggPSAwIH0gaW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgZWxlbVxuXG5cbigqXG5cbiAgUHJvY2VkdXJlcyB0byBjb250cm9sIHRoZSBwcmV0dHktcHJpbnRlcnNcblxuKilcblxuKCogU2V0X21heF9ib3hlcy4gKilcbmxldCBwcF9zZXRfbWF4X2JveGVzIHN0YXRlIG4gPSBpZiBuID4gMSB0aGVuIHN0YXRlLnBwX21heF9ib3hlcyA8LSBuXG5cbigqIFRvIGtub3cgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgYWxsb3dlZC4gKilcbmxldCBwcF9nZXRfbWF4X2JveGVzIHN0YXRlICgpID0gc3RhdGUucHBfbWF4X2JveGVzXG5cbmxldCBwcF9vdmVyX21heF9ib3hlcyBzdGF0ZSAoKSA9IHN0YXRlLnBwX2N1cnJfZGVwdGggPSBzdGF0ZS5wcF9tYXhfYm94ZXNcblxuKCogRWxsaXBzaXMuICopXG5sZXQgcHBfc2V0X2VsbGlwc2lzX3RleHQgc3RhdGUgcyA9IHN0YXRlLnBwX2VsbGlwc2lzIDwtIHNcbmFuZCBwcF9nZXRfZWxsaXBzaXNfdGV4dCBzdGF0ZSAoKSA9IHN0YXRlLnBwX2VsbGlwc2lzXG5cblxuKCogVG8gc2V0IHRoZSBtYXJnaW4gb2YgcHJldHR5LXByaW50ZXIuICopXG5sZXQgcHBfbGltaXQgbiA9XG4gIGlmIG4gPCBwcF9pbmZpbml0eSB0aGVuIG4gZWxzZSBwcmVkIHBwX2luZmluaXR5XG5cblxuKCogSW50ZXJuYWwgcHJldHR5LXByaW50ZXIgZnVuY3Rpb25zLiAqKVxubGV0IHBwX3NldF9taW5fc3BhY2VfbGVmdCBzdGF0ZSBuID1cbiAgaWYgbiA+PSAxIHRoZW5cbiAgICBsZXQgbiA9IHBwX2xpbWl0IG4gaW5cbiAgICBzdGF0ZS5wcF9taW5fc3BhY2VfbGVmdCA8LSBuO1xuICAgIHN0YXRlLnBwX21heF9pbmRlbnQgPC0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfbWluX3NwYWNlX2xlZnQ7XG4gICAgcHBfcmluaXQgc3RhdGVcblxuXG4oKiBJbml0aWFsbHksIHdlIGhhdmUgOlxuICAgcHBfbWF4X2luZGVudCA9IHBwX21hcmdpbiAtIHBwX21pbl9zcGFjZV9sZWZ0LCBhbmRcbiAgIHBwX3NwYWNlX2xlZnQgPSBwcF9tYXJnaW4uICopXG5sZXQgcHBfc2V0X21heF9pbmRlbnQgc3RhdGUgbiA9XG4gIGlmIG4gPiAxIHRoZW5cbiAgICBwcF9zZXRfbWluX3NwYWNlX2xlZnQgc3RhdGUgKHN0YXRlLnBwX21hcmdpbiAtIG4pXG5cblxubGV0IHBwX2dldF9tYXhfaW5kZW50IHN0YXRlICgpID0gc3RhdGUucHBfbWF4X2luZGVudFxuXG5sZXQgcHBfc2V0X21hcmdpbiBzdGF0ZSBuID1cbiAgaWYgbiA+PSAxIHRoZW5cbiAgICBsZXQgbiA9IHBwX2xpbWl0IG4gaW5cbiAgICBzdGF0ZS5wcF9tYXJnaW4gPC0gbjtcbiAgICBsZXQgbmV3X21heF9pbmRlbnQgPVxuICAgICAgKCogVHJ5IHRvIG1haW50YWluIG1heF9pbmRlbnQgdG8gaXRzIGFjdHVhbCB2YWx1ZS4gKilcbiAgICAgIGlmIHN0YXRlLnBwX21heF9pbmRlbnQgPD0gc3RhdGUucHBfbWFyZ2luXG4gICAgICB0aGVuIHN0YXRlLnBwX21heF9pbmRlbnQgZWxzZVxuICAgICAgKCogSWYgcG9zc2libGUgbWFpbnRhaW4gcHBfbWluX3NwYWNlX2xlZnQgdG8gaXRzIGFjdHVhbCB2YWx1ZSxcbiAgICAgICAgIGlmIHRoaXMgbGVhZHMgdG8gYSB0b28gc21hbGwgbWF4X2luZGVudCwgdGFrZSBoYWxmIG9mIHRoZVxuICAgICAgICAgbmV3IG1hcmdpbiwgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIDEuICopXG4gICAgICAgSW50Lm1heCAoSW50Lm1heCAoc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfbWluX3NwYWNlX2xlZnQpXG4gICAgICAgICAgICAgICAgKHN0YXRlLnBwX21hcmdpbiAvIDIpKSAxIGluXG4gICAgKCogUmVidWlsZCBpbnZhcmlhbnRzLiAqKVxuICAgIHBwX3NldF9tYXhfaW5kZW50IHN0YXRlIG5ld19tYXhfaW5kZW50XG5cblxuKCoqIEdlb21ldHJ5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgKilcbnR5cGUgZ2VvbWV0cnkgPSB7IG1heF9pbmRlbnQ6aW50OyBtYXJnaW46IGludH1cblxubGV0IHZhbGlkYXRlX2dlb21ldHJ5IHttYXJnaW47IG1heF9pbmRlbnR9ID1cbiAgaWYgbWF4X2luZGVudCA8IDIgdGhlblxuICAgIEVycm9yIFwibWF4X2luZGVudCA8IDJcIlxuICBlbHNlIGlmIG1hcmdpbiA8PSBtYXhfaW5kZW50IHRoZW5cbiAgICBFcnJvciBcIm1hcmdpbiA8PSBtYXhfaW5kZW50XCJcbiAgZWxzZSBPayAoKVxuXG5sZXQgY2hlY2tfZ2VvbWV0cnkgZ2VvbWV0cnkgPVxuICBtYXRjaCB2YWxpZGF0ZV9nZW9tZXRyeSBnZW9tZXRyeSB3aXRoXG4gIHwgT2sgKCkgLT4gdHJ1ZVxuICB8IEVycm9yIF8gLT4gZmFsc2VcblxubGV0IHBwX2dldF9tYXJnaW4gc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXJnaW5cblxubGV0IHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlIHttYXJnaW47IG1heF9pbmRlbnR9ID1cbiAgcHBfc2V0X21hcmdpbiBzdGF0ZSBtYXJnaW47XG4gIHBwX3NldF9tYXhfaW5kZW50IHN0YXRlIG1heF9pbmRlbnQ7XG4gICgpXG5cbmxldCBwcF9zZXRfZ2VvbWV0cnkgc3RhdGUgfm1heF9pbmRlbnQgfm1hcmdpbiA9XG4gIGxldCBnZW9tZXRyeSA9IHsgbWF4X2luZGVudDsgbWFyZ2luIH0gaW5cbiAgbWF0Y2ggdmFsaWRhdGVfZ2VvbWV0cnkgZ2VvbWV0cnkgd2l0aFxuICB8IEVycm9yIG1zZyAtPlxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcIkZvcm1hdC5wcF9zZXRfZ2VvbWV0cnk6IFwiIF4gbXNnKSlcbiAgfCBPayAoKSAtPlxuICAgIHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlIGdlb21ldHJ5XG5cbmxldCBwcF9zYWZlX3NldF9nZW9tZXRyeSBzdGF0ZSB+bWF4X2luZGVudCB+bWFyZ2luID1cbiAgbGV0IGdlb21ldHJ5ID0geyBtYXhfaW5kZW50OyBtYXJnaW4gfSBpblxuICBtYXRjaCB2YWxpZGF0ZV9nZW9tZXRyeSBnZW9tZXRyeSB3aXRoXG4gIHwgRXJyb3IgX21zZyAtPlxuICAgICAoKVxuICB8IE9rICgpIC0+XG4gICAgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUgZ2VvbWV0cnlcblxubGV0IHBwX2dldF9nZW9tZXRyeSBzdGF0ZSAoKSA9XG4gIHsgbWFyZ2luID0gcHBfZ2V0X21hcmdpbiBzdGF0ZSAoKTsgbWF4X2luZGVudCA9IHBwX2dldF9tYXhfaW5kZW50IHN0YXRlICgpIH1cblxubGV0IHBwX3VwZGF0ZV9nZW9tZXRyeSBzdGF0ZSB1cGRhdGUgPVxuICBsZXQgZ2VvbWV0cnkgPSBwcF9nZXRfZ2VvbWV0cnkgc3RhdGUgKCkgaW5cbiAgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUgKHVwZGF0ZSBnZW9tZXRyeSlcblxuKCogU2V0dGluZyBhIGZvcm1hdHRlciBiYXNpYyBvdXRwdXQgZnVuY3Rpb25zLiAqKVxubGV0IHBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGF0ZSB7XG4gICAgICBvdXRfc3RyaW5nID0gZjtcbiAgICAgIG91dF9mbHVzaCA9IGc7XG4gICAgICBvdXRfbmV3bGluZSA9IGg7XG4gICAgICBvdXRfc3BhY2VzID0gaTtcbiAgICAgIG91dF9pbmRlbnQgPSBqO1xuICAgIH0gPVxuICBzdGF0ZS5wcF9vdXRfc3RyaW5nIDwtIGY7XG4gIHN0YXRlLnBwX291dF9mbHVzaCA8LSBnO1xuICBzdGF0ZS5wcF9vdXRfbmV3bGluZSA8LSBoO1xuICBzdGF0ZS5wcF9vdXRfc3BhY2VzIDwtIGk7XG4gIHN0YXRlLnBwX291dF9pbmRlbnQgPC0galxuXG5sZXQgcHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHN0YXRlICgpID0ge1xuICBvdXRfc3RyaW5nID0gc3RhdGUucHBfb3V0X3N0cmluZztcbiAgb3V0X2ZsdXNoID0gc3RhdGUucHBfb3V0X2ZsdXNoO1xuICBvdXRfbmV3bGluZSA9IHN0YXRlLnBwX291dF9uZXdsaW5lO1xuICBvdXRfc3BhY2VzID0gc3RhdGUucHBfb3V0X3NwYWNlcztcbiAgb3V0X2luZGVudCA9IHN0YXRlLnBwX291dF9pbmRlbnQ7XG59XG5cblxuKCogU2V0dGluZyBhIGZvcm1hdHRlciBiYXNpYyBzdHJpbmcgb3V0cHV0IGFuZCBmbHVzaCBmdW5jdGlvbnMuICopXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlIGYgZyA9XG4gIHN0YXRlLnBwX291dF9zdHJpbmcgPC0gZjsgc3RhdGUucHBfb3V0X2ZsdXNoIDwtIGdcblxubGV0IHBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyBzdGF0ZSAoKSA9XG4gIChzdGF0ZS5wcF9vdXRfc3RyaW5nLCBzdGF0ZS5wcF9vdXRfZmx1c2gpXG5cblxuKCogVGhlIGRlZmF1bHQgZnVuY3Rpb24gdG8gb3V0cHV0IG5ldyBsaW5lcy4gKilcbmxldCBkaXNwbGF5X25ld2xpbmUgc3RhdGUgKCkgPSBzdGF0ZS5wcF9vdXRfc3RyaW5nIFwiXFxuXCIgMCAgMVxuXG4oKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBvdXRwdXQgc3BhY2VzLiAqKVxubGV0IGJsYW5rX2xpbmUgPSBTdHJpbmcubWFrZSA4MCAnICdcbmxldCByZWMgZGlzcGxheV9ibGFua3Mgc3RhdGUgbiA9XG4gIGlmIG4gPiAwIHRoZW5cbiAgaWYgbiA8PSA4MCB0aGVuIHN0YXRlLnBwX291dF9zdHJpbmcgYmxhbmtfbGluZSAwIG4gZWxzZVxuICBiZWdpblxuICAgIHN0YXRlLnBwX291dF9zdHJpbmcgYmxhbmtfbGluZSAwIDgwO1xuICAgIGRpc3BsYXlfYmxhbmtzIHN0YXRlIChuIC0gODApXG4gIGVuZFxuXG5cbigqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIG91dHB1dCBpbmRlbnRhdGlvbiBvZiBuZXcgbGluZXMuICopXG5sZXQgZGlzcGxheV9pbmRlbnQgPSBkaXNwbGF5X2JsYW5rc1xuXG4oKiBTZXR0aW5nIGEgZm9ybWF0dGVyIGJhc2ljIG91dHB1dCBmdW5jdGlvbnMgYXMgcHJpbnRpbmcgdG8gYSBnaXZlblxuICAgW1BlcnZhc2l2ZS5vdXRfY2hhbm5lbF0gdmFsdWUuICopXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCBzdGF0ZSBvYyA9XG4gIHN0YXRlLnBwX291dF9zdHJpbmcgPC0gb3V0cHV0X3N1YnN0cmluZyBvYztcbiAgc3RhdGUucHBfb3V0X2ZsdXNoIDwtIChmdW4gKCkgLT4gZmx1c2ggb2MpO1xuICBzdGF0ZS5wcF9vdXRfbmV3bGluZSA8LSBkaXNwbGF5X25ld2xpbmUgc3RhdGU7XG4gIHN0YXRlLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3Mgc3RhdGU7XG4gIHN0YXRlLnBwX291dF9pbmRlbnQgPC0gZGlzcGxheV9pbmRlbnQgc3RhdGVcblxuKCpcblxuICBEZWZpbmluZyBzcGVjaWZpYyBmb3JtYXR0ZXJzXG5cbiopXG5cbmxldCBkZWZhdWx0X3BwX21hcmtfb3Blbl90YWcgPSBmdW5jdGlvblxuICB8IFN0cmluZ190YWcgcyAtPiBcIjxcIiBeIHMgXiBcIj5cIlxuICB8IF8gLT4gXCJcIlxubGV0IGRlZmF1bHRfcHBfbWFya19jbG9zZV90YWcgPSBmdW5jdGlvblxuICB8IFN0cmluZ190YWcgcyAtPiBcIjwvXCIgXiBzIF4gXCI+XCJcbiAgfCBfIC0+IFwiXCJcblxubGV0IGRlZmF1bHRfcHBfcHJpbnRfb3Blbl90YWcgPSBpZ25vcmVcbmxldCBkZWZhdWx0X3BwX3ByaW50X2Nsb3NlX3RhZyA9IGlnbm9yZVxuXG4oKiBCdWlsZGluZyBhIGZvcm1hdHRlciBnaXZlbiBpdHMgYmFzaWMgb3V0cHV0IGZ1bmN0aW9ucy5cbiAgIE90aGVyIGZpZWxkcyBnZXQgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcy4gKilcbmxldCBwcF9tYWtlX2Zvcm1hdHRlciBmIGcgaCBpIGogPVxuICAoKiBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZm9ybWF0dGVyIGNvbnRhaW5zIGEgZHVtbXkgYm94LiAqKVxuICBsZXQgcHBfcXVldWUgPSBRdWV1ZS5jcmVhdGUgKCkgaW5cbiAgbGV0IHN5c190b2sgPVxuICAgIHsgc2l6ZSA9IFNpemUudW5rbm93bjsgdG9rZW4gPSBQcF9iZWdpbiAoMCwgUHBfaG92Ym94KTsgbGVuZ3RoID0gMCB9IGluXG4gIFF1ZXVlLmFkZCBzeXNfdG9rIHBwX3F1ZXVlO1xuICBsZXQgc2Nhbl9zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKSBpblxuICBpbml0aWFsaXplX3NjYW5fc3RhY2sgc2Nhbl9zdGFjaztcbiAgU3RhY2sucHVzaCB7IGxlZnRfdG90YWwgPSAxOyBxdWV1ZV9lbGVtID0gc3lzX3RvayB9IHNjYW5fc3RhY2s7XG4gIGxldCBwcF9tYXJnaW4gPSA3OFxuICBhbmQgcHBfbWluX3NwYWNlX2xlZnQgPSAxMCBpblxuICB7XG4gICAgcHBfc2Nhbl9zdGFjayA9IHNjYW5fc3RhY2s7XG4gICAgcHBfZm9ybWF0X3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX3Rib3hfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfdGFnX3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX21hcmtfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfbWFyZ2luID0gcHBfbWFyZ2luO1xuICAgIHBwX21pbl9zcGFjZV9sZWZ0ID0gcHBfbWluX3NwYWNlX2xlZnQ7XG4gICAgcHBfbWF4X2luZGVudCA9IHBwX21hcmdpbiAtIHBwX21pbl9zcGFjZV9sZWZ0O1xuICAgIHBwX3NwYWNlX2xlZnQgPSBwcF9tYXJnaW47XG4gICAgcHBfY3VycmVudF9pbmRlbnQgPSAwO1xuICAgIHBwX2lzX25ld19saW5lID0gdHJ1ZTtcbiAgICBwcF9sZWZ0X3RvdGFsID0gMTtcbiAgICBwcF9yaWdodF90b3RhbCA9IDE7XG4gICAgcHBfY3Vycl9kZXB0aCA9IDE7XG4gICAgcHBfbWF4X2JveGVzID0gbWF4X2ludDtcbiAgICBwcF9lbGxpcHNpcyA9IFwiLlwiO1xuICAgIHBwX291dF9zdHJpbmcgPSBmO1xuICAgIHBwX291dF9mbHVzaCA9IGc7XG4gICAgcHBfb3V0X25ld2xpbmUgPSBoO1xuICAgIHBwX291dF9zcGFjZXMgPSBpO1xuICAgIHBwX291dF9pbmRlbnQgPSBqO1xuICAgIHBwX3ByaW50X3RhZ3MgPSBmYWxzZTtcbiAgICBwcF9tYXJrX3RhZ3MgPSBmYWxzZTtcbiAgICBwcF9tYXJrX29wZW5fdGFnID0gZGVmYXVsdF9wcF9tYXJrX29wZW5fdGFnO1xuICAgIHBwX21hcmtfY2xvc2VfdGFnID0gZGVmYXVsdF9wcF9tYXJrX2Nsb3NlX3RhZztcbiAgICBwcF9wcmludF9vcGVuX3RhZyA9IGRlZmF1bHRfcHBfcHJpbnRfb3Blbl90YWc7XG4gICAgcHBfcHJpbnRfY2xvc2VfdGFnID0gZGVmYXVsdF9wcF9wcmludF9jbG9zZV90YWc7XG4gICAgcHBfcXVldWUgPSBwcF9xdWV1ZTtcbiAgfVxuXG5cbigqIEJ1aWxkIGEgZm9ybWF0dGVyIG91dCBvZiBpdHMgb3V0IGZ1bmN0aW9ucy4gKilcbmxldCBmb3JtYXR0ZXJfb2Zfb3V0X2Z1bmN0aW9ucyBvdXRfZnVucyA9XG4gIHBwX21ha2VfZm9ybWF0dGVyXG4gICAgb3V0X2Z1bnMub3V0X3N0cmluZ1xuICAgIG91dF9mdW5zLm91dF9mbHVzaFxuICAgIG91dF9mdW5zLm91dF9uZXdsaW5lXG4gICAgb3V0X2Z1bnMub3V0X3NwYWNlc1xuICAgIG91dF9mdW5zLm91dF9pbmRlbnRcblxuXG4oKiBNYWtlIGEgZm9ybWF0dGVyIHdpdGggZGVmYXVsdCBmdW5jdGlvbnMgdG8gb3V0cHV0IHNwYWNlcyxcbiAgaW5kZW50YXRpb24sIGFuZCBuZXcgbGluZXMuICopXG5sZXQgbWFrZV9mb3JtYXR0ZXIgb3V0cHV0IGZsdXNoID1cbiAgbGV0IHBwZiA9IHBwX21ha2VfZm9ybWF0dGVyIG91dHB1dCBmbHVzaCBpZ25vcmUgaWdub3JlIGlnbm9yZSBpblxuICBwcGYucHBfb3V0X25ld2xpbmUgPC0gZGlzcGxheV9uZXdsaW5lIHBwZjtcbiAgcHBmLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3MgcHBmO1xuICBwcGYucHBfb3V0X2luZGVudCA8LSBkaXNwbGF5X2luZGVudCBwcGY7XG4gIHBwZlxuXG5cbigqIE1ha2UgYSBmb3JtYXR0ZXIgd3JpdGluZyB0byBhIGdpdmVuIFtQZXJ2YXNpdmUub3V0X2NoYW5uZWxdIHZhbHVlLiAqKVxubGV0IGZvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCBvYyA9XG4gIG1ha2VfZm9ybWF0dGVyIChvdXRwdXRfc3Vic3RyaW5nIG9jKSAoZnVuICgpIC0+IGZsdXNoIG9jKVxuXG5cbigqIE1ha2UgYSBmb3JtYXR0ZXIgd3JpdGluZyB0byBhIGdpdmVuIFtCdWZmZXIudF0gdmFsdWUuICopXG5sZXQgZm9ybWF0dGVyX29mX2J1ZmZlciBiID1cbiAgbWFrZV9mb3JtYXR0ZXIgKEJ1ZmZlci5hZGRfc3Vic3RyaW5nIGIpIGlnbm9yZVxuXG5cbigqIEFsbG9jYXRpbmcgYnVmZmVyIGZvciBwcmV0dHktcHJpbnRpbmcgcHVycG9zZXMuXG4gICBEZWZhdWx0IGJ1ZmZlciBzaXplIGlzIHBwX2J1ZmZlcl9zaXplIG9yIDUxMi5cbiopXG5sZXQgcHBfYnVmZmVyX3NpemUgPSA1MTJcbmxldCBwcF9tYWtlX2J1ZmZlciAoKSA9IEJ1ZmZlci5jcmVhdGUgcHBfYnVmZmVyX3NpemVcblxuKCogVGhlIHN0YW5kYXJkIChzaGFyZWQpIGJ1ZmZlci4gKilcbmxldCBzdGRidWYgPSBwcF9tYWtlX2J1ZmZlciAoKVxuXG4oKiBQcmVkZWZpbmVkIGZvcm1hdHRlcnMgc3RhbmRhcmQgZm9ybWF0dGVyIHRvIHByaW50XG4gICB0byBbU3RkbGliLnN0ZG91dF0sIFtTdGRsaWIuc3RkZXJyXSwgYW5kIHshc3RkYnVmfS4gKilcbmxldCBzdGRfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX291dF9jaGFubmVsIFN0ZGxpYi5zdGRvdXRcbmFuZCBlcnJfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX291dF9jaGFubmVsIFN0ZGxpYi5zdGRlcnJcbmFuZCBzdHJfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX2J1ZmZlciBzdGRidWZcblxuXG4oKiBbZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBidWYgcHBmXSBmbHVzaGVzIGZvcm1hdHRlciBbcHBmXSxcbiAgIHRoZW4gcmV0dXJucyB0aGUgY29udGVudHMgb2YgYnVmZmVyIFtidWZdIHRoYXQgaXMgcmVzZXQuXG4gICBGb3JtYXR0ZXIgW3BwZl0gaXMgc3VwcG9zZWQgdG8gcHJpbnQgdG8gYnVmZmVyIFtidWZdLCBvdGhlcndpc2UgdGhpc1xuICAgZnVuY3Rpb24gaXMgbm90IHJlYWxseSB1c2VmdWwuICopXG5sZXQgZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBidWYgcHBmID1cbiAgcHBfZmx1c2hfcXVldWUgcHBmIGZhbHNlO1xuICBsZXQgcyA9IEJ1ZmZlci5jb250ZW50cyBidWYgaW5cbiAgQnVmZmVyLnJlc2V0IGJ1ZjtcbiAgc1xuXG5cbigqIEZsdXNoIFtzdHJfZm9ybWF0dGVyXSBhbmQgZ2V0IHRoZSBjb250ZW50cyBvZiBbc3RkYnVmXS4gKilcbmxldCBmbHVzaF9zdHJfZm9ybWF0dGVyICgpID0gZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBzdGRidWYgc3RyX2Zvcm1hdHRlclxuXG4oKlxuICBTeW1ib2xpYyBwcmV0dHktcHJpbnRpbmdcbiopXG5cbigqXG4gIFN5bWJvbGljIHByZXR0eS1wcmludGluZyBpcyBwcmV0dHktcHJpbnRpbmcgd2l0aCBubyBsb3cgbGV2ZWwgb3V0cHV0LlxuXG4gIFdoZW4gdXNpbmcgYSBzeW1ib2xpYyBmb3JtYXR0ZXIsIGFsbCByZWd1bGFyIHByZXR0eS1wcmludGluZyBhY3Rpdml0aWVzXG4gIG9jY3VyIGJ1dCBvdXRwdXQgbWF0ZXJpYWwgaXMgc3ltYm9saWMgYW5kIHN0b3JlZCBpbiBhIGJ1ZmZlciBvZiBvdXRwdXRcbiAgaXRlbXMuIEF0IHRoZSBlbmQgb2YgcHJldHR5LXByaW50aW5nLCBmbHVzaGluZyB0aGUgb3V0cHV0IGJ1ZmZlciBhbGxvd3NcbiAgcG9zdC1wcm9jZXNzaW5nIG9mIHN5bWJvbGljIG91dHB1dCBiZWZvcmUgbG93IGxldmVsIG91dHB1dCBvcGVyYXRpb25zLlxuKilcblxudHlwZSBzeW1ib2xpY19vdXRwdXRfaXRlbSA9XG4gIHwgT3V0cHV0X2ZsdXNoXG4gIHwgT3V0cHV0X25ld2xpbmVcbiAgfCBPdXRwdXRfc3RyaW5nIG9mIHN0cmluZ1xuICB8IE91dHB1dF9zcGFjZXMgb2YgaW50XG4gIHwgT3V0cHV0X2luZGVudCBvZiBpbnRcblxudHlwZSBzeW1ib2xpY19vdXRwdXRfYnVmZmVyID0ge1xuICBtdXRhYmxlIHN5bWJvbGljX291dHB1dF9jb250ZW50cyA6IHN5bWJvbGljX291dHB1dF9pdGVtIGxpc3Q7XG59XG5cbmxldCBtYWtlX3N5bWJvbGljX291dHB1dF9idWZmZXIgKCkgPVxuICB7IHN5bWJvbGljX291dHB1dF9jb250ZW50cyA9IFtdIH1cblxubGV0IGNsZWFyX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50cyA8LSBbXVxuXG5sZXQgZ2V0X3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgTGlzdC5yZXYgc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50c1xuXG5sZXQgZmx1c2hfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgPVxuICBsZXQgaXRlbXMgPSBnZXRfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgaW5cbiAgY2xlYXJfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2I7XG4gIGl0ZW1zXG5cbmxldCBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIGl0ZW0gPVxuICBzb2Iuc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzIDwtIGl0ZW0gOjogc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50c1xuXG5sZXQgZm9ybWF0dGVyX29mX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgbGV0IHN5bWJvbGljX2ZsdXNoIHNvYiAoKSA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiBPdXRwdXRfZmx1c2hcbiAgYW5kIHN5bWJvbGljX25ld2xpbmUgc29iICgpID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIE91dHB1dF9uZXdsaW5lXG4gIGFuZCBzeW1ib2xpY19zdHJpbmcgc29iIHMgaSBuID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIChPdXRwdXRfc3RyaW5nIChTdHJpbmcuc3ViIHMgaSBuKSlcbiAgYW5kIHN5bWJvbGljX3NwYWNlcyBzb2IgbiA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiAoT3V0cHV0X3NwYWNlcyBuKVxuICBhbmQgc3ltYm9saWNfaW5kZW50IHNvYiBuID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIChPdXRwdXRfaW5kZW50IG4pIGluXG5cbiAgbGV0IGYgPSBzeW1ib2xpY19zdHJpbmcgc29iXG4gIGFuZCBnID0gc3ltYm9saWNfZmx1c2ggc29iXG4gIGFuZCBoID0gc3ltYm9saWNfbmV3bGluZSBzb2JcbiAgYW5kIGkgPSBzeW1ib2xpY19zcGFjZXMgc29iXG4gIGFuZCBqID0gc3ltYm9saWNfaW5kZW50IHNvYiBpblxuICBwcF9tYWtlX2Zvcm1hdHRlciBmIGcgaCBpIGpcblxuKCpcblxuICBCYXNpYyBmdW5jdGlvbnMgb24gdGhlICdzdGFuZGFyZCcgZm9ybWF0dGVyXG4gICh0aGUgZm9ybWF0dGVyIHRoYXQgcHJpbnRzIHRvIFtTdGRsaWIuc3Rkb3V0XSkuXG5cbiopXG5cbmxldCBvcGVuX2hib3ggPSBwcF9vcGVuX2hib3ggc3RkX2Zvcm1hdHRlclxuYW5kIG9wZW5fdmJveCA9IHBwX29wZW5fdmJveCBzdGRfZm9ybWF0dGVyXG5hbmQgb3Blbl9odmJveCA9IHBwX29wZW5faHZib3ggc3RkX2Zvcm1hdHRlclxuYW5kIG9wZW5faG92Ym94ID0gcHBfb3Blbl9ob3Zib3ggc3RkX2Zvcm1hdHRlclxuYW5kIG9wZW5fYm94ID0gcHBfb3Blbl9ib3ggc3RkX2Zvcm1hdHRlclxuYW5kIGNsb3NlX2JveCA9IHBwX2Nsb3NlX2JveCBzdGRfZm9ybWF0dGVyXG5hbmQgb3Blbl90YWcgPSBwcF9vcGVuX3RhZyBzdGRfZm9ybWF0dGVyXG5hbmQgY2xvc2VfdGFnID0gcHBfY2xvc2VfdGFnIHN0ZF9mb3JtYXR0ZXJcbmFuZCBvcGVuX3N0YWcgPSBwcF9vcGVuX3N0YWcgc3RkX2Zvcm1hdHRlclxuYW5kIGNsb3NlX3N0YWcgPSBwcF9jbG9zZV9zdGFnIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9hcyA9IHBwX3ByaW50X2FzIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9zdHJpbmcgPSBwcF9wcmludF9zdHJpbmcgc3RkX2Zvcm1hdHRlclxuYW5kIHByaW50X2J5dGVzID0gcHBfcHJpbnRfYnl0ZXMgc3RkX2Zvcm1hdHRlclxuYW5kIHByaW50X2ludCA9IHBwX3ByaW50X2ludCBzdGRfZm9ybWF0dGVyXG5hbmQgcHJpbnRfZmxvYXQgPSBwcF9wcmludF9mbG9hdCBzdGRfZm9ybWF0dGVyXG5hbmQgcHJpbnRfY2hhciA9IHBwX3ByaW50X2NoYXIgc3RkX2Zvcm1hdHRlclxuYW5kIHByaW50X2Jvb2wgPSBwcF9wcmludF9ib29sIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9icmVhayA9IHBwX3ByaW50X2JyZWFrIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9jdXQgPSBwcF9wcmludF9jdXQgc3RkX2Zvcm1hdHRlclxuYW5kIHByaW50X3NwYWNlID0gcHBfcHJpbnRfc3BhY2Ugc3RkX2Zvcm1hdHRlclxuYW5kIGZvcmNlX25ld2xpbmUgPSBwcF9mb3JjZV9uZXdsaW5lIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9mbHVzaCA9IHBwX3ByaW50X2ZsdXNoIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF9uZXdsaW5lID0gcHBfcHJpbnRfbmV3bGluZSBzdGRfZm9ybWF0dGVyXG5hbmQgcHJpbnRfaWZfbmV3bGluZSA9IHBwX3ByaW50X2lmX25ld2xpbmUgc3RkX2Zvcm1hdHRlclxuXG5hbmQgb3Blbl90Ym94ID0gcHBfb3Blbl90Ym94IHN0ZF9mb3JtYXR0ZXJcbmFuZCBjbG9zZV90Ym94ID0gcHBfY2xvc2VfdGJveCBzdGRfZm9ybWF0dGVyXG5hbmQgcHJpbnRfdGJyZWFrID0gcHBfcHJpbnRfdGJyZWFrIHN0ZF9mb3JtYXR0ZXJcblxuYW5kIHNldF90YWIgPSBwcF9zZXRfdGFiIHN0ZF9mb3JtYXR0ZXJcbmFuZCBwcmludF90YWIgPSBwcF9wcmludF90YWIgc3RkX2Zvcm1hdHRlclxuXG5hbmQgc2V0X21hcmdpbiA9IHBwX3NldF9tYXJnaW4gc3RkX2Zvcm1hdHRlclxuYW5kIGdldF9tYXJnaW4gPSBwcF9nZXRfbWFyZ2luIHN0ZF9mb3JtYXR0ZXJcblxuYW5kIHNldF9tYXhfaW5kZW50ID0gcHBfc2V0X21heF9pbmRlbnQgc3RkX2Zvcm1hdHRlclxuYW5kIGdldF9tYXhfaW5kZW50ID0gcHBfZ2V0X21heF9pbmRlbnQgc3RkX2Zvcm1hdHRlclxuXG5hbmQgc2V0X2dlb21ldHJ5ID0gcHBfc2V0X2dlb21ldHJ5IHN0ZF9mb3JtYXR0ZXJcbmFuZCBzYWZlX3NldF9nZW9tZXRyeSA9IHBwX3NhZmVfc2V0X2dlb21ldHJ5IHN0ZF9mb3JtYXR0ZXJcbmFuZCBnZXRfZ2VvbWV0cnkgPSBwcF9nZXRfZ2VvbWV0cnkgc3RkX2Zvcm1hdHRlclxuYW5kIHVwZGF0ZV9nZW9tZXRyeSA9IHBwX3VwZGF0ZV9nZW9tZXRyeSBzdGRfZm9ybWF0dGVyXG5cbmFuZCBzZXRfbWF4X2JveGVzID0gcHBfc2V0X21heF9ib3hlcyBzdGRfZm9ybWF0dGVyXG5hbmQgZ2V0X21heF9ib3hlcyA9IHBwX2dldF9tYXhfYm94ZXMgc3RkX2Zvcm1hdHRlclxuYW5kIG92ZXJfbWF4X2JveGVzID0gcHBfb3Zlcl9tYXhfYm94ZXMgc3RkX2Zvcm1hdHRlclxuXG5hbmQgc2V0X2VsbGlwc2lzX3RleHQgPSBwcF9zZXRfZWxsaXBzaXNfdGV4dCBzdGRfZm9ybWF0dGVyXG5hbmQgZ2V0X2VsbGlwc2lzX3RleHQgPSBwcF9nZXRfZWxsaXBzaXNfdGV4dCBzdGRfZm9ybWF0dGVyXG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCBzdGRfZm9ybWF0dGVyXG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgPVxuICBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgc3RkX2Zvcm1hdHRlclxuYW5kIGdldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgPVxuICBwcF9zZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgc3RkX2Zvcm1hdHRlclxuYW5kIGdldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG5cbmFuZCBzZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG5hbmQgZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgc3RkX2Zvcm1hdHRlclxuYW5kIHNldF9wcmludF90YWdzID1cbiAgcHBfc2V0X3ByaW50X3RhZ3Mgc3RkX2Zvcm1hdHRlclxuYW5kIGdldF9wcmludF90YWdzID1cbiAgcHBfZ2V0X3ByaW50X3RhZ3Mgc3RkX2Zvcm1hdHRlclxuYW5kIHNldF9tYXJrX3RhZ3MgPVxuICBwcF9zZXRfbWFya190YWdzIHN0ZF9mb3JtYXR0ZXJcbmFuZCBnZXRfbWFya190YWdzID1cbiAgcHBfZ2V0X21hcmtfdGFncyBzdGRfZm9ybWF0dGVyXG5hbmQgc2V0X3RhZ3MgPVxuICBwcF9zZXRfdGFncyBzdGRfZm9ybWF0dGVyXG5cblxuKCogQ29udmVuaWVuY2UgZnVuY3Rpb25zICopXG5cbigqIFRvIGZvcm1hdCBhIGxpc3QgKilcbmxldCByZWMgcHBfcHJpbnRfbGlzdCA/KHBwX3NlcCA9IHBwX3ByaW50X2N1dCkgcHBfdiBwcGYgPSBmdW5jdGlvblxuICB8IFtdIC0+ICgpXG4gIHwgW3ZdIC0+IHBwX3YgcHBmIHZcbiAgfCB2IDo6IHZzIC0+XG4gICAgcHBfdiBwcGYgdjtcbiAgICBwcF9zZXAgcHBmICgpO1xuICAgIHBwX3ByaW50X2xpc3QgfnBwX3NlcCBwcF92IHBwZiB2c1xuXG4oKiBUbyBmb3JtYXQgYSBzZXF1ZW5jZSAqKVxubGV0IHJlYyBwcF9wcmludF9zZXFfaW4gfnBwX3NlcCBwcF92IHBwZiBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IFNlcS5OaWwgLT4gKClcbiAgfCBTZXEuQ29ucyAodiwgc2VxKSAtPlxuICAgIHBwX3NlcCBwcGYgKCk7XG4gICAgcHBfdiBwcGYgdjtcbiAgICBwcF9wcmludF9zZXFfaW4gfnBwX3NlcCBwcF92IHBwZiBzZXFcblxubGV0IHBwX3ByaW50X3NlcSA/KHBwX3NlcCA9IHBwX3ByaW50X2N1dCkgcHBfdiBwcGYgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+ICgpXG4gIHwgU2VxLkNvbnMgKHYsIHNlcSkgLT5cbiAgICBwcF92IHBwZiB2O1xuICAgIHBwX3ByaW50X3NlcV9pbiB+cHBfc2VwIHBwX3YgcHBmIHNlcVxuXG4oKiBUbyBmb3JtYXQgZnJlZS1mbG93aW5nIHRleHQgKilcbmxldCBwcF9wcmludF90ZXh0IHBwZiBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgbGVmdCA9IHJlZiAwIGluXG4gIGxldCByaWdodCA9IHJlZiAwIGluXG4gIGxldCBmbHVzaCAoKSA9XG4gICAgcHBfcHJpbnRfc3RyaW5nIHBwZiAoU3RyaW5nLnN1YiBzICFsZWZ0ICghcmlnaHQgLSAhbGVmdCkpO1xuICAgIGluY3IgcmlnaHQ7IGxlZnQgOj0gIXJpZ2h0O1xuICBpblxuICB3aGlsZSAoIXJpZ2h0IDw+IGxlbikgZG9cbiAgICBtYXRjaCBzLlshcmlnaHRdIHdpdGhcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgZmx1c2ggKCk7XG4gICAgICAgIHBwX2ZvcmNlX25ld2xpbmUgcHBmICgpXG4gICAgICB8ICcgJyAtPlxuICAgICAgICBmbHVzaCAoKTsgcHBfcHJpbnRfc3BhY2UgcHBmICgpXG4gICAgICAoKiB0aGVyZSBpcyBubyBzcGVjaWZpYyBzdXBwb3J0IGZvciAnXFx0J1xuICAgICAgICAgYXMgaXQgaXMgdW5jbGVhciB3aGF0IGEgcmlnaHQgc2VtYW50aWNzIHdvdWxkIGJlICopXG4gICAgICB8IF8gLT4gaW5jciByaWdodFxuICBkb25lO1xuICBpZiAhbGVmdCA8PiBsZW4gdGhlbiBmbHVzaCAoKVxuXG5sZXQgcHBfcHJpbnRfb3B0aW9uID8obm9uZSA9IGZ1biBfICgpIC0+ICgpKSBwcF92IHBwZiA9IGZ1bmN0aW9uXG58IE5vbmUgLT4gbm9uZSBwcGYgKClcbnwgU29tZSB2IC0+IHBwX3YgcHBmIHZcblxubGV0IHBwX3ByaW50X3Jlc3VsdCB+b2sgfmVycm9yIHBwZiA9IGZ1bmN0aW9uXG58IE9rIHYgLT4gb2sgcHBmIHZcbnwgRXJyb3IgZSAtPiBlcnJvciBwcGYgZVxuXG5sZXQgcHBfcHJpbnRfZWl0aGVyIH5sZWZ0IH5yaWdodCBwcGYgPSBmdW5jdGlvblxufCBFaXRoZXIuTGVmdCBsIC0+IGxlZnQgcHBmIGxcbnwgRWl0aGVyLlJpZ2h0IHIgLT4gcmlnaHQgcHBmIHJcblxuICgqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubGV0IGNvbXB1dGVfdGFnIG91dHB1dCB0YWdfYWNjID1cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgMTYgaW5cbiAgbGV0IHBwZiA9IGZvcm1hdHRlcl9vZl9idWZmZXIgYnVmIGluXG4gIG91dHB1dCBwcGYgdGFnX2FjYztcbiAgcHBfcHJpbnRfZmx1c2ggcHBmICgpO1xuICBsZXQgbGVuID0gQnVmZmVyLmxlbmd0aCBidWYgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgZWxzZSBCdWZmZXIuc3ViIGJ1ZiAxIChsZW4gLSAyKVxuXG4gKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgRGVmaW5pbmcgY29udGludWF0aW9ucyB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mXG4gIENhbWxpbnRlcm5hbEZvcm1hdC5tYWtlX3ByaW50Zi5cblxuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3Ncbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0XG5cbigqIEludGVycHJldCBhIGZvcm1hdHRpbmcgZW50aXR5IG9uIGEgZm9ybWF0dGVyLiAqKVxubGV0IG91dHB1dF9mb3JtYXR0aW5nX2xpdCBwcGYgZm10aW5nX2xpdCA9IG1hdGNoIGZtdGluZ19saXQgd2l0aFxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgLT4gcHBfY2xvc2VfYm94IHBwZiAoKVxuICB8IENsb3NlX3RhZyAgICAgICAgICAgICAgICAgLT4gcHBfY2xvc2VfdGFnIHBwZiAoKVxuICB8IEJyZWFrIChfLCB3aWR0aCwgb2Zmc2V0KSAgLT4gcHBfcHJpbnRfYnJlYWsgcHBmIHdpZHRoIG9mZnNldFxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgLT4gcHBfcHJpbnRfZmx1c2ggcHBmICgpXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAtPiBwcF9mb3JjZV9uZXdsaW5lIHBwZiAoKVxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgICAgICAgLT4gcHBfcHJpbnRfbmV3bGluZSBwcGYgKClcbiAgfCBNYWdpY19zaXplIChfLCBfKSAgICAgICAgIC0+ICgpXG4gIHwgRXNjYXBlZF9hdCAgICAgICAgICAgICAgICAtPiBwcF9wcmludF9jaGFyIHBwZiAnQCdcbiAgfCBFc2NhcGVkX3BlcmNlbnQgICAgICAgICAgIC0+IHBwX3ByaW50X2NoYXIgcHBmICclJ1xuICB8IFNjYW5faW5kaWMgYyAgICAgICAgICAgICAgLT4gcHBfcHJpbnRfY2hhciBwcGYgJ0AnOyBwcF9wcmludF9jaGFyIHBwZiBjXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYW4gb3V0cHV0X3N0cmVhbS4gKilcbigqIERpZmZlciBmcm9tIFByaW50Zi5vdXRwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBmb3JtYXR0aW5nLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBDYW1saW50ZXJuYWxGb3JtYXQubWFrZV9wcmludGYuICopXG5sZXQgcmVjIG91dHB1dF9hY2MgcHBmIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgKFN0cmluZy5tYWtlIDEgYyk7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgb3V0cHV0X2Zvcm1hdHRpbmdfbGl0IHBwZiBmO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBwcF9vcGVuX3N0YWcgcHBmIChTdHJpbmdfdGFnIChjb21wdXRlX3RhZyBvdXRwdXRfYWNjIGFjYycpKVxuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBsZXQgKGluZGVudCwgYnR5KSA9IG9wZW5fYm94X29mX3N0cmluZyAoY29tcHV0ZV90YWcgb3V0cHV0X2FjYyBhY2MnKSBpblxuICAgIHBwX29wZW5fYm94X2dlbiBwcGYgaW5kZW50IGJ0eVxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gb3V0cHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfc3RyaW5nIHBwZiBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2NoYXIgcHBmIGM7XG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IGYgcHBmO1xuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBvdXRwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9mbHVzaCBwcGYgKCk7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IG91dHB1dF9hY2MgcHBmIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIERpZmZlciBmcm9tIFByaW50Zi5idWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBmb3JtYXR0aW5nLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBDYW1saW50ZXJuYWxGb3JtYXQubWFrZV9wcmludGYuICopXG5sZXQgcmVjIHN0cnB1dF9hY2MgcHBmIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgKFN0cmluZy5tYWtlIDEgYyk7XG4gIHwgQWNjX2RlbGF5IChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgZikgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSAoZiAoKSk7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgb3V0cHV0X2Zvcm1hdHRpbmdfbGl0IHBwZiBmO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9vcGVuX3N0YWcgcHBmIChTdHJpbmdfdGFnIChjb21wdXRlX3RhZyBzdHJwdXRfYWNjIGFjYycpKVxuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBsZXQgKGluZGVudCwgYnR5KSA9IG9wZW5fYm94X29mX3N0cmluZyAoY29tcHV0ZV90YWcgc3RycHV0X2FjYyBhY2MnKSBpblxuICAgIHBwX29wZW5fYm94X2dlbiBwcGYgaW5kZW50IGJ0eVxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gc3RycHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfc3RyaW5nIHBwZiBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2NoYXIgcHBmIGM7XG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X3N0cmluZyBwcGYgKGYgKCkpO1xuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBzdHJwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9mbHVzaCBwcGYgKCk7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgcHBmIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCpcblxuICBEZWZpbmluZyBbZnByaW50Zl0gYW5kIHZhcmlvdXMgZmxhdm9ycyBvZiBbZnByaW50Zl0uXG5cbiopXG5cbmxldCBrZnByaW50ZiBrIHBwZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gb3V0cHV0X2FjYyBwcGYgYWNjOyBrIHBwZilcbiAgICBFbmRfb2ZfYWNjIGZtdFxuXG5hbmQgaWtmcHJpbnRmIGsgcHBmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9pcHJpbnRmIGsgcHBmIGZtdFxuXG5sZXQgaWZwcmludGYgX3BwZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfaXByaW50ZiBpZ25vcmUgKCkgZm10XG5cbmxldCBmcHJpbnRmIHBwZiA9IGtmcHJpbnRmIGlnbm9yZSBwcGZcbmxldCBwcmludGYgZm10ID0gZnByaW50ZiBzdGRfZm9ybWF0dGVyIGZtdFxubGV0IGVwcmludGYgZm10ID0gZnByaW50ZiBlcnJfZm9ybWF0dGVyIGZtdFxuXG5sZXQga2RwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gayAoZnVuIHBwZiAtPiBvdXRwdXRfYWNjIHBwZiBhY2MpKVxuICAgIEVuZF9vZl9hY2MgZm10XG5cbmxldCBkcHJpbnRmIGZtdCA9IGtkcHJpbnRmIChmdW4gaSAtPiBpKSBmbXRcblxubGV0IGtzcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYiA9IHBwX21ha2VfYnVmZmVyICgpIGluXG4gIGxldCBwcGYgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGIgaW5cbiAgbGV0IGsgYWNjID1cbiAgICBzdHJwdXRfYWNjIHBwZiBhY2M7XG4gICAgayAoZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBiIHBwZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIGlkIGZtdFxuXG5sZXQga2FzcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYiA9IHBwX21ha2VfYnVmZmVyICgpIGluXG4gIGxldCBwcGYgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGIgaW5cbiAgbGV0IGsgYWNjID1cbiAgICBvdXRwdXRfYWNjIHBwZiBhY2M7XG4gICAgayAoZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBiIHBwZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG5cbmxldCBhc3ByaW50ZiBmbXQgPSBrYXNwcmludGYgaWQgZm10XG5cbigqIEZsdXNoaW5nIHN0YW5kYXJkIGZvcm1hdHRlcnMgYXQgZW5kIG9mIGV4ZWN1dGlvbi4gKilcblxubGV0IGZsdXNoX3N0YW5kYXJkX2Zvcm1hdHRlcnMgKCkgPVxuICBwcF9wcmludF9mbHVzaCBzdGRfZm9ybWF0dGVyICgpO1xuICBwcF9wcmludF9mbHVzaCBlcnJfZm9ybWF0dGVyICgpXG5cbmxldCAoKSA9IGF0X2V4aXQgZmx1c2hfc3RhbmRhcmRfZm9ybWF0dGVyc1xuXG4oKlxuXG4gIERlcHJlY2F0ZWQgc3R1ZmYuXG5cbiopXG5cbigqIERlcHJlY2F0ZWQgOiBzdWJzdW1lZCBieSBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgKilcbmxldCBwcF9zZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlXG4gICAgfm91dDpmIH5mbHVzaDpnIH5uZXdsaW5lOmggfnNwYWNlczppID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlIGYgZztcbiAgc3RhdGUucHBfb3V0X25ld2xpbmUgPC0gaDtcbiAgc3RhdGUucHBfb3V0X3NwYWNlcyA8LSBpXG5cbigqIERlcHJlY2F0ZWQgOiBzdWJzdW1lZCBieSBwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgKilcbmxldCBwcF9nZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlICgpID1cbiAgKHN0YXRlLnBwX291dF9zdHJpbmcsIHN0YXRlLnBwX291dF9mbHVzaCxcbiAgIHN0YXRlLnBwX291dF9uZXdsaW5lLCBzdGF0ZS5wcF9vdXRfc3BhY2VzKVxuXG5cbigqIERlcHJlY2F0ZWQgOiBzdWJzdW1lZCBieSBzZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgKilcbmxldCBzZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zID1cbiAgcHBfc2V0X2FsbF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG5cblxuKCogRGVwcmVjYXRlZCA6IHN1YnN1bWVkIGJ5IGdldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyAqKVxubGV0IGdldF9hbGxfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgPVxuICBwcF9nZXRfYWxsX2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0ZF9mb3JtYXR0ZXJcblxuXG4oKiBEZXByZWNhdGVkIDogZXJyb3IgcHJvbmUgZnVuY3Rpb24sIGRvIG5vdCB1c2UgaXQuXG4gICBUaGlzIGZ1bmN0aW9uIGlzIG5laXRoZXIgY29tcG9zaXRpb25hbCBub3IgaW5jcmVtZW50YWwsIHNpbmNlIGl0IGZsdXNoZXNcbiAgIHRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZSBhdCBlYWNoIGNhbGwuXG4gICBUbyBnZXQgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSwgZGVmaW5lIGEgZm9ybWF0dGVyIG9mIHlvdXIgb3duIHdyaXRpbmcgdG9cbiAgIHRoZSBidWZmZXIgYXJndW1lbnQsIGFzIGluXG4gICBsZXQgcHBmID0gZm9ybWF0dGVyX29mX2J1ZmZlciBiXG4gICB0aGVuIHVzZSB7IWZwcmludGYgcHBmfSBhcyB1c3VhbC4gKilcbmxldCBicHJpbnRmIGIgKEZvcm1hdCAoZm10LCBfKSA6ICgnYSwgZm9ybWF0dGVyLCB1bml0KSBmb3JtYXQpID1cbiAgbGV0IHBwZiA9IGZvcm1hdHRlcl9vZl9idWZmZXIgYiBpblxuICBsZXQgayBhY2MgPSBvdXRwdXRfYWNjIHBwZiBhY2M7IHBwX2ZsdXNoX3F1ZXVlIHBwZiBmYWxzZSBpblxuICBtYWtlX3ByaW50ZiBrIEVuZF9vZl9hY2MgZm10XG5cblxuKCogRGVwcmVjYXRlZCA6IGFsaWFzIGZvciBrc3ByaW50Zi4gKilcbmxldCBrcHJpbnRmID0ga3NwcmludGZcblxuXG5cbigqIERlcHJlY2F0ZWQgdGFnIGZ1bmN0aW9ucyAqKVxuXG50eXBlIGZvcm1hdHRlcl90YWdfZnVuY3Rpb25zID0ge1xuICBtYXJrX29wZW5fdGFnIDogdGFnIC0+IHN0cmluZztcbiAgbWFya19jbG9zZV90YWcgOiB0YWcgLT4gc3RyaW5nO1xuICBwcmludF9vcGVuX3RhZyA6IHRhZyAtPiB1bml0O1xuICBwcmludF9jbG9zZV90YWcgOiB0YWcgLT4gdW5pdDtcbn1cblxuXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIHN0YXRlIHtcbiAgICAgbWFya19vcGVuX3RhZyA9IG1vdDtcbiAgICAgbWFya19jbG9zZV90YWcgPSBtY3Q7XG4gICAgIHByaW50X29wZW5fdGFnID0gcG90O1xuICAgICBwcmludF9jbG9zZV90YWcgPSBwY3Q7XG4gICB9ID1cbiAgbGV0IHN0cmluZ2lmeSBmIGUgPSBmdW5jdGlvbiBTdHJpbmdfdGFnIHMgLT4gZiBzIHwgXyAtPiBlIGluXG4gIHN0YXRlLnBwX21hcmtfb3Blbl90YWcgPC0gc3RyaW5naWZ5IG1vdCBcIlwiO1xuICBzdGF0ZS5wcF9tYXJrX2Nsb3NlX3RhZyA8LSBzdHJpbmdpZnkgbWN0IFwiXCI7XG4gIHN0YXRlLnBwX3ByaW50X29wZW5fdGFnIDwtIHN0cmluZ2lmeSBwb3QgKCk7XG4gIHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZyA8LSBzdHJpbmdpZnkgcGN0ICgpXG5cbmxldCBwcF9nZXRfZm9ybWF0dGVyX3RhZ19mdW5jdGlvbnMgZm10ICgpID1cbiAgbGV0IGZ1bnMgPSBwcF9nZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIGZtdCAoKSBpblxuICBsZXQgbWFya19vcGVuX3RhZyBzID0gZnVucy5tYXJrX29wZW5fc3RhZyAoU3RyaW5nX3RhZyBzKSBpblxuICBsZXQgbWFya19jbG9zZV90YWcgcyA9IGZ1bnMubWFya19jbG9zZV9zdGFnIChTdHJpbmdfdGFnIHMpIGluXG4gIGxldCBwcmludF9vcGVuX3RhZyBzID0gZnVucy5wcmludF9vcGVuX3N0YWcgKFN0cmluZ190YWcgcykgaW5cbiAgbGV0IHByaW50X2Nsb3NlX3RhZyBzID0gZnVucy5wcmludF9jbG9zZV9zdGFnIChTdHJpbmdfdGFnIHMpIGluXG4gIHttYXJrX29wZW5fdGFnOyBtYXJrX2Nsb3NlX3RhZzsgcHJpbnRfb3Blbl90YWc7IHByaW50X2Nsb3NlX3RhZ31cblxubGV0IHNldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9ucyA9XG4gIHBwX3NldF9mb3JtYXR0ZXJfdGFnX2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG5hbmQgZ2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zID1cbiAgcHBfZ2V0X2Zvcm1hdHRlcl90YWdfZnVuY3Rpb25zIHN0ZF9mb3JtYXR0ZXJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3Ncbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0XG5cbigqIGFsaWFzIHRvIGF2b2lkIHdhcm5pbmcgZm9yIGFtYmlndWl0eSBiZXR3ZWVuXG4gICBTdGRsaWIuZm9ybWF0NlxuICAgYW5kIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2XG5cbiAgICh0aGUgZm9ybWVyIGlzIGluIGZhY3QgYW4gYWxpYXMgZm9yIHRoZSBsYXR0ZXIsXG4gICAgYnV0IHRoZSBhbWJpZ3VpdHkgd2FybmluZyBkb2Vzbid0IGNhcmUpXG4qKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9XG4gICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBTdGRsaWIuZm9ybWF0NlxuXG5cbigqIFRoZSBydW4tdGltZSBsaWJyYXJ5IGZvciBzY2FubmVycy4gKilcblxuKCogU2Nhbm5pbmcgYnVmZmVycy4gKilcbm1vZHVsZSB0eXBlIFNDQU5OSU5HID0gc2lnXG5cbiAgdHlwZSBpbl9jaGFubmVsXG5cbiAgdHlwZSBzY2FuYnVmID0gaW5fY2hhbm5lbFxuXG4gIHR5cGUgZmlsZV9uYW1lID0gc3RyaW5nXG5cbiAgdmFsIHN0ZGluIDogaW5fY2hhbm5lbFxuICAoKiBUaGUgc2Nhbm5pbmcgYnVmZmVyIHJlYWRpbmcgZnJvbSBbU3RkbGliLnN0ZGluXS5cbiAgICAgW3N0ZGliXSBpcyBlcXVpdmFsZW50IHRvIFtTY2FubmluZy5mcm9tX2NoYW5uZWwgU3RkbGliLnN0ZGluXS4gKilcblxuICB2YWwgc3RkaWIgOiBpbl9jaGFubmVsXG4gICgqIEFuIGFsaWFzIGZvciBbU2NhbmYuc3RkaW5dLCB0aGUgc2Nhbm5pbmcgYnVmZmVyIHJlYWRpbmcgZnJvbVxuICAgICBbU3RkbGliLnN0ZGluXS4gKilcblxuICB2YWwgbmV4dF9jaGFyIDogc2NhbmJ1ZiAtPiBjaGFyXG4gICgqIFtTY2FubmluZy5uZXh0X2NoYXIgaWJdIGFkdmFuY2UgdGhlIHNjYW5uaW5nIGJ1ZmZlciBmb3JcbiAgICAgb25lIGNoYXJhY3Rlci5cbiAgICAgSWYgbm8gbW9yZSBjaGFyYWN0ZXIgY2FuIGJlIHJlYWQsIHNldHMgYSBlbmQgb2YgZmlsZSBjb25kaXRpb24gYW5kXG4gICAgIHJldHVybnMgJ1xcMDAwJy4gKilcblxuICB2YWwgaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgOiBzY2FuYnVmIC0+IHVuaXRcbiAgKCogW1NjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliXSBtYXJrIHRoZSBjdXJyZW50X2NoYXIgYXMgYWxyZWFkeVxuICAgICBzY2FubmVkLiAqKVxuXG4gIHZhbCBwZWVrX2NoYXIgOiBzY2FuYnVmIC0+IGNoYXJcbiAgKCogW1NjYW5uaW5nLnBlZWtfY2hhciBpYl0gcmV0dXJucyB0aGUgY3VycmVudCBjaGFyIGF2YWlsYWJsZSBpblxuICAgICB0aGUgYnVmZmVyIG9yIHJlYWRzIG9uZSBpZiBuZWNlc3NhcnkgKHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzXG4gICAgIGFscmVhZHkgc2Nhbm5lZCkuXG4gICAgIElmIG5vIGNoYXJhY3RlciBjYW4gYmUgcmVhZCwgc2V0cyBhbiBlbmQgb2YgZmlsZSBjb25kaXRpb24gYW5kXG4gICAgIHJldHVybnMgJ1xcMDAwJy4gKilcblxuICB2YWwgY2hlY2tlZF9wZWVrX2NoYXIgOiBzY2FuYnVmIC0+IGNoYXJcbiAgKCogU2FtZSBhcyBbU2Nhbm5pbmcucGVla19jaGFyXSBhYm92ZSBidXQgYWx3YXlzIHJldHVybnMgYSB2YWxpZCBjaGFyIG9yXG4gICAgIGZhaWxzOiBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG51bGwgY2hhciB3aGVuIHRoZSByZWFkaW5nIG1ldGhvZCBvZiB0aGVcbiAgICAgaW5wdXQgYnVmZmVyIGhhcyByZWFjaGVkIGFuIGVuZCBvZiBmaWxlLCB0aGUgZnVuY3Rpb24gcmFpc2VzIGV4Y2VwdGlvblxuICAgICBbRW5kX29mX2ZpbGVdLiAqKVxuXG4gIHZhbCBzdG9yZV9jaGFyIDogaW50IC0+IHNjYW5idWYgLT4gY2hhciAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLnN0b3JlX2NoYXIgbGltIGliIGNdIGFkZHMgW2NdIHRvIHRoZSB0b2tlbiBidWZmZXJcbiAgICAgb2YgdGhlIHNjYW5uaW5nIGJ1ZmZlciBbaWJdLiBJdCBhbHNvIGFkdmFuY2VzIHRoZSBzY2FubmluZyBidWZmZXIgZm9yXG4gICAgIG9uZSBjaGFyYWN0ZXIgYW5kIHJldHVybnMgW2xpbSAtIDFdLCBpbmRpY2F0aW5nIHRoZSBuZXcgbGltaXQgZm9yIHRoZVxuICAgICBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uICopXG5cbiAgdmFsIHNraXBfY2hhciA6IGludCAtPiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcuc2tpcF9jaGFyIGxpbSBpYl0gaWdub3JlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuICopXG5cbiAgdmFsIGlnbm9yZV9jaGFyIDogaW50IC0+IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5pZ25vcmVfY2hhciBpYiBsaW1dIGlnbm9yZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGFuZFxuICAgICBkZWNyZW1lbnRzIHRoZSBsaW1pdC4gKilcblxuICB2YWwgdG9rZW4gOiBzY2FuYnVmIC0+IHN0cmluZ1xuICAoKiBbU2Nhbm5pbmcudG9rZW4gaWJdIHJldHVybnMgdGhlIHN0cmluZyBzdG9yZWQgaW50byB0aGUgdG9rZW5cbiAgICAgYnVmZmVyIG9mIHRoZSBzY2FubmluZyBidWZmZXI6IGl0IHJldHVybnMgdGhlIHRva2VuIG1hdGNoZWQgYnkgdGhlXG4gICAgIGZvcm1hdC4gKilcblxuICB2YWwgcmVzZXRfdG9rZW4gOiBzY2FuYnVmIC0+IHVuaXRcbiAgKCogW1NjYW5uaW5nLnJlc2V0X3Rva2VuIGliXSByZXNldHMgdGhlIHRva2VuIGJ1ZmZlciBvZlxuICAgICB0aGUgZ2l2ZW4gc2Nhbm5pbmcgYnVmZmVyLiAqKVxuXG4gIHZhbCBjaGFyX2NvdW50IDogc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLmNoYXJfY291bnQgaWJdIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAgIHJlYWQgc28gZmFyIGZyb20gdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgbGluZV9jb3VudCA6IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5saW5lX2NvdW50IGliXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmV3IGxpbmVcbiAgICAgY2hhcmFjdGVycyByZWFkIHNvIGZhciBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICopXG5cbiAgdmFsIHRva2VuX2NvdW50IDogc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLnRva2VuX2NvdW50IGliXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIHJlYWRcbiAgICAgc28gZmFyIGZyb20gW2liXS4gKilcblxuICB2YWwgZW9mIDogc2NhbmJ1ZiAtPiBib29sXG4gICgqIFtTY2FubmluZy5lb2YgaWJdIHJldHVybnMgdGhlIGVuZCBvZiBpbnB1dCBjb25kaXRpb25cbiAgICAgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgZW5kX29mX2lucHV0IDogc2NhbmJ1ZiAtPiBib29sXG4gICgqIFtTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWJdIHRlc3RzIHRoZSBlbmQgb2YgaW5wdXQgY29uZGl0aW9uXG4gICAgIG9mIHRoZSBnaXZlbiBidWZmZXIgKGlmIG5vIGNoYXIgaGFzIGV2ZXIgYmVlbiByZWFkLCBhbiBhdHRlbXB0IHRvXG4gICAgIHJlYWQgb25lIGlzIHBlcmZvcm1lZCkuICopXG5cbiAgdmFsIGJlZ2lubmluZ19vZl9pbnB1dCA6IHNjYW5idWYgLT4gYm9vbFxuICAoKiBbU2Nhbm5pbmcuYmVnaW5uaW5nX29mX2lucHV0IGliXSB0ZXN0cyB0aGUgYmVnaW5uaW5nIG9mIGlucHV0XG4gICAgIGNvbmRpdGlvbiBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiAqKVxuXG4gIHZhbCBuYW1lX29mX2lucHV0IDogc2NhbmJ1ZiAtPiBzdHJpbmdcbiAgKCogW1NjYW5uaW5nLm5hbWVfb2ZfaW5wdXQgaWJdIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlclxuICAgICBzb3VyY2UgZm9yIGlucHV0IGJ1ZmZlciBbaWJdLiAqKVxuXG4gIHZhbCBvcGVuX2luIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIG9wZW5faW5fYmluIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fZmlsZSA6IGZpbGVfbmFtZSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2ZpbGVfYmluIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fc3RyaW5nIDogc3RyaW5nIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fZnVuY3Rpb24gOiAodW5pdCAtPiBjaGFyKSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2NoYW5uZWwgOiBTdGRsaWIuaW5fY2hhbm5lbCAtPiBpbl9jaGFubmVsXG5cbiAgdmFsIGNsb3NlX2luIDogaW5fY2hhbm5lbCAtPiB1bml0XG5cbiAgdmFsIG1lbW9fZnJvbV9jaGFubmVsIDogU3RkbGliLmluX2NoYW5uZWwgLT4gaW5fY2hhbm5lbFxuICAoKiBPYnNvbGV0ZS4gKilcblxuZW5kXG5cblxubW9kdWxlIFNjYW5uaW5nIDogU0NBTk5JTkcgPSBzdHJ1Y3RcblxuICAoKiBUaGUgcnVuLXRpbWUgbGlicmFyeSBmb3Igc2NhbmYuICopXG5cbiAgdHlwZSBmaWxlX25hbWUgPSBzdHJpbmdcblxuICB0eXBlIGluX2NoYW5uZWxfbmFtZSA9XG4gICAgfCBGcm9tX2NoYW5uZWwgb2YgU3RkbGliLmluX2NoYW5uZWxcbiAgICB8IEZyb21fZmlsZSBvZiBmaWxlX25hbWUgKiBTdGRsaWIuaW5fY2hhbm5lbFxuICAgIHwgRnJvbV9mdW5jdGlvblxuICAgIHwgRnJvbV9zdHJpbmdcblxuXG4gIHR5cGUgaW5fY2hhbm5lbCA9IHtcbiAgICBtdXRhYmxlIGljX2VvZiA6IGJvb2w7XG4gICAgbXV0YWJsZSBpY19jdXJyZW50X2NoYXIgOiBjaGFyO1xuICAgIG11dGFibGUgaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDogYm9vbDtcbiAgICBtdXRhYmxlIGljX2NoYXJfY291bnQgOiBpbnQ7XG4gICAgbXV0YWJsZSBpY19saW5lX2NvdW50IDogaW50O1xuICAgIG11dGFibGUgaWNfdG9rZW5fY291bnQgOiBpbnQ7XG4gICAgaWNfZ2V0X25leHRfY2hhciA6IHVuaXQgLT4gY2hhcjtcbiAgICBpY190b2tlbl9idWZmZXIgOiBCdWZmZXIudDtcbiAgICBpY19pbnB1dF9uYW1lIDogaW5fY2hhbm5lbF9uYW1lO1xuICB9XG5cblxuICB0eXBlIHNjYW5idWYgPSBpbl9jaGFubmVsXG5cbiAgbGV0IG51bGxfY2hhciA9ICdcXDAwMCdcblxuICAoKiBSZWFkcyBhIG5ldyBjaGFyYWN0ZXIgZnJvbSBpbnB1dCBidWZmZXIuXG4gICAgIE5leHRfY2hhciBuZXZlciBmYWlscywgZXZlbiBpbiBjYXNlIG9mIGVuZCBvZiBpbnB1dDpcbiAgICAgaXQgdGhlbiBzaW1wbHkgc2V0cyB0aGUgZW5kIG9mIGZpbGUgY29uZGl0aW9uLiAqKVxuICBsZXQgbmV4dF9jaGFyIGliID1cbiAgICB0cnlcbiAgICAgIGxldCBjID0gaWIuaWNfZ2V0X25leHRfY2hhciAoKSBpblxuICAgICAgaWIuaWNfY3VycmVudF9jaGFyIDwtIGM7XG4gICAgICBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPC0gdHJ1ZTtcbiAgICAgIGliLmljX2NoYXJfY291bnQgPC0gc3VjYyBpYi5pY19jaGFyX2NvdW50O1xuICAgICAgaWYgYyA9ICdcXG4nIHRoZW4gaWIuaWNfbGluZV9jb3VudCA8LSBzdWNjIGliLmljX2xpbmVfY291bnQ7XG4gICAgICBjIHdpdGhcbiAgICB8IEVuZF9vZl9maWxlIC0+XG4gICAgICBsZXQgYyA9IG51bGxfY2hhciBpblxuICAgICAgaWIuaWNfY3VycmVudF9jaGFyIDwtIGM7XG4gICAgICBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPC0gZmFsc2U7XG4gICAgICBpYi5pY19lb2YgPC0gdHJ1ZTtcbiAgICAgIGNcblxuXG4gIGxldCBwZWVrX2NoYXIgaWIgPVxuICAgIGlmIGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZFxuICAgIHRoZW4gaWIuaWNfY3VycmVudF9jaGFyXG4gICAgZWxzZSBuZXh0X2NoYXIgaWJcblxuXG4gICgqIFJldHVybnMgYSB2YWxpZCBjdXJyZW50IGNoYXIgZm9yIHRoZSBpbnB1dCBidWZmZXIuIEluIHBhcnRpY3VsYXJcbiAgICAgbm8gaXJyZWxldmFudCBudWxsIGNoYXJhY3RlciAoYXMgc2V0IGJ5IFtuZXh0X2NoYXJdIGluIGNhc2Ugb2YgZW5kXG4gICAgIG9mIGlucHV0KSBpcyByZXR1cm5lZCwgc2luY2UgW0VuZF9vZl9maWxlXSBpcyByYWlzZWQgd2hlblxuICAgICBbbmV4dF9jaGFyXSBzZXRzIHRoZSBlbmQgb2YgZmlsZSBjb25kaXRpb24gd2hpbGUgdHJ5aW5nIHRvIHJlYWQgYVxuICAgICBuZXcgY2hhcmFjdGVyLiAqKVxuICBsZXQgY2hlY2tlZF9wZWVrX2NoYXIgaWIgPVxuICAgIGxldCBjID0gcGVla19jaGFyIGliIGluXG4gICAgaWYgaWIuaWNfZW9mIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICAgY1xuXG5cbiAgbGV0IGVuZF9vZl9pbnB1dCBpYiA9XG4gICAgaWdub3JlIChwZWVrX2NoYXIgaWIpO1xuICAgIGliLmljX2VvZlxuXG5cbiAgbGV0IGVvZiBpYiA9IGliLmljX2VvZlxuXG4gIGxldCBiZWdpbm5pbmdfb2ZfaW5wdXQgaWIgPSBpYi5pY19jaGFyX2NvdW50ID0gMFxuXG4gIGxldCBuYW1lX29mX2lucHV0IGliID1cbiAgICBtYXRjaCBpYi5pY19pbnB1dF9uYW1lIHdpdGhcbiAgICB8IEZyb21fY2hhbm5lbCBfaWMgLT4gXCJ1bm5hbWVkIFN0ZGxpYiBpbnB1dCBjaGFubmVsXCJcbiAgICB8IEZyb21fZmlsZSAoZm5hbWUsIF9pYykgLT4gZm5hbWVcbiAgICB8IEZyb21fZnVuY3Rpb24gLT4gXCJ1bm5hbWVkIGZ1bmN0aW9uXCJcbiAgICB8IEZyb21fc3RyaW5nIC0+IFwidW5uYW1lZCBjaGFyYWN0ZXIgc3RyaW5nXCJcblxuXG4gIGxldCBjaGFyX2NvdW50IGliID1cbiAgICBpZiBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWRcbiAgICB0aGVuIGliLmljX2NoYXJfY291bnQgLSAxXG4gICAgZWxzZSBpYi5pY19jaGFyX2NvdW50XG5cblxuICBsZXQgbGluZV9jb3VudCBpYiA9IGliLmljX2xpbmVfY291bnRcblxuICBsZXQgcmVzZXRfdG9rZW4gaWIgPSBCdWZmZXIucmVzZXQgaWIuaWNfdG9rZW5fYnVmZmVyXG5cbiAgbGV0IGludmFsaWRhdGVfY3VycmVudF9jaGFyIGliID0gaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDwtIGZhbHNlXG5cbiAgbGV0IHRva2VuIGliID1cbiAgICBsZXQgdG9rZW5fYnVmZmVyID0gaWIuaWNfdG9rZW5fYnVmZmVyIGluXG4gICAgbGV0IHRvayA9IEJ1ZmZlci5jb250ZW50cyB0b2tlbl9idWZmZXIgaW5cbiAgICBCdWZmZXIuY2xlYXIgdG9rZW5fYnVmZmVyO1xuICAgIGliLmljX3Rva2VuX2NvdW50IDwtIHN1Y2MgaWIuaWNfdG9rZW5fY291bnQ7XG4gICAgdG9rXG5cblxuICBsZXQgdG9rZW5fY291bnQgaWIgPSBpYi5pY190b2tlbl9jb3VudFxuXG4gIGxldCBza2lwX2NoYXIgd2lkdGggaWIgPVxuICAgIGludmFsaWRhdGVfY3VycmVudF9jaGFyIGliO1xuICAgIHdpZHRoXG5cblxuICBsZXQgaWdub3JlX2NoYXIgd2lkdGggaWIgPSBza2lwX2NoYXIgKHdpZHRoIC0gMSkgaWJcblxuICBsZXQgc3RvcmVfY2hhciB3aWR0aCBpYiBjID1cbiAgICBCdWZmZXIuYWRkX2NoYXIgaWIuaWNfdG9rZW5fYnVmZmVyIGM7XG4gICAgaWdub3JlX2NoYXIgd2lkdGggaWJcblxuXG4gIGxldCBkZWZhdWx0X3Rva2VuX2J1ZmZlcl9zaXplID0gMTAyNFxuXG4gIGxldCBjcmVhdGUgaW5hbWUgbmV4dCA9IHtcbiAgICBpY19lb2YgPSBmYWxzZTtcbiAgICBpY19jdXJyZW50X2NoYXIgPSBudWxsX2NoYXI7XG4gICAgaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkID0gZmFsc2U7XG4gICAgaWNfY2hhcl9jb3VudCA9IDA7XG4gICAgaWNfbGluZV9jb3VudCA9IDA7XG4gICAgaWNfdG9rZW5fY291bnQgPSAwO1xuICAgIGljX2dldF9uZXh0X2NoYXIgPSBuZXh0O1xuICAgIGljX3Rva2VuX2J1ZmZlciA9IEJ1ZmZlci5jcmVhdGUgZGVmYXVsdF90b2tlbl9idWZmZXJfc2l6ZTtcbiAgICBpY19pbnB1dF9uYW1lID0gaW5hbWU7XG4gIH1cblxuXG4gIGxldCBmcm9tX3N0cmluZyBzID1cbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgIGxldCBuZXh0ICgpID1cbiAgICAgIGlmICFpID49IGxlbiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlIGVsc2VcbiAgICAgIGxldCBjID0gcy5bIWldIGluXG4gICAgICBpbmNyIGk7XG4gICAgICBjIGluXG4gICAgY3JlYXRlIEZyb21fc3RyaW5nIG5leHRcblxuXG4gIGxldCBmcm9tX2Z1bmN0aW9uID0gY3JlYXRlIEZyb21fZnVuY3Rpb25cblxuICAoKiBTY2FubmluZyBmcm9tIGFuIGlucHV0IGNoYW5uZWwuICopXG5cbiAgKCogUG9zaXRpb24gb2YgdGhlIHByb2JsZW06XG5cbiAgICAgV2UgY2Fubm90IHByZXZlbnQgdGhlIHNjYW5uaW5nIG1lY2hhbmlzbSB0byB1c2Ugb25lIGxvb2thaGVhZCBjaGFyYWN0ZXIsXG4gICAgIGlmIG5lZWRlZCBieSB0aGUgc2VtYW50aWNzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIHNwZWNpZmljYXRpb25zIChlLmcuIGFcbiAgICAgdHJhaWxpbmcgJ3NraXAgc3BhY2UnIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm1hdCBzdHJpbmcpOyBpbiB0aGlzIGNhc2UsXG4gICAgIHRoZSBtYW5kYXRvcnkgbG9va2FoZWFkIGNoYXJhY3RlciBpcyBpbmRlZWQgcmVhZCBmcm9tIHRoZSBpbnB1dCBhbmQgbm90XG4gICAgIHVzZWQgdG8gcmV0dXJuIHRoZSB0b2tlbiByZWFkLiBJdCBpcyB0aHVzIG1hbmRhdG9yeSB0byBiZSBhYmxlIHRvIHN0b3JlXG4gICAgIGFuIHVudXNlZCBsb29rYWhlYWQgY2hhcmFjdGVyIHNvbWV3aGVyZSB0byBnZXQgaXQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlclxuICAgICBvZiB0aGUgbmV4dCBzY2FuLlxuXG4gICAgIFRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtLCBhbGwgdGhlIHNjYW5uaW5nIGZ1bmN0aW9ucyBnZXQgYSBsb3cgbGV2ZWxcbiAgICAgaW5wdXQgYnVmZmVyIGFyZ3VtZW50IHdoZXJlIHRoZXkgc3RvcmUgdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXIgd2hlblxuICAgICBuZWVkZWQ7IGFkZGl0aW9uYWxseSwgdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgb25seSBzb3VyY2Ugb2YgY2hhcmFjdGVyIG9mXG4gICAgIGEgc2Nhbm5lci4gVGhlIFtzY2FuYnVmXSBpbnB1dCBidWZmZXJzIGFyZSBkZWZpbmVkIGluIG1vZHVsZSB7IVNjYW5uaW5nfS5cblxuICAgICBOb3cgd2UgdW5kZXJzdGFuZCB0aGF0IGl0IGlzIGV4dHJlbWVseSBpbXBvcnRhbnQgdGhhdCByZWxhdGVkIGFuZFxuICAgICBzdWNjZXNzaXZlIGNhbGxzIHRvIHNjYW5uZXJzIGluZGVlZCByZWFkIGZyb20gdGhlIHNhbWUgaW5wdXQgYnVmZmVyLlxuICAgICBJbiBlZmZlY3QsIGlmIGEgc2Nhbm5lciBbc2NhbjFdIGlzIHJlYWRpbmcgZnJvbSBbaWIxXSBhbmQgc3RvcmVzIGFuXG4gICAgIHVudXNlZCBsb29rYWhlYWQgY2hhcmFjdGVyIFtjMV0gaW50byBpdHMgaW5wdXQgYnVmZmVyIFtpYjFdLCB0aGVuXG4gICAgIGFub3RoZXIgc2Nhbm5lciBbc2NhbjJdIG5vdCByZWFkaW5nIGZyb20gdGhlIHNhbWUgYnVmZmVyIFtpYjFdIHdpbGwgbWlzc1xuICAgICB0aGUgY2hhcmFjdGVyIFtjMV0sIHNlZW1pbmdseSB2YW5pc2hlZCBpbiB0aGUgYWlyIGZyb20gdGhlIHBvaW50IG9mIHZpZXdcbiAgICAgb2YgW3NjYW4yXS5cblxuICAgICBUaGlzIG1lY2hhbmlzbSB3b3JrcyBwZXJmZWN0bHkgdG8gcmVhZCBmcm9tIHN0cmluZ3MsIGZyb20gZmlsZXMsIGFuZCBmcm9tXG4gICAgIGZ1bmN0aW9ucywgc2luY2UgaW4gdGhvc2UgY2FzZXMsIGFsbG9jYXRpbmcgdHdvIGJ1ZmZlcnMgcmVhZGluZyBmcm9tIHRoZVxuICAgICBzYW1lIHNvdXJjZSBpcyB1bm5hdHVyYWwuXG5cbiAgICAgU3RpbGwsIHRoZXJlIGlzIGEgZGlmZmljdWx0eSBpbiB0aGUgY2FzZSBvZiBzY2FubmluZyBmcm9tIGFuIGlucHV0XG4gICAgIGNoYW5uZWwuIEluIGVmZmVjdCwgd2hlbiBzY2FubmluZyBmcm9tIGFuIGlucHV0IGNoYW5uZWwgW2ljXSwgdGhpcyBjaGFubmVsXG4gICAgIG1heSBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHdpdGhpbiB0aGlzIGxpYnJhcnkuIEhlbmNlLCBpdCBtYXkgYmVcbiAgICAgc2hhcmVkICh0d28gZnVuY3Rpb25zIG9mIHRoZSB1c2VyJ3MgcHJvZ3JhbSBtYXkgc3VjY2Vzc2l2ZWx5IHJlYWQgZnJvbVxuICAgICBbaWNdKS4gVGhpcyBpcyBoaWdobHkgZXJyb3IgcHJvbmUgc2luY2UsIG9uZSBvZiB0aGUgZnVuY3Rpb24gbWF5IHNlZWsgdGhlXG4gICAgIGlucHV0IGNoYW5uZWwsIHdoaWxlIHRoZSBvdGhlciBmdW5jdGlvbiBoYXMgc3RpbGwgYW4gdW51c2VkIGxvb2thaGVhZFxuICAgICBjaGFyYWN0ZXIgaW4gaXRzIGlucHV0IGJ1ZmZlci4gSW4gY29uY2x1c2lvbiwgeW91IHNob3VsZCBuZXZlciBtaXggZGlyZWN0XG4gICAgIGxvdyBsZXZlbCByZWFkaW5nIGFuZCBoaWdoIGxldmVsIHNjYW5uaW5nIGZyb20gdGhlIHNhbWUgaW5wdXQgY2hhbm5lbC5cblxuICAqKVxuXG4gICgqIFBlcmZvcm0gYnVmZmVyaXplZCBpbnB1dCB0byBpbXByb3ZlIGVmZmljaWVuY3kuICopXG4gIGxldCBmaWxlX2J1ZmZlcl9zaXplID0gcmVmIDEwMjRcblxuICAoKiBUaGUgc2Nhbm5lciBjbG9zZXMgdGhlIGlucHV0IGNoYW5uZWwgYXQgZW5kIG9mIGlucHV0LiAqKVxuICBsZXQgc2Nhbl9jbG9zZV9hdF9lbmQgaWMgPSBTdGRsaWIuY2xvc2VfaW4gaWM7IHJhaXNlIEVuZF9vZl9maWxlXG5cbiAgKCogVGhlIHNjYW5uZXIgZG9lcyBub3QgY2xvc2UgdGhlIGlucHV0IGNoYW5uZWwgYXQgZW5kIG9mIGlucHV0OlxuICAgICBpdCBqdXN0IHJhaXNlcyBbRW5kX29mX2ZpbGVdLiAqKVxuICBsZXQgc2Nhbl9yYWlzZV9hdF9lbmQgX2ljID0gcmFpc2UgRW5kX29mX2ZpbGVcblxuICBsZXQgZnJvbV9pYyBzY2FuX2Nsb3NlX2ljIGluYW1lIGljID1cbiAgICBsZXQgbGVuID0gIWZpbGVfYnVmZmVyX3NpemUgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGxlbiBpblxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgbGltID0gcmVmIDAgaW5cbiAgICBsZXQgZW9mID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IG5leHQgKCkgPVxuICAgICAgaWYgIWkgPCAhbGltIHRoZW4gYmVnaW4gbGV0IGMgPSBCeXRlcy5nZXQgYnVmICFpIGluIGluY3IgaTsgYyBlbmQgZWxzZVxuICAgICAgaWYgIWVvZiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlIGVsc2UgYmVnaW5cbiAgICAgICAgbGltIDo9IGlucHV0IGljIGJ1ZiAwIGxlbjtcbiAgICAgICAgaWYgIWxpbSA9IDAgdGhlbiBiZWdpbiBlb2YgOj0gdHJ1ZTsgc2Nhbl9jbG9zZV9pYyBpYyBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgIGkgOj0gMTtcbiAgICAgICAgICBCeXRlcy5nZXQgYnVmIDBcbiAgICAgICAgZW5kXG4gICAgICBlbmQgaW5cbiAgICBjcmVhdGUgaW5hbWUgbmV4dFxuXG5cbiAgbGV0IGZyb21faWNfY2xvc2VfYXRfZW5kID0gZnJvbV9pYyBzY2FuX2Nsb3NlX2F0X2VuZFxuICBsZXQgZnJvbV9pY19yYWlzZV9hdF9lbmQgPSBmcm9tX2ljIHNjYW5fcmFpc2VfYXRfZW5kXG5cbiAgKCogVGhlIHNjYW5uaW5nIGJ1ZmZlciByZWFkaW5nIGZyb20gW1N0ZGxpYi5zdGRpbl0uXG4gICAgIE9uZSBjb3VsZCB0cnkgdG8gZGVmaW5lIFtzdGRpYl0gYXMgYSBzY2FubmluZyBidWZmZXIgcmVhZGluZyBhIGNoYXJhY3RlclxuICAgICBhdCBhIHRpbWUgKG5vIGJ1ZmZlcml6YXRpb24gYXQgYWxsKSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIHRvcC1sZXZlbFxuICAgICBpbnRlcmFjdGlvbiB3b3VsZCBiZSB3cm9uZy4gVGhpcyBpcyBkdWUgdG8gc29tZSBraW5kIG9mXG4gICAgICdyYWNlIGNvbmRpdGlvbicgd2hlbiByZWFkaW5nIGZyb20gW1N0ZGxpYi5zdGRpbl0sXG4gICAgIHNpbmNlIHRoZSBpbnRlcmFjdGl2ZSBjb21waWxlciBhbmQgW1NjYW5mLnNjYW5mXSB3aWxsIHNpbXVsdGFuZW91c2x5XG4gICAgIHJlYWQgdGhlIG1hdGVyaWFsIHRoZXkgbmVlZCBmcm9tIFtTdGRsaWIuc3RkaW5dOyB0aGVuLCBjb25mdXNpb25cbiAgICAgd2lsbCByZXN1bHQgZnJvbSB3aGF0IHNob3VsZCBiZSByZWFkIGJ5IHRoZSB0b3AtbGV2ZWwgYW5kIHdoYXQgc2hvdWxkIGJlXG4gICAgIHJlYWQgYnkgW1NjYW5mLnNjYW5mXS5cbiAgICAgVGhpcyBpcyBldmVuIG1vcmUgY29tcGxpY2F0ZWQgYnkgdGhlIG9uZSBjaGFyYWN0ZXIgbG9va2FoZWFkIHRoYXRcbiAgICAgW1NjYW5mLnNjYW5mXSBpcyBzb21ldGltZXMgb2JsaWdlZCB0byBtYWludGFpbjogdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXJcbiAgICAgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHRoZSBuZXh0IFtTY2FuZi5zY2FuZl0gZW50cnksIHNlZW1pbmdseSBjb21pbmcgZnJvbVxuICAgICBub3doZXJlLlxuICAgICBBbHNvIG5vIFtFbmRfb2ZfZmlsZV0gaXMgcmFpc2VkIHdoZW4gcmVhZGluZyBmcm9tIHN0ZGluOiBpZiBub3QgZW5vdWdoXG4gICAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHJlYWQsIHdlIHNpbXBseSBhc2sgdG8gcmVhZCBtb3JlLiAqKVxuICBsZXQgc3RkaW4gPVxuICAgIGZyb21faWMgc2Nhbl9yYWlzZV9hdF9lbmRcbiAgICAgIChGcm9tX2ZpbGUgKFwiLVwiLCBTdGRsaWIuc3RkaW4pKSBTdGRsaWIuc3RkaW5cblxuXG4gIGxldCBzdGRpYiA9IHN0ZGluXG5cbiAgbGV0IG9wZW5faW5fZmlsZSBvcGVuX2luIGZuYW1lID1cbiAgICBtYXRjaCBmbmFtZSB3aXRoXG4gICAgfCBcIi1cIiAtPiBzdGRpblxuICAgIHwgZm5hbWUgLT5cbiAgICAgIGxldCBpYyA9IG9wZW5faW4gZm5hbWUgaW5cbiAgICAgIGZyb21faWNfY2xvc2VfYXRfZW5kIChGcm9tX2ZpbGUgKGZuYW1lLCBpYykpIGljXG5cblxuICBsZXQgb3Blbl9pbiA9IG9wZW5faW5fZmlsZSBTdGRsaWIub3Blbl9pblxuICBsZXQgb3Blbl9pbl9iaW4gPSBvcGVuX2luX2ZpbGUgU3RkbGliLm9wZW5faW5fYmluXG5cbiAgbGV0IGZyb21fZmlsZSA9IG9wZW5faW5cbiAgbGV0IGZyb21fZmlsZV9iaW4gPSBvcGVuX2luX2JpblxuXG4gIGxldCBmcm9tX2NoYW5uZWwgaWMgPVxuICAgIGZyb21faWNfcmFpc2VfYXRfZW5kIChGcm9tX2NoYW5uZWwgaWMpIGljXG5cblxuICBsZXQgY2xvc2VfaW4gaWIgPVxuICAgIG1hdGNoIGliLmljX2lucHV0X25hbWUgd2l0aFxuICAgIHwgRnJvbV9jaGFubmVsIGljIC0+XG4gICAgICBTdGRsaWIuY2xvc2VfaW4gaWNcbiAgICB8IEZyb21fZmlsZSAoX2ZuYW1lLCBpYykgLT4gU3RkbGliLmNsb3NlX2luIGljXG4gICAgfCBGcm9tX2Z1bmN0aW9uIHwgRnJvbV9zdHJpbmcgLT4gKClcblxuXG4gICgqXG4gICAgIE9ic29sZXRlOiBhIG1lbW8gW2Zyb21fY2hhbm5lbF0gdmVyc2lvbiB0byBidWlsZCBhIFtTY2FubmluZy5pbl9jaGFubmVsXVxuICAgICBzY2FubmluZyBidWZmZXIgb3V0IG9mIGEgW1N0ZGxpYi5pbl9jaGFubmVsXS5cbiAgICAgVGhpcyBmdW5jdGlvbiB3YXMgdXNlZCB0byB0cnkgdG8gcHJlc2VydmUgdGhlIHNjYW5uaW5nXG4gICAgIHNlbWFudGljcyBmb3IgdGhlIChub3cgb2Jzb2xldGUpIGZ1bmN0aW9uIFtmc2NhbmZdLlxuICAgICBHaXZlbiB0aGF0IGFsbCBzY2FubmVyIG11c3QgcmVhZCBmcm9tIGEgW1NjYW5uaW5nLmluX2NoYW5uZWxdIHNjYW5uaW5nXG4gICAgIGJ1ZmZlciwgW2ZzY2FuZl0gbXVzdCByZWFkIGZyb20gb25lIVxuICAgICBNb3JlIHByZWNpc2VseSwgZ2l2ZW4gW2ljXSwgYWxsIHN1Y2Nlc3NpdmUgY2FsbHMgW2ZzY2FuZiBpY10gbXVzdCByZWFkXG4gICAgIGZyb20gdGhlIHNhbWUgc2Nhbm5pbmcgYnVmZmVyLlxuICAgICBUaGlzIG9ibGlnZWQgdGhpcyBsaWJyYXJ5IHRvIGFsbG9jYXRlZCBzY2FubmluZyBidWZmZXJzIHRoYXQgd2VyZVxuICAgICBub3QgcHJvcGVybHkgZ2FyYmFnZSBjb2xsZWN0YWJsZSwgaGVuY2UgbGVhZGluZyB0byBtZW1vcnkgbGVha3MuXG4gICAgIElmIHlvdSBuZWVkIHRvIHJlYWQgZnJvbSBhIFtTdGRsaWIuaW5fY2hhbm5lbF0gaW5wdXQgY2hhbm5lbFxuICAgICBbaWNdLCBzaW1wbHkgZGVmaW5lIGEgW1NjYW5uaW5nLmluX2NoYW5uZWxdIGZvcm1hdHRlZCBpbnB1dCBjaGFubmVsIGFzIGluXG4gICAgIFtsZXQgaWIgPSBTY2FubmluZy5mcm9tX2NoYW5uZWwgaWNdLCB0aGVuIHVzZSBbU2NhbmYuYnNjYW5mIGliXSBhcyB1c3VhbC5cbiAgKilcbiAgbGV0IG1lbW9fZnJvbV9pYyA9XG4gICAgbGV0IG1lbW8gPSByZWYgW10gaW5cbiAgICAoZnVuIHNjYW5fY2xvc2VfaWMgaWMgLT5cbiAgICAgdHJ5IExpc3QuYXNzcSBpYyAhbWVtbyB3aXRoXG4gICAgIHwgTm90X2ZvdW5kIC0+XG4gICAgICAgbGV0IGliID1cbiAgICAgICAgIGZyb21faWMgc2Nhbl9jbG9zZV9pYyAoRnJvbV9jaGFubmVsIGljKSBpYyBpblxuICAgICAgIG1lbW8gOj0gKGljLCBpYikgOjogIW1lbW87XG4gICAgICAgaWIpXG5cblxuICAoKiBPYnNvbGV0ZTogc2VlIHshbWVtb19mcm9tX2ljfSBhYm92ZS4gKilcbiAgbGV0IG1lbW9fZnJvbV9jaGFubmVsID0gbWVtb19mcm9tX2ljIHNjYW5fcmFpc2VfYXRfZW5kXG5cbmVuZFxuXG5cbigqIEZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbnMuICopXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBzY2FubmVyID1cbiAgICAgKCdhLCBTY2FubmluZy5pbl9jaGFubmVsLCAnYiwgJ2MsICdhIC0+ICdkLCAnZCkgZm9ybWF0NiAtPiAnY1xuXG5cbigqIFJlcG9ydGluZyBlcnJvcnMuICopXG5leGNlcHRpb24gU2Nhbl9mYWlsdXJlIG9mIHN0cmluZ1xuXG5sZXQgYmFkX2lucHV0IHMgPSByYWlzZSAoU2Nhbl9mYWlsdXJlIHMpXG5cbmxldCBiYWRfaW5wdXRfZXNjYXBlIGMgPVxuICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiaWxsZWdhbCBlc2NhcGUgY2hhcmFjdGVyICVDXCIgYylcblxuXG5sZXQgYmFkX3Rva2VuX2xlbmd0aCBtZXNzYWdlID1cbiAgYmFkX2lucHV0XG4gICAgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgXCJzY2FubmluZyBvZiAlcyBmYWlsZWQ6IFxcXG4gICAgICAgIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIHdhcyB0b28gc2hvcnQgZm9yIHRva2VuXCJcbiAgICAgICBtZXNzYWdlKVxuXG5cbmxldCBiYWRfZW5kX29mX2lucHV0IG1lc3NhZ2UgPVxuICBiYWRfaW5wdXRcbiAgICAoUHJpbnRmLnNwcmludGZcbiAgICAgICBcInNjYW5uaW5nIG9mICVzIGZhaWxlZDogXFxcbiAgICAgICAgcHJlbWF0dXJlIGVuZCBvZiBmaWxlIG9jY3VycmVkIGJlZm9yZSBlbmQgb2YgdG9rZW5cIlxuICAgICAgIG1lc3NhZ2UpXG5cblxubGV0IGJhZF9mbG9hdCAoKSA9XG4gIGJhZF9pbnB1dCBcIm5vIGRvdCBvciBleHBvbmVudCBwYXJ0IGZvdW5kIGluIGZsb2F0IHRva2VuXCJcblxuXG5sZXQgYmFkX2hleF9mbG9hdCAoKSA9XG4gIGJhZF9pbnB1dCBcIm5vdCBhIHZhbGlkIGZsb2F0IGluIGhleGFkZWNpbWFsIG5vdGF0aW9uXCJcblxuXG5sZXQgY2hhcmFjdGVyX21pc21hdGNoX2VyciBjIGNpID1cbiAgUHJpbnRmLnNwcmludGYgXCJsb29raW5nIGZvciAlQywgZm91bmQgJUNcIiBjIGNpXG5cblxubGV0IGNoYXJhY3Rlcl9taXNtYXRjaCBjIGNpID1cbiAgYmFkX2lucHV0IChjaGFyYWN0ZXJfbWlzbWF0Y2hfZXJyIGMgY2kpXG5cblxubGV0IHJlYyBza2lwX3doaXRlcyBpYiA9XG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIG5vdCAoU2Nhbm5pbmcuZW9mIGliKSB0aGVuIGJlZ2luXG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCAnICcgfCAnXFx0JyB8ICdcXG4nIHwgJ1xccicgLT5cbiAgICAgIFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliOyBza2lwX3doaXRlcyBpYlxuICAgIHwgXyAtPiAoKVxuICBlbmRcblxuXG4oKiBDaGVja2luZyB0aGF0IFtjXSBpcyBpbmRlZWQgaW4gdGhlIGlucHV0LCB0aGVuIHNraXBzIGl0LlxuICAgSW4gdGhpcyBjYXNlLCB0aGUgY2hhcmFjdGVyIFtjXSBoYXMgYmVlbiBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGVcbiAgIGZvcm1hdCBhcyBiZWluZyBtYW5kYXRvcnkgaW4gdGhlIGlucHV0OyBoZW5jZSB3ZSBzaG91bGQgZmFpbCB3aXRoXG4gICBbRW5kX29mX2ZpbGVdIGluIGNhc2Ugb2YgZW5kX29mX2lucHV0LlxuICAgKFJlbWVtYmVyIHRoYXQgW1NjYW5fZmFpbHVyZV0gaXMgcmFpc2VkIG9ubHkgd2hlbiAod2UgY2FuIHByb3ZlIGJ5XG4gICBldmlkZW5jZSkgdGhhdCB0aGUgaW5wdXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4uIFdlIG11c3RcbiAgIHRodXMgZGlmZmVyZW50aWF0ZSBbRW5kX29mX2ZpbGVdIGFzIGFuIGVycm9yIGR1ZSB0byBsYWNrIG9mIGlucHV0LCBhbmRcbiAgIFtTY2FuX2ZhaWx1cmVdIHdoaWNoIGlzIGR1ZSB0byBwcm92YWJseSB3cm9uZyBpbnB1dC4gSSBhbSBub3Qgc3VyZSB0aGlzIGlzXG4gICB3b3J0aCB0aGUgYnVyZGVuOiBpdCBpcyBjb21wbGV4IGFuZCBzb21laG93IHN1YmxpbWluYWw7IHNob3VsZCBiZSBjbGVhcmVyXG4gICB0byBmYWlsIHdpdGggU2Nhbl9mYWlsdXJlIFwiTm90IGVub3VnaCBpbnB1dCB0byBjb21wbGV0ZSBzY2FubmluZ1wiISlcblxuICAgVGhhdCdzIHdoeSwgd2FpdGluZyBmb3IgYSBiZXR0ZXIgc29sdXRpb24sIHdlIHVzZSBjaGVja2VkX3BlZWtfY2hhciBoZXJlLlxuICAgV2UgYXJlIGFsc28gY2FyZWZ1bCB0byB0cmVhdCBcIlxcclxcblwiIGluIHRoZSBpbnB1dCBhcyBhbiBlbmQgb2YgbGluZSBtYXJrZXI6XG4gICBpdCBhbHdheXMgbWF0Y2hlcyBhICdcXG4nIHNwZWNpZmljYXRpb24gaW4gdGhlIGlucHV0IGZvcm1hdCBzdHJpbmcuICopXG5sZXQgcmVjIGNoZWNrX2NoYXIgaWIgYyA9XG4gIG1hdGNoIGMgd2l0aFxuICB8ICcgJyAtPiBza2lwX3doaXRlcyBpYlxuICB8ICdcXG4nIC0+IGNoZWNrX25ld2xpbmUgaWJcbiAgfCBjIC0+IGNoZWNrX3RoaXNfY2hhciBpYiBjXG5cbmFuZCBjaGVja190aGlzX2NoYXIgaWIgYyA9XG4gIGxldCBjaSA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIGlmIGNpID0gYyB0aGVuIFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliIGVsc2VcbiAgY2hhcmFjdGVyX21pc21hdGNoIGMgY2lcblxuYW5kIGNoZWNrX25ld2xpbmUgaWIgPVxuICBsZXQgY2kgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBtYXRjaCBjaSB3aXRoXG4gIHwgJ1xcbicgLT4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWJcbiAgfCAnXFxyJyAtPiBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYjsgY2hlY2tfdGhpc19jaGFyIGliICdcXG4nXG4gIHwgXyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcbicgY2lcblxuXG4oKiBFeHRyYWN0aW5nIHRva2VucyBmcm9tIHRoZSBvdXRwdXQgdG9rZW4gYnVmZmVyLiAqKVxuXG5sZXQgdG9rZW5fY2hhciBpYiA9IChTY2FubmluZy50b2tlbiBpYikuWzBdXG5cbmxldCB0b2tlbl9zdHJpbmcgPSBTY2FubmluZy50b2tlblxuXG5sZXQgdG9rZW5fYm9vbCBpYiA9XG4gIG1hdGNoIFNjYW5uaW5nLnRva2VuIGliIHdpdGhcbiAgfCBcInRydWVcIiAtPiB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IGZhbHNlXG4gIHwgcyAtPiBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiaW52YWxpZCBib29sZWFuICclcydcIiBzKVxuXG5cbigqIFRoZSB0eXBlIG9mIGludGVnZXIgY29udmVyc2lvbnMuICopXG50eXBlIGludGVnZXJfY29udmVyc2lvbiA9XG4gIHwgQl9jb252ZXJzaW9uICgqIFVuc2lnbmVkIGJpbmFyeSBjb252ZXJzaW9uICopXG4gIHwgRF9jb252ZXJzaW9uICgqIFNpZ25lZCBkZWNpbWFsIGNvbnZlcnNpb24gKilcbiAgfCBJX2NvbnZlcnNpb24gKCogU2lnbmVkIGludGVnZXIgY29udmVyc2lvbiAqKVxuICB8IE9fY29udmVyc2lvbiAoKiBVbnNpZ25lZCBvY3RhbCBjb252ZXJzaW9uICopXG4gIHwgVV9jb252ZXJzaW9uICgqIFVuc2lnbmVkIGRlY2ltYWwgY29udmVyc2lvbiAqKVxuICB8IFhfY29udmVyc2lvbiAoKiBVbnNpZ25lZCBoZXhhZGVjaW1hbCBjb252ZXJzaW9uICopXG5cblxubGV0IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyID0gZnVuY3Rpb25cbiAgfCAnYicgLT4gQl9jb252ZXJzaW9uXG4gIHwgJ2QnIC0+IERfY29udmVyc2lvblxuICB8ICdpJyAtPiBJX2NvbnZlcnNpb25cbiAgfCAnbycgLT4gT19jb252ZXJzaW9uXG4gIHwgJ3UnIC0+IFVfY29udmVyc2lvblxuICB8ICd4JyB8ICdYJyAtPiBYX2NvbnZlcnNpb25cbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5cbigqIEV4dHJhY3QgYW4gaW50ZWdlciBsaXRlcmFsIHRva2VuLlxuICAgU2luY2UgdGhlIGZ1bmN0aW9ucyBTdGRsaWIuKmludCpfb2Zfc3RyaW5nIGRvIG5vdCBhY2NlcHQgYSBsZWFkaW5nICssXG4gICB3ZSBza2lwIGl0IGlmIG5lY2Vzc2FyeS4gKilcbmxldCB0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliID1cbiAgbGV0IHRvayA9XG4gICAgbWF0Y2ggY29udiB3aXRoXG4gICAgfCBEX2NvbnZlcnNpb24gfCBJX2NvbnZlcnNpb24gLT4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IFVfY29udmVyc2lvbiAtPiBcIjB1XCIgXiBTY2FubmluZy50b2tlbiBpYlxuICAgIHwgT19jb252ZXJzaW9uIC0+IFwiMG9cIiBeIFNjYW5uaW5nLnRva2VuIGliXG4gICAgfCBYX2NvbnZlcnNpb24gLT4gXCIweFwiIF4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IEJfY29udmVyc2lvbiAtPiBcIjBiXCIgXiBTY2FubmluZy50b2tlbiBpYiBpblxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggdG9rIGluXG4gIGlmIGwgPSAwIHx8IHRvay5bMF0gPD4gJysnIHRoZW4gdG9rIGVsc2UgU3RyaW5nLnN1YiB0b2sgMSAobCAtIDEpXG5cblxuKCogQWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgbnVtYmVyIHJhaXNlIHRoZSBleGNlcHRpb25cbiAgIEZhaWx1cmUgd2hlbiB0aGUgY29udmVyc2lvbiBpcyBub3QgcG9zc2libGUuXG4gICBUaGlzIGV4Y2VwdGlvbiBpcyB0aGVuIHRyYXBwZWQgaW4gW2tzY2FuZl0uICopXG5sZXQgdG9rZW5faW50IGNvbnYgaWIgPSBpbnRfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxuXG5sZXQgdG9rZW5fZmxvYXQgaWIgPSBmbG9hdF9vZl9zdHJpbmcgKFNjYW5uaW5nLnRva2VuIGliKVxuXG4oKiBUbyBzY2FuIG5hdGl2ZSBpbnRzLCBpbnQzMiBhbmQgaW50NjQgaW50ZWdlcnMuXG4gICBXZSBjYW5ub3QgYWNjZXNzIHRvIGNvbnZlcnNpb25zIHRvL2Zyb20gc3RyaW5ncyBmb3IgdGhvc2UgdHlwZXMsXG4gICBOYXRpdmVpbnQub2Zfc3RyaW5nLCBJbnQzMi5vZl9zdHJpbmcsIGFuZCBJbnQ2NC5vZl9zdHJpbmcsXG4gICBzaW5jZSB0aG9zZSBtb2R1bGVzIGFyZSBub3QgYXZhaWxhYmxlIHRvIFtTY2FuZl0uXG4gICBIb3dldmVyLCB3ZSBjYW4gYmluZCBhbmQgdXNlIHRoZSBjb3JyZXNwb25kaW5nIHByaW1pdGl2ZXMgdGhhdCBhcmVcbiAgIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZS4gKilcbmV4dGVybmFsIG5hdGl2ZWludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gbmF0aXZlaW50XG4gID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCBpbnQzMl9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgaW50NjRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cblxubGV0IHRva2VuX25hdGl2ZWludCBjb252IGliID0gbmF0aXZlaW50X29mX3N0cmluZyAodG9rZW5faW50X2xpdGVyYWwgY29udiBpYilcbmxldCB0b2tlbl9pbnQzMiBjb252IGliID0gaW50MzJfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxubGV0IHRva2VuX2ludDY0IGNvbnYgaWIgPSBpbnQ2NF9vZl9zdHJpbmcgKHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIpXG5cbigqIFNjYW5uaW5nIG51bWJlcnMuICopXG5cbigqIERpZ2l0cyBzY2FubmluZyBmdW5jdGlvbnMgc3VwcG9zZSB0aGF0IG9uZSBjaGFyYWN0ZXIgaGFzIGJlZW4gY2hlY2tlZCBhbmRcbiAgIGlzIGF2YWlsYWJsZSwgc2luY2UgdGhleSByZXR1cm4gYXQgZW5kIG9mIGZpbGUgd2l0aCB0aGUgY3VycmVudGx5IGZvdW5kXG4gICB0b2tlbiBzZWxlY3RlZC5cblxuICAgUHV0IGl0IGluIGFub3RoZXIgd2F5LCB0aGUgZGlnaXRzIHNjYW5uaW5nIGZ1bmN0aW9ucyBzY2FuIGZvciBhIHBvc3NpYmx5XG4gICBlbXB0eSBzZXF1ZW5jZSBvZiBkaWdpdHMsIChoZW5jZSwgYSBzdWNjZXNzZnVsIHNjYW5uaW5nIGZyb20gb25lIG9mIHRob3NlXG4gICBmdW5jdGlvbnMgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUgdG9rZW4gaXMgYSB3ZWxsLWZvcm1lZCBudW1iZXI6IHRvIGdldCBhXG4gICB0cnVlIG51bWJlciwgaXQgaXMgbWFuZGF0b3J5IHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIHZhbGlkIGRpZ2l0IGlzXG4gICBhdmFpbGFibGUgYmVmb3JlIGNhbGxpbmcgb25lIG9mIHRoZSBkaWdpdCBzY2FubmluZyBmdW5jdGlvbnMpLiAqKVxuXG4oKiBUaGUgZGVjaW1hbCBjYXNlIGlzIHRyZWF0ZWQgZXNwZWNpYWxseSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLiAqKVxubGV0IHJlYyBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuICB8ICdfJyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliIGluXG4gICAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWJcbiAgfCBfIC0+IHdpZHRoXG5cblxubGV0IHNjYW5fZGVjaW1hbF9kaWdpdF9wbHVzIHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBcImRlY2ltYWwgZGlnaXRzXCIgZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcwJyAuLiAnOScgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuICB8IGMgLT5cbiAgICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiY2hhcmFjdGVyICVDIGlzIG5vdCBhIGRlY2ltYWwgZGlnaXRcIiBjKVxuXG5cbigqIFRvIHNjYW4gbnVtYmVycyBmcm9tIG90aGVyIGJhc2VzLCB3ZSB1c2UgYSBwcmVkaWNhdGUgYXJndW1lbnQgdG9cbiAgIHNjYW4gZGlnaXRzLiAqKVxubGV0IHNjYW5fZGlnaXRfc3RhciBkaWdpdHAgd2lkdGggaWIgPVxuICBsZXQgcmVjIHNjYW5fZGlnaXRzIHdpZHRoIGliID1cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCBjIHdoZW4gZGlnaXRwIGMgLT5cbiAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgc2Nhbl9kaWdpdHMgd2lkdGggaWJcbiAgICB8ICdfJyAtPlxuICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIgaW5cbiAgICAgIHNjYW5fZGlnaXRzIHdpZHRoIGliXG4gICAgfCBfIC0+IHdpZHRoIGluXG4gIHNjYW5fZGlnaXRzIHdpZHRoIGliXG5cblxubGV0IHNjYW5fZGlnaXRfcGx1cyBiYXNpcyBkaWdpdHAgd2lkdGggaWIgPVxuICAoKiBFbnN1cmUgd2UgaGF2ZSBnb3QgZW5vdWdoIHdpZHRoIGxlZnQsXG4gICAgIGFuZCByZWFkIGF0IGxlYXN0IG9uZSBkaWdpdC4gKilcbiAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBcImRpZ2l0c1wiIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBpZiBkaWdpdHAgYyB0aGVuXG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgc2Nhbl9kaWdpdF9zdGFyIGRpZ2l0cCB3aWR0aCBpYlxuICBlbHNlXG4gICAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcImNoYXJhY3RlciAlQyBpcyBub3QgYSB2YWxpZCAlcyBkaWdpdFwiIGMgYmFzaXMpXG5cblxubGV0IGlzX2JpbmFyeV9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICcxJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5cbmxldCBzY2FuX2JpbmFyeV9pbnQgPSBzY2FuX2RpZ2l0X3BsdXMgXCJiaW5hcnlcIiBpc19iaW5hcnlfZGlnaXRcblxubGV0IGlzX29jdGFsX2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzcnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxubGV0IHNjYW5fb2N0YWxfaW50ID0gc2Nhbl9kaWdpdF9wbHVzIFwib2N0YWxcIiBpc19vY3RhbF9kaWdpdFxuXG5sZXQgaXNfaGV4YV9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxubGV0IHNjYW5faGV4YWRlY2ltYWxfaW50ID0gc2Nhbl9kaWdpdF9wbHVzIFwiaGV4YWRlY2ltYWxcIiBpc19oZXhhX2RpZ2l0XG5cbigqIFNjYW4gYSBkZWNpbWFsIGludGVnZXIuICopXG5sZXQgc2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCA9IHNjYW5fZGVjaW1hbF9kaWdpdF9wbHVzXG5cbmxldCBzY2FuX3NpZ24gd2lkdGggaWIgPVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcrJyAtPiBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGNcbiAgfCAnLScgLT4gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjXG4gIHwgXyAtPiB3aWR0aFxuXG5cbmxldCBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIHNjYW5fdW5zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcblxuXG4oKiBTY2FuIGFuIHVuc2lnbmVkIGludGVnZXIgdGhhdCBjb3VsZCBiZSBnaXZlbiBpbiBhbnkgKGNvbW1vbikgYmFzaXMuXG4gICBJZiBkaWdpdHMgYXJlIHByZWZpeGVkIGJ5IG9uZSBvZiAweCwgMFgsIDBvLCBvciAwYiwgdGhlIG51bWJlciBpc1xuICAgYXNzdW1lZCB0byBiZSB3cml0dGVuIHJlc3BlY3RpdmVseSBpbiBoZXhhZGVjaW1hbCwgaGV4YWRlY2ltYWwsXG4gICBvY3RhbCwgb3IgYmluYXJ5LiAqKVxubGV0IHNjYW5fdW5zaWduZWRfaW50IHdpZHRoIGliID1cbiAgbWF0Y2ggU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgd2l0aFxuICB8ICcwJyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICAgIGJlZ2luIG1hdGNoIGMgd2l0aFxuICAgIHwgJ3gnIHwgJ1gnIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gICAgfCAnbycgLT4gc2Nhbl9vY3RhbF9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgICB8ICdiJyAtPiBzY2FuX2JpbmFyeV9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgICB8IF8gLT4gc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWIgZW5kXG4gIHwgXyAtPiBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG5cblxubGV0IHNjYW5fb3B0aW9uYWxseV9zaWduZWRfaW50IHdpZHRoIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIHNjYW5fdW5zaWduZWRfaW50IHdpZHRoIGliXG5cblxubGV0IHNjYW5faW50X2NvbnZlcnNpb24gY29udiB3aWR0aCBpYiA9XG4gIG1hdGNoIGNvbnYgd2l0aFxuICB8IEJfY29udmVyc2lvbiAtPiBzY2FuX2JpbmFyeV9pbnQgd2lkdGggaWJcbiAgfCBEX2NvbnZlcnNpb24gLT4gc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuICB8IElfY29udmVyc2lvbiAtPiBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2ludCB3aWR0aCBpYlxuICB8IE9fY29udmVyc2lvbiAtPiBzY2FuX29jdGFsX2ludCB3aWR0aCBpYlxuICB8IFVfY29udmVyc2lvbiAtPiBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gIHwgWF9jb252ZXJzaW9uIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IHdpZHRoIGliXG5cblxuKCogU2Nhbm5pbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKilcblxuKCogRnJhY3Rpb25hbCBwYXJ0IGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVkdWNlZCB0byAwIGRpZ2l0cy4gKilcbmxldCBzY2FuX2ZyYWN0aW9uYWxfcGFydCB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICB8IF8gLT4gd2lkdGhcblxuXG4oKiBFeHAgcGFydCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlZHVjZWQgdG8gMCBkaWdpdHMuICopXG5sZXQgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICdlJyB8ICdFJyBhcyBjIC0+XG4gICAgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICB8IF8gLT4gd2lkdGhcblxuXG4oKiBTY2FuIHRoZSBpbnRlZ2VyIHBhcnQgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIChub3QgdXNpbmcgdGhlXG4gICBPQ2FtbCBsZXhpY2FsIGNvbnZlbnRpb24gc2luY2UgdGhlIGludGVnZXIgcGFydCBjYW4gYmUgZW1wdHkpOlxuICAgYW4gb3B0aW9uYWwgc2lnbiwgZm9sbG93ZWQgYnkgYSBwb3NzaWJseSBlbXB0eSBzZXF1ZW5jZSBvZiBkZWNpbWFsXG4gICBkaWdpdHMgKGUuZy4gLS4xKS4gKilcbmxldCBzY2FuX2ludGVnZXJfcGFydCB3aWR0aCBpYiA9XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuXG5cbigqXG4gICBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgaGF2ZSAoYXMgZm91bmQgaW4gc2NhbmYubWxpKTpcbiAgIHRoZSBmaWVsZCB3aWR0aCBpcyBjb21wb3NlZCBvZiBhbiBvcHRpb25hbCBpbnRlZ2VyIGxpdGVyYWxcbiAgIGluZGljYXRpbmcgdGhlIG1heGltYWwgd2lkdGggb2YgdGhlIHRva2VuIHRvIHJlYWQuXG4gICBVbmZvcnR1bmF0ZWx5LCB0aGUgdHlwZS1jaGVja2VyIGxldCB0aGUgdXNlciB3cml0ZSBhbiBvcHRpb25hbCBwcmVjaXNpb24sXG4gICBzaW5jZSB0aGlzIGlzIHZhbGlkIGZvciBwcmludGYgZm9ybWF0IHN0cmluZ3MuXG5cbiAgIFRodXMsIHRoZSBuZXh0IHN0ZXAgZm9yIFNjYW5mIGlzIHRvIHN1cHBvcnQgYSBmdWxsIHdpZHRoIGFuZCBwcmVjaXNpb25cbiAgIGluZGljYXRpb24sIG1vcmUgb3IgbGVzcyBzaW1pbGFyIHRvIHRoZSBvbmUgZm9yIHByaW50ZiwgcG9zc2libHkgZXh0ZW5kZWRcbiAgIHRvIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgW21heCwgbWluXSByYW5nZSBmb3IgdGhlIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkXG4gICBmb3Igc3RyaW5ncy4gU29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzcGVjIGZvciBzY2FuZi5tbGk6XG5cbiAgIFRoZSBvcHRpb25hbCBbd2lkdGhdIGlzIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbWF4aW1hbFxuICAgd2lkdGggb2YgdGhlIHRva2VuIHJlYWQuIEZvciBpbnN0YW5jZSwgWyU2ZF0gcmVhZHMgYW4gaW50ZWdlcixcbiAgIGhhdmluZyBhdCBtb3N0IDYgY2hhcmFjdGVycy5cblxuICAgVGhlIG9wdGlvbmFsIFtwcmVjaXNpb25dIGlzIGEgZG90IFsuXSBmb2xsb3dlZCBieSBhbiBpbnRlZ2VyOlxuXG4gICAtIGluIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgY29udmVyc2lvbnMgKFslZl0sIFslZV0sIFslZ10sIFslRl0sIFslRV0sXG4gICBhbmQgWyVGXSBjb252ZXJzaW9ucywgdGhlIFtwcmVjaXNpb25dIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2ZcbiAgIGRpZ2l0cyB0aGF0IG1heSBmb2xsb3cgdGhlIGRlY2ltYWwgcG9pbnQuIEZvciBpbnN0YW5jZSwgWyUuNGZdIHJlYWRzIGFcbiAgIFtmbG9hdF0gd2l0aCBhdCBtb3N0IDQgZnJhY3Rpb25hbCBkaWdpdHMsXG5cbiAgIC0gaW4gdGhlIHN0cmluZyBjb252ZXJzaW9ucyAoWyVzXSwgWyVTXSwgWyVcXFsgcmFuZ2UgXFxdXSksIGFuZCBpbiB0aGVcbiAgIGludGVnZXIgbnVtYmVyIGNvbnZlcnNpb25zIChbJWldLCBbJWRdLCBbJXVdLCBbJXhdLCBbJW9dLCBhbmQgdGhlaXJcbiAgIFtpbnQzMl0sIFtpbnQ2NF0sIGFuZCBbbmF0aXZlX2ludF0gY29ycmVzcG9uZGVudCksIHRoZSBbcHJlY2lzaW9uXVxuICAgaW5kaWNhdGVzIHRoZSByZXF1aXJlZCBtaW5pbXVtIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkLFxuXG4gICAtIG9uIGFsbCBvdGhlciBjb252ZXJzaW9ucywgdGhlIHdpZHRoIGFuZCBwcmVjaXNpb24gc3BlY2lmeSB0aGUgW21heCwgbWluXVxuICAgcmFuZ2UgZm9yIHRoZSB3aWR0aCBvZiB0aGUgdG9rZW4gcmVhZC5cbiopXG5sZXQgc2Nhbl9mbG9hdCB3aWR0aCBwcmVjaXNpb24gaWIgPVxuICBsZXQgd2lkdGggPSBzY2FuX2ludGVnZXJfcGFydCB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCwgcHJlY2lzaW9uIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGgsIHByZWNpc2lvbiBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcuJyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGxldCBwcmVjaXNpb24gPSBJbnQubWluIHdpZHRoIHByZWNpc2lvbiBpblxuICAgIGxldCB3aWR0aCA9IHdpZHRoIC0gKHByZWNpc2lvbiAtIHNjYW5fZnJhY3Rpb25hbF9wYXJ0IHByZWNpc2lvbiBpYikgaW5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWIsIHByZWNpc2lvblxuICB8IF8gLT5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWIsIHByZWNpc2lvblxuXG5cbmxldCBjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyB3aWR0aCBpYiBlcnJvciBzdHIgPVxuICBsZXQgbG93ZXJjYXNlIGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJ0EnIC4uICdaJyAtPlxuICAgICAgY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnQScgKyBpbnRfb2ZfY2hhciAnYScpXG4gICAgfCBfIC0+IGMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIGxldCB3aWR0aCA9IHJlZiB3aWR0aCBpblxuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgbG93ZXJjYXNlIGMgPD4gbG93ZXJjYXNlIHN0ci5baV0gdGhlbiBlcnJvciAoKTtcbiAgICBpZiAhd2lkdGggPSAwIHRoZW4gZXJyb3IgKCk7XG4gICAgd2lkdGggOj0gU2Nhbm5pbmcuc3RvcmVfY2hhciAhd2lkdGggaWIgYztcbiAgZG9uZTtcbiAgIXdpZHRoXG5cblxubGV0IHNjYW5faGV4X2Zsb2F0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gIHwgJzAnIGFzIGMgLT4gKFxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgIGxldCB3aWR0aCA9IGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGJhZF9oZXhfZmxvYXQgXCJ4XCIgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgbGV0IHdpZHRoID0gbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgfCAnLicgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgfCBfIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IHdpZHRoIGliIGluXG4gICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICBsZXQgd2lkdGggPSBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgIHwgJy4nIGFzIGMgLT4gKFxuICAgICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgICAgICB8ICdwJyB8ICdQJyAtPiB3aWR0aFxuICAgICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICAgICAgICAgICAgICB3aWR0aCAtIChwcmVjaXNpb24gLSBzY2FuX2hleGFkZWNpbWFsX2ludCBwcmVjaXNpb24gaWIpXG4gICAgICAgICAgKVxuICAgICAgICAgIHwgXyAtPiB3aWR0aCBpblxuICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgICAgfCAncCcgfCAnUCcgYXMgYyAtPlxuICAgICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICAgICAgICAgIHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcbiAgICAgICAgICB8IF8gLT4gd2lkdGhcbiAgKVxuICB8ICduJyB8ICdOJyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmcgd2lkdGggaWIgYmFkX2hleF9mbG9hdCBcImFuXCJcbiAgfCAnaScgfCAnSScgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgIGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGJhZF9oZXhfZmxvYXQgXCJuZmluaXR5XCJcbiAgfCBfIC0+IGJhZF9oZXhfZmxvYXQgKClcblxuXG5sZXQgc2Nhbl9jYW1sX2Zsb2F0X3Jlc3Qgd2lkdGggcHJlY2lzaW9uIGliID1cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbGV0IHdpZHRoID0gc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJy4nIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgKCogVGhlIGVmZmVjdGl2ZSB3aWR0aCBhdmFpbGFibGUgZm9yIHNjYW5uaW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQgaXNcbiAgICAgICB0aGUgbWluaW11bSBvZiBkZWNsYXJlZCBwcmVjaXNpb24gYW5kIHdpZHRoIGxlZnQuICopXG4gICAgbGV0IHByZWNpc2lvbiA9IEludC5taW4gd2lkdGggcHJlY2lzaW9uIGluXG4gICAgKCogQWZ0ZXIgc2Nhbm5pbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB3aXRoIFtwcmVjaXNpb25dIHByb3Zpc2lvbmFsIHdpZHRoLFxuICAgICAgIFt3aWR0aF9wcmVjaXNpb25dIGlzIGxlZnQuICopXG4gICAgbGV0IHdpZHRoX3ByZWNpc2lvbiA9IHNjYW5fZnJhY3Rpb25hbF9wYXJ0IHByZWNpc2lvbiBpYiBpblxuICAgICgqIEhlbmNlLCBzY2FubmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0IHRvb2sgZXhhY3RseVxuICAgICAgIFtwcmVjaXNpb24gLSB3aWR0aF9wcmVjaXNpb25dIGNoYXJzLiAqKVxuICAgIGxldCBmcmFjX3dpZHRoID0gcHJlY2lzaW9uIC0gd2lkdGhfcHJlY2lzaW9uIGluXG4gICAgKCogQW5kIG5ldyBwcm92aXNpb25hbCB3aWR0aCBpcyBbd2lkdGggLSB3aWR0aF9wcmVjaXNpb24uICopXG4gICAgbGV0IHdpZHRoID0gd2lkdGggLSBmcmFjX3dpZHRoIGluXG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliXG4gIHwgJ2UnIHwgJ0UnIC0+XG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliXG4gIHwgXyAtPiBiYWRfZmxvYXQgKClcblxuXG5sZXQgc2Nhbl9jYW1sX2Zsb2F0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICB8ICcwJyBhcyBjIC0+IChcbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAneCcgfCAnWCcgYXMgYyAtPiAoXG4gICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gICAgICBsZXQgd2lkdGggPSBzY2FuX2hleGFkZWNpbWFsX2ludCB3aWR0aCBpYiBpblxuICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICAgIGxldCB3aWR0aCA9IG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgIHwgJy4nIGFzIGMgLT4gKFxuICAgICAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgICAgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICAgICAgICAgICAgd2lkdGggLSAocHJlY2lzaW9uIC0gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgcHJlY2lzaW9uIGliKVxuICAgICAgICApXG4gICAgICAgIHwgJ3AnIHwgJ1AnIC0+IHdpZHRoXG4gICAgICAgIHwgXyAtPiBiYWRfZmxvYXQgKCkgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgIHwgJ3AnIHwgJ1AnIGFzIGMgLT5cbiAgICAgICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICAgICAgICBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gICAgICAgIHwgXyAtPiB3aWR0aFxuICAgIClcbiAgICB8IF8gLT5cbiAgICAgIHNjYW5fY2FtbF9mbG9hdF9yZXN0IHdpZHRoIHByZWNpc2lvbiBpYlxuICApXG4gIHwgJzEnIC4uICc5JyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICBzY2FuX2NhbWxfZmxvYXRfcmVzdCB3aWR0aCBwcmVjaXNpb24gaWJcbigqIFNwZWNpYWwgY2FzZSBvZiBuYW4gYW5kIGluZmluaXR5OlxuICB8ICdpJyAtPlxuICB8ICduJyAtPlxuKilcbiAgfCBfIC0+IGJhZF9mbG9hdCAoKVxuXG5cbigqIFNjYW4gYSByZWd1bGFyIHN0cmluZzpcbiAgIHN0b3BzIHdoZW4gZW5jb3VudGVyaW5nIGEgc3BhY2UsIGlmIG5vIHNjYW5uaW5nIGluZGljYXRpb24gaGFzIGJlZW4gZ2l2ZW47XG4gICBvdGhlcndpc2UsIHN0b3BzIHdoZW4gZW5jb3VudGVyaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzY2FubmluZ1xuICAgaW5kaWNhdGlvbiBbc3RwXS5cbiAgIEl0IGFsc28gc3RvcHMgYXQgZW5kIG9mIGZpbGUgb3Igd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBoYXNcbiAgIGJlZW4gcmVhZC4gKilcbmxldCBzY2FuX3N0cmluZyBzdHAgd2lkdGggaWIgPVxuICBsZXQgcmVjIGxvb3Agd2lkdGggPVxuICAgIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgIG1hdGNoIHN0cCB3aXRoXG4gICAgICB8IFNvbWUgYycgd2hlbiBjID0gYycgLT4gU2Nhbm5pbmcuc2tpcF9jaGFyIHdpZHRoIGliXG4gICAgICB8IFNvbWUgXyAtPiBsb29wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpXG4gICAgICB8IE5vbmUgLT5cbiAgICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICAgIHwgJyAnIHwgJ1xcdCcgfCAnXFxuJyB8ICdcXHInIC0+IHdpZHRoXG4gICAgICAgIHwgXyAtPiBsb29wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGluXG4gIGxvb3Agd2lkdGhcblxuXG4oKiBTY2FuIGEgY2hhcjogcGVlayBzdHJpY3RseSBvbmUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCwgd2hhdHNvZXZlci4gKilcbmxldCBzY2FuX2NoYXIgd2lkdGggaWIgPVxuICAoKiBUaGUgY2FzZSB3aWR0aCA9IDAgY291bGQgbm90IGhhcHBlbiBoZXJlLCBzaW5jZSBpdCBpcyB0ZXN0ZWQgYmVmb3JlXG4gICAgIGNhbGxpbmcgc2Nhbl9jaGFyLCBpbiB0aGUgbWFpbiBzY2FubmluZyBmdW5jdGlvbi5cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIFwiYSBjaGFyYWN0ZXJcIiBlbHNlICopXG4gIFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgKFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliKVxuXG5cbmxldCBjaGFyX2Zvcl9iYWNrc2xhc2ggPSBmdW5jdGlvblxuICB8ICduJyAtPiAnXFwwMTAnXG4gIHwgJ3InIC0+ICdcXDAxMydcbiAgfCAnYicgLT4gJ1xcMDA4J1xuICB8ICd0JyAtPiAnXFwwMDknXG4gIHwgYyAtPiBjXG5cblxuKCogVGhlIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZmFjaWFsIHZhbHVlIG9mIGEgdmFsaWRcbiAgIGRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyLiAqKVxubGV0IGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjID0gaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJ1xuXG5sZXQgY2hhcl9mb3JfZGVjaW1hbF9jb2RlIGMwIGMxIGMyID1cbiAgbGV0IGMgPVxuICAgIDEwMCAqIGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMCArXG4gICAgIDEwICogZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMxICtcbiAgICAgICAgICBkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzIgaW5cbiAgaWYgYyA8IDAgfHwgYyA+IDI1NSB0aGVuXG4gICAgYmFkX2lucHV0XG4gICAgICAoUHJpbnRmLnNwcmludGZcbiAgICAgICAgIFwiYmFkIGNoYXJhY3RlciBkZWNpbWFsIGVuY29kaW5nIFxcXFwlYyVjJWNcIiBjMCBjMSBjMikgZWxzZVxuICBjaGFyX29mX2ludCBjXG5cblxuKCogVGhlIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZmFjaWFsIHZhbHVlIG9mIGEgdmFsaWRcbiAgIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3Rlci4gKilcbmxldCBoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMgPVxuICBsZXQgZCA9IGludF9vZl9jaGFyIGMgaW5cbiAgKCogQ291bGQgYWxzbyBiZTpcbiAgICBpZiBkIDw9IGludF9vZl9jaGFyICc5JyB0aGVuIGQgLSBpbnRfb2ZfY2hhciAnMCcgZWxzZVxuICAgIGlmIGQgPD0gaW50X29mX2NoYXIgJ0YnIHRoZW4gMTAgKyBkIC0gaW50X29mX2NoYXIgJ0EnIGVsc2VcbiAgICBpZiBkIDw9IGludF9vZl9jaGFyICdmJyB0aGVuIDEwICsgZCAtIGludF9vZl9jaGFyICdhJyBlbHNlIGFzc2VydCBmYWxzZVxuICAqKVxuICBpZiBkID49IGludF9vZl9jaGFyICdhJyB0aGVuXG4gICAgZCAtIDg3ICgqIDEwICsgaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICdhJyAqKSBlbHNlXG4gIGlmIGQgPj0gaW50X29mX2NoYXIgJ0EnIHRoZW5cbiAgICBkIC0gNTUgICgqIDEwICsgaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICdBJyAqKSBlbHNlXG4gICAgZCAtIGludF9vZl9jaGFyICcwJ1xuXG5cbmxldCBjaGFyX2Zvcl9oZXhhZGVjaW1hbF9jb2RlIGMxIGMyID1cbiAgbGV0IGMgPVxuICAgIDE2ICogaGV4YWRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMSArXG4gICAgICAgICBoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMyIGluXG4gIGlmIGMgPCAwIHx8IGMgPiAyNTUgdGhlblxuICAgIGJhZF9pbnB1dFxuICAgICAgKFByaW50Zi5zcHJpbnRmIFwiYmFkIGNoYXJhY3RlciBoZXhhZGVjaW1hbCBlbmNvZGluZyBcXFxcJWMlY1wiIGMxIGMyKSBlbHNlXG4gIGNoYXJfb2ZfaW50IGNcblxuXG4oKiBDYWxsZWQgaW4gcGFydGljdWxhciB3aGVuIGVuY291bnRlcmluZyAnXFxcXCcgYXMgc3RhcnRlciBvZiBhIGNoYXIuXG4gICBTdG9wcyBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgJ1xcJycuICopXG5sZXQgY2hlY2tfbmV4dF9jaGFyIG1lc3NhZ2Ugd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIG1lc3NhZ2UgZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiBiYWRfZW5kX29mX2lucHV0IG1lc3NhZ2UgZWxzZVxuICBjXG5cblxubGV0IGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciA9IGNoZWNrX25leHRfY2hhciBcImEgQ2hhclwiXG5sZXQgY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgPSBjaGVja19uZXh0X2NoYXIgXCJhIFN0cmluZ1wiXG5cbmxldCBzY2FuX2JhY2tzbGFzaF9jaGFyIHdpZHRoIGliID1cbiAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIHdpZHRoIGliIHdpdGhcbiAgfCAnXFxcXCcgfCAnXFwnJyB8ICdcXFwiJyB8ICduJyB8ICd0JyB8ICdiJyB8ICdyJyBhcyBjIC0+XG4gICAgU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiAoY2hhcl9mb3JfYmFja3NsYXNoIGMpXG4gIHwgJzAnIC4uICc5JyBhcyBjIC0+XG4gICAgbGV0IGdldF9kaWdpdCAoKSA9XG4gICAgICBsZXQgYyA9IFNjYW5uaW5nLm5leHRfY2hhciBpYiBpblxuICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgYXMgYyAtPiBjXG4gICAgICB8IGMgLT4gYmFkX2lucHV0X2VzY2FwZSBjIGluXG4gICAgbGV0IGMwID0gYyBpblxuICAgIGxldCBjMSA9IGdldF9kaWdpdCAoKSBpblxuICAgIGxldCBjMiA9IGdldF9kaWdpdCAoKSBpblxuICAgIFNjYW5uaW5nLnN0b3JlX2NoYXIgKHdpZHRoIC0gMikgaWIgKGNoYXJfZm9yX2RlY2ltYWxfY29kZSBjMCBjMSBjMilcbiAgfCAneCcgLT5cbiAgICBsZXQgZ2V0X2RpZ2l0ICgpID1cbiAgICAgIGxldCBjID0gU2Nhbm5pbmcubmV4dF9jaGFyIGliIGluXG4gICAgICBtYXRjaCBjIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyB8ICdBJyAuLiAnRicgfCAnYScgLi4gJ2YnIGFzIGMgLT4gY1xuICAgICAgfCBjIC0+IGJhZF9pbnB1dF9lc2NhcGUgYyBpblxuICAgIGxldCBjMSA9IGdldF9kaWdpdCAoKSBpblxuICAgIGxldCBjMiA9IGdldF9kaWdpdCAoKSBpblxuICAgIFNjYW5uaW5nLnN0b3JlX2NoYXIgKHdpZHRoIC0gMikgaWIgKGNoYXJfZm9yX2hleGFkZWNpbWFsX2NvZGUgYzEgYzIpXG4gIHwgYyAtPlxuICAgIGJhZF9pbnB1dF9lc2NhcGUgY1xuXG5cbigqIFNjYW4gYSBjaGFyYWN0ZXIgKGFuIE9DYW1sIHRva2VuKS4gKilcbmxldCBzY2FuX2NhbWxfY2hhciB3aWR0aCBpYiA9XG5cbiAgbGV0IHJlYyBmaW5kX3N0YXJ0IHdpZHRoID1cbiAgICBtYXRjaCBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAnXFwnJyAtPiBmaW5kX2NoYXIgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgYyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcJycgY1xuXG4gIGFuZCBmaW5kX2NoYXIgd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxcXCcgLT5cbiAgICAgIGZpbmRfc3RvcCAoc2Nhbl9iYWNrc2xhc2hfY2hhciAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpIGliKVxuICAgIHwgYyAtPlxuICAgICAgZmluZF9zdG9wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpXG5cbiAgYW5kIGZpbmRfc3RvcCB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXCcnIC0+IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliXG4gICAgfCBjIC0+IGNoYXJhY3Rlcl9taXNtYXRjaCAnXFwnJyBjIGluXG5cbiAgZmluZF9zdGFydCB3aWR0aFxuXG5cbigqIFNjYW4gYSBkZWxpbWl0ZWQgc3RyaW5nIChhbiBPQ2FtbCB0b2tlbikuICopXG5sZXQgc2Nhbl9jYW1sX3N0cmluZyB3aWR0aCBpYiA9XG5cbiAgbGV0IHJlYyBmaW5kX3N0YXJ0IHdpZHRoID1cbiAgICBtYXRjaCBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAnXFxcIicgLT4gZmluZF9zdG9wIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IGMgLT4gY2hhcmFjdGVyX21pc21hdGNoICdcXFwiJyBjXG5cbiAgYW5kIGZpbmRfc3RvcCB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xcXCInIC0+IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliXG4gICAgfCAnXFxcXCcgLT4gc2Nhbl9iYWNrc2xhc2ggKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgYyAtPiBmaW5kX3N0b3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYylcblxuICBhbmQgc2Nhbl9iYWNrc2xhc2ggd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXHInIC0+IHNraXBfbmV3bGluZSAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCAnXFxuJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCAoc2Nhbl9iYWNrc2xhc2hfY2hhciB3aWR0aCBpYilcblxuICBhbmQgc2tpcF9uZXdsaW5lIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxuJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiAnXFxyJylcblxuICBhbmQgc2tpcF9zcGFjZXMgd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICcgJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCB3aWR0aCBpblxuXG4gIGZpbmRfc3RhcnQgd2lkdGhcblxuXG4oKiBTY2FuIGEgYm9vbGVhbiAoYW4gT0NhbWwgdG9rZW4pLiAqKVxubGV0IHNjYW5fYm9vbCBpYiA9XG4gIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgbGV0IG0gPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJ3QnIC0+IDRcbiAgICB8ICdmJyAtPiA1XG4gICAgfCBjIC0+XG4gICAgICBiYWRfaW5wdXRcbiAgICAgICAgKFByaW50Zi5zcHJpbnRmIFwidGhlIGNoYXJhY3RlciAlQyBjYW5ub3Qgc3RhcnQgYSBib29sZWFuXCIgYykgaW5cbiAgc2Nhbl9zdHJpbmcgTm9uZSBtIGliXG5cblxuKCogU2NhbiBhIHN0cmluZyBjb250YWluaW5nIGVsZW1lbnRzIGluIGNoYXJfc2V0IGFuZCB0ZXJtaW5hdGVkIGJ5IHNjYW5faW5kaWNcbiAgIGlmIHByb3ZpZGVkLiAqKVxubGV0IHNjYW5fY2hhcnNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgc2Nhbl9pbmRpYyB3aWR0aCBpYiA9XG4gIGxldCByZWMgc2Nhbl9jaGFycyBpIHN0cCA9XG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBpID4gMCAmJiBub3QgKFNjYW5uaW5nLmVvZiBpYikgJiZcbiAgICAgICBpc19pbl9jaGFyX3NldCBjaGFyX3NldCBjICYmXG4gICAgICAgaW50X29mX2NoYXIgYyA8PiBzdHAgdGhlblxuICAgICAgbGV0IF8gPSBTY2FubmluZy5zdG9yZV9jaGFyIG1heF9pbnQgaWIgYyBpblxuICAgICAgc2Nhbl9jaGFycyAoaSAtIDEpIHN0cCBpblxuICBtYXRjaCBzY2FuX2luZGljIHdpdGhcbiAgfCBOb25lIC0+IHNjYW5fY2hhcnMgd2lkdGggKC0xKTtcbiAgfCBTb21lIGMgLT5cbiAgICBzY2FuX2NoYXJzIHdpZHRoIChpbnRfb2ZfY2hhciBjKTtcbiAgICBpZiBub3QgKFNjYW5uaW5nLmVvZiBpYikgdGhlblxuICAgICAgbGV0IGNpID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgICBpZiBjID0gY2lcbiAgICAgIHRoZW4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWJcbiAgICAgIGVsc2UgY2hhcmFjdGVyX21pc21hdGNoIGMgY2lcblxuXG4oKiBUaGUgZ2xvYmFsIGVycm9yIHJlcG9ydCBmdW5jdGlvbiBmb3IgW1NjYW5mXS4gKilcbmxldCBzY2FuZl9iYWRfaW5wdXQgaWIgPSBmdW5jdGlvblxuICB8IFNjYW5fZmFpbHVyZSBzIHwgRmFpbHVyZSBzIC0+XG4gICAgbGV0IGkgPSBTY2FubmluZy5jaGFyX2NvdW50IGliIGluXG4gICAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcInNjYW5mOiBiYWQgaW5wdXQgYXQgY2hhciBudW1iZXIgJWk6ICVzXCIgaSBzKVxuICB8IHggLT4gcmFpc2UgeFxuXG5cbigqIEdldCB0aGUgY29udGVudCBvZiBhIGNvdW50ZXIgZnJvbSBhbiBpbnB1dCBidWZmZXIuICopXG5sZXQgZ2V0X2NvdW50ZXIgaWIgY291bnRlciA9XG4gIG1hdGNoIGNvdW50ZXIgd2l0aFxuICB8IExpbmVfY291bnRlciAtPiBTY2FubmluZy5saW5lX2NvdW50IGliXG4gIHwgQ2hhcl9jb3VudGVyIC0+IFNjYW5uaW5nLmNoYXJfY291bnQgaWJcbiAgfCBUb2tlbl9jb3VudGVyIC0+IFNjYW5uaW5nLnRva2VuX2NvdW50IGliXG5cblxuKCogQ29tcHV0ZSB0aGUgd2lkdGggb2YgYSBwYWRkaW5nIG9wdGlvbiAoc2VlIFwiJTQye1wiIGFuZCBcIiUxMjMoXCIpLiAqKVxubGV0IHdpZHRoX29mX3BhZF9vcHQgcGFkX29wdCA9IG1hdGNoIHBhZF9vcHQgd2l0aFxuICB8IE5vbmUgLT4gbWF4X2ludFxuICB8IFNvbWUgd2lkdGggLT4gd2lkdGhcblxuXG5sZXQgc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmcgPVxuICBpZiBmbXRpbmcgPSBFc2NhcGVkX3BlcmNlbnQgdGhlbiAnJScsIFwiXCIgZWxzZVxuICAgIGxldCBzdHIgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nIGluXG4gICAgbGV0IHN0cCA9IHN0ci5bMV0gaW5cbiAgICBsZXQgc3ViX3N0ciA9IFN0cmluZy5zdWIgc3RyIDIgKFN0cmluZy5sZW5ndGggc3RyIC0gMikgaW5cbiAgICBzdHAsIHN1Yl9zdHJcblxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUmVhZGVyIG1hbmFnZW1lbnQgKilcblxuKCogQSBjYWxsIHRvIHRha2VfZm9ybWF0X3JlYWRlcnMgb24gYSBmb3JtYXQgaXMgZXZhbHVhdGVkIGludG8gZnVuY3Rpb25zXG4gICB0YWtpbmcgcmVhZGVycyBhcyBhcmd1bWVudHMgYW5kIGFnZ3JlZ2F0ZSB0aGVtIGludG8gYW4gaGV0ZXJvZ2VuZW91cyBsaXN0ICopXG4oKiBXaGVuIGFsbCByZWFkZXJzIGFyZSB0YWtlbiwgZmluYWxseSBwYXNzIHRoZSBsaXN0IG9mIHRoZSByZWFkZXJzIHRvIHRoZVxuICAgY29udGludWF0aW9uIGsuICopXG5sZXQgcmVjIHRha2VfZm9ybWF0X3JlYWRlcnMgOiB0eXBlIGEgYyBkIGUgZiAuXG4gICAgKChkLCBlKSBoZXRlcl9saXN0IC0+IGUpIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICBkID1cbmZ1biBrIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IFJlYWRlciBmbXRfcmVzdCAtPlxuICAgIGZ1biByZWFkZXIgLT5cbiAgICAgIGxldCBuZXdfayByZWFkZXJzX3Jlc3QgPSBrIChDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkpIGluXG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIG5ld19rIGZtdF9yZXN0XG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBDYW1sX2NoYXIgcmVzdCAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFN0cmluZyAoXywgcmVzdCkgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ2FtbF9zdHJpbmcgKF8sIHJlc3QpICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBJbnQgKF8sIF8sIF8sIHJlc3QpICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEludDMyIChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgTmF0aXZlaW50IChfLCBfLCBfLCByZXN0KSAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBJbnQ2NCAoXywgXywgXywgcmVzdCkgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEZsb2F0IChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQm9vbCAoXywgcmVzdCkgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBBbHBoYSByZXN0ICAgICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgRmx1c2ggcmVzdCAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTdHJpbmdfbGl0ZXJhbCAoXywgcmVzdCkgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ3VzdG9tIChfLCBfLCByZXN0KSAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuXG4gIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10LCBfKSksIHJlc3QpIC0+XG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgKGNvbmNhdF9mbXQgZm10IHJlc3QpXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCwgXykpLCByZXN0KSAtPlxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBrIChjb25jYXRfZm10IGZtdCByZXN0KVxuXG4gIHwgRm9ybWF0X2FyZyAoXywgXywgcmVzdCkgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGb3JtYXRfc3Vic3QgKF8sIGZtdHR5LCByZXN0KSAgICAtPlxuICAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgKGVyYXNlX3JlbCAoc3ltbSBmbXR0eSkpIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAgICAgICAtPiB0YWtlX2lnbm9yZWRfZm9ybWF0X3JlYWRlcnMgayBpZ24gcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgLT4gayBOaWxcblxuKCogVGFrZSByZWFkZXJzIGFzc29jaWF0ZWQgdG8gYW4gZm10dHkgY29taW5nIGZyb20gYSBGb3JtYXRfc3Vic3QgXCIlKC4uLiUpXCIuICopXG5hbmQgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyA6IHR5cGUgeCB5IGEgYyBkIGUgZiAuXG4gICAgKChkLCBlKSBoZXRlcl9saXN0IC0+IGUpIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCB4LCB5KSBmbXR0eSAtPlxuICAgICAgKHksIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIHgsIGUsIGYpIGZtdCAtPiBkID1cbmZ1biBrIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgUmVhZGVyX3R5IGZtdF9yZXN0IC0+XG4gICAgZnVuIHJlYWRlciAtPlxuICAgICAgbGV0IG5ld19rIHJlYWRlcnNfcmVzdCA9IGsgKENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSkgaW5cbiAgICAgIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgbmV3X2sgZm10X3Jlc3QgZm10XG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgZm10X3Jlc3QgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRfcmVzdCBmbXRcbiAgfCBDaGFyX3R5IHJlc3QgICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEludF90eSByZXN0ICAgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBJbnQzMl90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEludDY0X3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBGbG9hdF90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEFscGhhX3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgQW55X3R5IHJlc3QgICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEZvcm1hdF9hcmdfdHkgKF8sIHJlc3QpICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogVGFrZSByZWFkZXJzIGFzc29jaWF0ZWQgdG8gYW4gaWdub3JlZCBwYXJhbWV0ZXIuICopXG5hbmQgdGFrZV9pZ25vcmVkX2Zvcm1hdF9yZWFkZXJzIDogdHlwZSB4IHkgYSBjIGQgZSBmIC5cbiAgICAoKGQsIGUpIGhldGVyX2xpc3QgLT4gZSkgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIHgsIHkpIGlnbm9yZWQgLT5cbiAgICAgICh5LCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCB4LCBlLCBmKSBmbXQgLT4gZCA9XG5mdW4gayBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRcbiAgfCBJZ25vcmVkX2NoYXIgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3N0cmluZyBfICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIF8gICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludDMyIChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX25hdGl2ZWludCAoXywgXykgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zsb2F0IChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Jvb2wgXyAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoXywgZm10dHkpIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayBmbXR0eSBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgXyAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBzY2FubmluZyAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBzY2FubmluZyBmdW5jdGlvbi4gKilcbigqIFNjYW4gYSBzdHJlYW0gYWNjb3JkaW5nIHRvIGEgZm9ybWF0IGFuZCByZWFkZXJzIG9idGFpbmVkIGJ5XG4gICB0YWtlX2Zvcm1hdF9yZWFkZXJzLCBhbmQgYWdncmVnYXRlIHNjYW5uZWQgdmFsdWVzIGludG8gYW5cbiAgIGhldGVyb2dlbmVvdXMgbGlzdC4gKilcbigqIFJldHVybiB0aGUgaGV0ZXJvZ2VuZW91cyBsaXN0IG9mIHNjYW5uZWQgdmFsdWVzLiAqKVxubGV0IHJlYyBtYWtlX3NjYW5mIDogdHlwZSBhIGMgZCBlIGYuXG4gICAgU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgICAoZCwgZSkgaGV0ZXJfbGlzdCAtPiAoYSwgZikgaGV0ZXJfbGlzdCA9XG5mdW4gaWIgZm10IHJlYWRlcnMgLT4gbWF0Y2ggZm10IHdpdGhcbiAgfCBDaGFyIHJlc3QgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2hhciAwIGliIGluXG4gICAgbGV0IGMgPSB0b2tlbl9jaGFyIGliIGluXG4gICAgQ29ucyAoYywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9jaGFyIDAgaWIgaW5cbiAgICBsZXQgYyA9IHRva2VuX2NoYXIgaWIgaW5cbiAgICBDb25zIChjLCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcblxuICB8IFN0cmluZyAocGFkLCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkpIC0+XG4gICAgbGV0IHN0cCwgc3RyID0gc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIChTb21lIHN0cCkgd2lkdGggaWIgaW5cbiAgICBsZXQgc3RyX3Jlc3QgPSBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHN0cl9yZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX3N0cmluZ1xuICB8IFN0cmluZyAocGFkLCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9zdHJpbmcgKFNvbWUgJ3snKSB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW5cbiAgICAgICAgICAgICAgICAgICB0b2tlbl9zdHJpbmdcbiAgfCBTdHJpbmcgKHBhZCwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIChTb21lICdbJykgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuXG4gICAgICAgICAgICAgICAgICAgdG9rZW5fc3RyaW5nXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIE5vbmUgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX3N0cmluZ1xuXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9jYW1sX3N0cmluZyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW4gdG9rZW5fc3RyaW5nXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9pbnQgYylcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgYyA9IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIChjaGFyX29mX2ljb252IGljb252KSBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2ludF9jb252ZXJzaW9uIGMgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2NhbiAodG9rZW5faW50MzIgYylcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IGMgPSBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciAoY2hhcl9vZl9pY29udiBpY29udikgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9pbnRfY29udmVyc2lvbiBjIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gKHRva2VuX25hdGl2ZWludCBjKVxuICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9pbnQ2NCBjKVxuICB8IEZsb2F0ICgoXywgKEZsb2F0X0YgfCBGbG9hdF9DRikpLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW5fY2FtbF9mbG9hdCB0b2tlbl9mbG9hdFxuICB8IEZsb2F0ICgoXywgKEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HKSksXG4gICAgICAgICAgIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2Nhbl9mbG9hdCB0b2tlbl9mbG9hdFxuICB8IEZsb2F0ICgoXywgKEZsb2F0X2ggfCBGbG9hdF9IKSksIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2Nhbl9oZXhfZmxvYXQgdG9rZW5fZmxvYXRcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbGV0IHNjYW4gXyBfIGliID0gc2Nhbl9ib29sIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhbiB0b2tlbl9ib29sXG4gIHwgQWxwaGEgXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlYVxcXCJcIlxuICB8IFRoZXRhIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJXRcXFwiXCJcbiAgfCBDdXN0b20gXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlP1xcXCIgKGN1c3RvbSBjb252ZXJ0ZXIpXCJcbiAgfCBSZWFkZXIgZm10X3Jlc3QgLT5cbiAgICBiZWdpbiBtYXRjaCByZWFkZXJzIHdpdGhcbiAgICB8IENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSAtPlxuICAgICAgICBsZXQgeCA9IHJlYWRlciBpYiBpblxuICAgICAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdF9yZXN0IHJlYWRlcnNfcmVzdClcbiAgICB8IE5pbCAtPlxuICAgICAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBtaXNzaW5nIHJlYWRlclwiXG4gICAgZW5kXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIGlmIFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG4gICAgZWxzZSBiYWRfaW5wdXQgXCJlbmQgb2YgaW5wdXQgbm90IGZvdW5kXCJcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgU3RyaW5nLml0ZXIgKGNoZWNrX2NoYXIgaWIpIHN0cjtcbiAgICBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVyc1xuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIGNoZWNrX2NoYXIgaWIgY2hyO1xuICAgIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG5cbiAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9zdHJpbmcgKHdpZHRoX29mX3BhZF9vcHQgcGFkX29wdCkgaWIgaW5cbiAgICBsZXQgcyA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIGxldCBmbXQgPVxuICAgICAgdHJ5IGZvcm1hdF9vZl9zdHJpbmdfZm10dHkgcyBmbXR0eVxuICAgICAgd2l0aCBGYWlsdXJlIG1zZyAtPiBiYWRfaW5wdXQgbXNnXG4gICAgaW5cbiAgICBDb25zIChmbXQsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfc3RyaW5nICh3aWR0aF9vZl9wYWRfb3B0IHBhZF9vcHQpIGliIGluXG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgZm10LCBmbXQnID1cbiAgICAgIHRyeVxuICAgICAgICBsZXQgRm10X0VCQiBmbXQgPSBmbXRfZWJiX29mX3N0cmluZyBzIGluXG4gICAgICAgIGxldCBGbXRfRUJCIGZtdCcgPSBmbXRfZWJiX29mX3N0cmluZyBzIGluXG4gICAgICAgICgqIFRPRE86IGZpbmQgYSB3YXkgdG8gYXZvaWQgcmVwYXJzaW5nIHR3aWNlICopXG5cbiAgICAgICAgKCogVE9ETzogdGhlc2UgdHlwZS1jaGVja3MgYmVsb3cgKmNhbiogZmFpbCBiZWNhdXNlIG9mIHR5cGVcbiAgICAgICAgICAgYW1iaWd1aXR5IGluIHByZXNlbmNlIG9mIGlnbm9yZWQtcmVhZGVyczogXCIlX3IlZFwiIGFuZCBcIiVkJV9yXCJcbiAgICAgICAgICAgYXJlIHR5cGVkIGluIHRoZSBzYW1lIHdheS5cblxuICAgICAgICAgICAjIFNjYW5mLnNzY2FuZiBcIlxcXCIlX3IlZFxcXCIzXCIgXCIlKCVkJV9yJSlcIiBpZ25vcmVcbiAgICAgICAgICAgICAoZnVuIGZtdCBuIC0+IHN0cmluZ19vZl9mb3JtYXQgZm10LCBuKVxuICAgICAgICAgICBFeGNlcHRpb246IENhbWxpbnRlcm5hbEZvcm1hdC5UeXBlX21pc21hdGNoLlxuXG4gICAgICAgICAgIFdlIHNob3VsZCBwcm9wZXJseSBjYXRjaCB0aGlzIGV4Y2VwdGlvbi5cbiAgICAgICAgKilcbiAgICAgICAgdHlwZV9mb3JtYXQgZm10IChlcmFzZV9yZWwgZm10dHkpLFxuICAgICAgICB0eXBlX2Zvcm1hdCBmbXQnIChlcmFzZV9yZWwgKHN5bW0gZm10dHkpKVxuICAgICAgd2l0aCBGYWlsdXJlIG1zZyAtPiBiYWRfaW5wdXQgbXNnXG4gICAgaW5cbiAgICBDb25zIChGb3JtYXQgKGZtdCwgcyksXG4gICAgICAgICAgbWFrZV9zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnMpXG5cbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkpIC0+XG4gICAgbGV0IHN0cCwgc3RyID0gc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgbGV0IHdpZHRoID0gd2lkdGhfb2ZfcGFkX29wdCB3aWR0aF9vcHQgaW5cbiAgICBzY2FuX2NoYXJzX2luX2NoYXJfc2V0IGNoYXJfc2V0IChTb21lIHN0cCkgd2lkdGggaWI7XG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgc3RyX3Jlc3QgPSBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSBpblxuICAgIENvbnMgKHMsIG1ha2Vfc2NhbmYgaWIgc3RyX3Jlc3QgcmVhZGVycylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCByZXN0KSAtPlxuICAgIGxldCB3aWR0aCA9IHdpZHRoX29mX3BhZF9vcHQgd2lkdGhfb3B0IGluXG4gICAgc2Nhbl9jaGFyc19pbl9jaGFyX3NldCBjaGFyX3NldCBOb25lIHdpZHRoIGliO1xuICAgIGxldCBzID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgQ29ucyAocywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICBsZXQgY291bnQgPSBnZXRfY291bnRlciBpYiBjb3VudGVyIGluXG4gICAgQ29ucyAoY291bnQsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gICAgQ29ucyAoYywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIHJlc3QpIC0+XG4gICAgU3RyaW5nLml0ZXIgKGNoZWNrX2NoYXIgaWIpIChzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm9ybWF0dGluZ19saXQpO1xuICAgIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICBjaGVja19jaGFyIGliICdAJzsgY2hlY2tfY2hhciBpYiAneyc7XG4gICAgbWFrZV9zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnNcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGNoZWNrX2NoYXIgaWIgJ0AnOyBjaGVja19jaGFyIGliICdbJztcbiAgICBtYWtlX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVyc1xuXG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICBiZWdpbiBtYXRjaCBtYWtlX3NjYW5mIGliIGZtdCcgcmVhZGVycyB3aXRoXG4gICAgfCBDb25zIChfLCBhcmdfcmVzdCkgLT4gYXJnX3Jlc3RcbiAgICB8IE5pbCAtPiBhc3NlcnQgZmFsc2VcbiAgICBlbmRcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBOaWxcblxuKCogQ2FzZSBhbmFseXNpcyBvbiBwYWRkaW5nIGFuZCBwcmVjaXNpb24uICopXG4oKiBSZWplY3QgZm9ybWF0cyBjb250YWluaW5nIFwiJSpcIiBvciBcIiUuKlwiLiAqKVxuKCogUGFzcyBwYWRkaW5nIGFuZCBwcmVjaXNpb24gdG8gdGhlIGdlbmVyaWMgc2Nhbm5lciBgc2NhbicuICopXG5hbmQgcGFkX3ByZWNfc2NhbmYgOiB0eXBlIGEgYyBkIGUgZiB4IHkgeiB0IC5cbiAgICBTY2FubmluZy5pbl9jaGFubmVsIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAgIChkLCBlKSBoZXRlcl9saXN0IC0+ICh4LCB5KSBwYWRkaW5nIC0+ICh5LCB6IC0+IGEpIHByZWNpc2lvbiAtPlxuICAgICAgKGludCAtPiBpbnQgLT4gU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiB0KSAtPlxuICAgICAgKFNjYW5uaW5nLmluX2NoYW5uZWwgLT4geikgLT5cbiAgICAgICh4LCBmKSBoZXRlcl9saXN0ID1cbmZ1biBpYiBmbXQgcmVhZGVycyBwYWQgcHJlYyBzY2FuIHRva2VuIC0+IG1hdGNoIHBhZCwgcHJlYyB3aXRoXG4gIHwgTm9fcGFkZGluZywgTm9fcHJlY2lzaW9uIC0+XG4gICAgbGV0IF8gPSBzY2FuIG1heF9pbnQgbWF4X2ludCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGxldCBfID0gc2NhbiBtYXhfaW50IHAgaWIgaW5cbiAgICBsZXQgeCA9IHRva2VuIGliIGluXG4gICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycylcbiAgfCBMaXRfcGFkZGluZyAoKFJpZ2h0IHwgWmVyb3MpLCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgbGV0IF8gPSBzY2FuIHcgbWF4X2ludCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IExpdF9wYWRkaW5nICgoUmlnaHQgfCBaZXJvcyksIHcpLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBsZXQgXyA9IHNjYW4gdyBwIGliIGluXG4gICAgbGV0IHggPSB0b2tlbiBpYiBpblxuICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMpXG4gIHwgTGl0X3BhZGRpbmcgKExlZnQsIF8pLCBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUtXFxcIlwiXG4gIHwgTGl0X3BhZGRpbmcgKChSaWdodCB8IFplcm9zKSwgXyksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJSpcXFwiXCJcbiAgfCBBcmdfcGFkZGluZyBfLCBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUqXFxcIlwiXG4gIHwgTm9fcGFkZGluZywgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlKlxcXCJcIlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgKCogRGVmaW5pbmcgW3NjYW5mXSBhbmQgdmFyaW91cyBmbGF2b3JzIG9mIFtzY2FuZl0gKilcblxudHlwZSAnYSBrc2NhbmZfcmVzdWx0ID0gQXJncyBvZiAnYSB8IEV4YyBvZiBleG5cblxubGV0IGtzY2FuZiBpYiBlZiAoRm9ybWF0IChmbXQsIHN0cikpID1cbiAgbGV0IHJlYyBhcHBseSA6IHR5cGUgYSBiIC4gYSAtPiAoYSwgYikgaGV0ZXJfbGlzdCAtPiBiID1cbiAgICBmdW4gZiBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgQ29ucyAoeCwgcikgLT4gYXBwbHkgKGYgeCkgclxuICAgIHwgTmlsIC0+IGZcbiAgaW5cbiAgbGV0IGsgcmVhZGVycyBmID1cbiAgICBTY2FubmluZy5yZXNldF90b2tlbiBpYjtcbiAgICBtYXRjaCB0cnkgQXJncyAobWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycykgd2l0aFxuICAgICAgfCAoU2Nhbl9mYWlsdXJlIF8gfCBGYWlsdXJlIF8gfCBFbmRfb2ZfZmlsZSkgYXMgZXhjIC0+IEV4YyBleGNcbiAgICAgIHwgSW52YWxpZF9hcmd1bWVudCBtc2cgLT5cbiAgICAgICAgaW52YWxpZF9hcmcgKG1zZyBeIFwiIGluIGZvcm1hdCBcXFwiXCIgXiBTdHJpbmcuZXNjYXBlZCBzdHIgXiBcIlxcXCJcIilcbiAgICB3aXRoXG4gICAgICB8IEFyZ3MgYXJncyAtPiBhcHBseSBmIGFyZ3NcbiAgICAgIHwgRXhjIGV4YyAtPiBlZiBpYiBleGNcbiAgaW5cbiAgdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuXG4oKioqKVxuXG5sZXQga2JzY2FuZiA9IGtzY2FuZlxubGV0IGJzY2FuZiBpYiBmbXQgPSBrYnNjYW5mIGliIHNjYW5mX2JhZF9pbnB1dCBmbXRcblxubGV0IGtzc2NhbmYgcyBlZiBmbXQgPSBrYnNjYW5mIChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBlZiBmbXRcbmxldCBzc2NhbmYgcyBmbXQgPSBrYnNjYW5mIChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBzY2FuZl9iYWRfaW5wdXQgZm10XG5cbmxldCBzY2FuZiBmbXQgPSBrc2NhbmYgU2Nhbm5pbmcuc3RkaWIgc2NhbmZfYmFkX2lucHV0IGZtdFxuXG4oKioqKVxuXG4oKiBTY2FubmluZyBmb3JtYXQgc3RyaW5ncy4gKilcbmxldCBic2NhbmZfZm9ybWF0IDpcbiAgU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPlxuICAoKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gJ2cpIC0+ICdnID1cbiAgZnVuIGliIGZvcm1hdCBmIC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfc3RyaW5nIG1heF9pbnQgaWIgaW5cbiAgICBsZXQgc3RyID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgbGV0IGZtdCcgPVxuICAgICAgdHJ5IGZvcm1hdF9vZl9zdHJpbmdfZm9ybWF0IHN0ciBmb3JtYXRcbiAgICAgIHdpdGggRmFpbHVyZSBtc2cgLT4gYmFkX2lucHV0IG1zZyBpblxuICAgIGYgZm10J1xuXG5cbmxldCBzc2NhbmZfZm9ybWF0IDpcbiAgc3RyaW5nIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gICgoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAnZykgLT4gJ2cgPVxuICBmdW4gcyBmb3JtYXQgZiAtPiBic2NhbmZfZm9ybWF0IChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBmb3JtYXQgZlxuXG5cbmxldCBmb3JtYXRfZnJvbV9zdHJpbmcgcyBmbXQgPVxuICBzc2NhbmZfZm9ybWF0IChcIlxcXCJcIiBeIFN0cmluZy5lc2NhcGVkIHMgXiBcIlxcXCJcIikgZm10IChmdW4geCAtPiB4KVxuXG5cbmxldCB1bmVzY2FwZWQgcyA9XG4gIHNzY2FuZiAoXCJcXFwiXCIgXiBzIF4gXCJcXFwiXCIpIFwiJVMlIVwiIChmdW4geCAtPiB4KVxuXG5cbigqIERlcHJlY2F0ZWQgKilcbmxldCBrZnNjYW5mIGljIGVmIGZtdCA9IGtic2NhbmYgKFNjYW5uaW5nLm1lbW9fZnJvbV9jaGFubmVsIGljKSBlZiBmbXRcbmxldCBmc2NhbmYgaWMgZm10ID0ga3NjYW5mIChTY2FubmluZy5tZW1vX2Zyb21fY2hhbm5lbCBpYykgc2NhbmZfYmFkX2lucHV0IGZtdFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBSZWdpc3RlcmluZyBPQ2FtbCB2YWx1ZXMgd2l0aCB0aGUgQyBydW50aW1lIGZvciBsYXRlciBjYWxsYmFja3MgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gT2JqLnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgcmVnaXN0ZXIgbmFtZSB2ID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSAoT2JqLnJlcHIgdilcblxubGV0IHJlZ2lzdGVyX2V4Y2VwdGlvbiBuYW1lIChleG4gOiBleG4pID1cbiAgbGV0IGV4biA9IE9iai5yZXByIGV4biBpblxuICBsZXQgc2xvdCA9IGlmIE9iai50YWcgZXhuID0gT2JqLm9iamVjdF90YWcgdGhlbiBleG4gZWxzZSBPYmouZmllbGQgZXhuIDAgaW5cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSBzbG90XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICBKZXJvbWUgVm91aWxsb24sIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAyIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gT2JqXG5cbigqKioqIE9iamVjdCByZXByZXNlbnRhdGlvbiAqKioqKVxuXG5leHRlcm5hbCBzZXRfaWQ6ICdhIC0+ICdhID0gXCJjYW1sX3NldF9vb19pZFwiIFtAQG5vYWxsb2NdXG5cbigqKioqIE9iamVjdCBjb3B5ICoqKiopXG5cbmxldCBjb3B5IG8gPVxuICBsZXQgbyA9IChPYmoub2JqIChPYmouZHVwIChPYmoucmVwciBvKSkpIGluXG4gIHNldF9pZCBvXG5cbigqKioqIENvbXByZXNzaW9uIG9wdGlvbnMgKioqKilcbigqIFBhcmFtZXRlcnMgKilcbnR5cGUgcGFyYW1zID0ge1xuICAgIG11dGFibGUgY29tcGFjdF90YWJsZSA6IGJvb2w7XG4gICAgbXV0YWJsZSBjb3B5X3BhcmVudCA6IGJvb2w7XG4gICAgbXV0YWJsZSBjbGVhbl93aGVuX2NvcHlpbmcgOiBib29sO1xuICAgIG11dGFibGUgcmV0cnlfY291bnQgOiBpbnQ7XG4gICAgbXV0YWJsZSBidWNrZXRfc21hbGxfc2l6ZSA6IGludFxuICB9XG5cbmxldCBwYXJhbXMgPSB7XG4gIGNvbXBhY3RfdGFibGUgPSB0cnVlO1xuICBjb3B5X3BhcmVudCA9IHRydWU7XG4gIGNsZWFuX3doZW5fY29weWluZyA9IHRydWU7XG4gIHJldHJ5X2NvdW50ID0gMztcbiAgYnVja2V0X3NtYWxsX3NpemUgPSAxNlxufVxuXG4oKioqKiBQYXJhbWV0ZXJzICoqKiopXG5cbmxldCBpbml0aWFsX29iamVjdF9zaXplID0gMlxuXG4oKioqKiBJdGVtcyAqKioqKVxuXG50eXBlIGl0ZW0gPSBEdW1teUEgfCBEdW1teUIgfCBEdW1teUMgb2YgaW50XG5sZXQgXyA9IFtEdW1teUE7IER1bW15QjsgRHVtbXlDIDBdICgqIHRvIGF2b2lkIHdhcm5pbmdzICopXG5cbmxldCBkdW1teV9pdGVtID0gKG1hZ2ljICgpIDogaXRlbSlcblxuKCoqKiogVHlwZXMgKioqKilcblxudHlwZSB0YWdcbnR5cGUgbGFiZWwgPSBpbnRcbnR5cGUgY2xvc3VyZSA9IGl0ZW1cbnR5cGUgdCA9IER1bW15QSB8IER1bW15QiB8IER1bW15QyBvZiBpbnRcbmxldCBfID0gW0R1bW15QTsgRHVtbXlCOyBEdW1teUMgMF0gKCogdG8gYXZvaWQgd2FybmluZ3MgKilcblxudHlwZSBvYmogPSB0IGFycmF5XG5leHRlcm5hbCByZXQgOiAob2JqIC0+ICdhKSAtPiBjbG9zdXJlID0gXCIlaWRlbnRpdHlcIlxuXG4oKioqKiBMYWJlbHMgKioqKilcblxubGV0IHB1YmxpY19tZXRob2RfbGFiZWwgcyA6IHRhZyA9XG4gIGxldCBhY2N1ID0gcmVmIDAgaW5cbiAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICBhY2N1IDo9IDIyMyAqICFhY2N1ICsgQ2hhci5jb2RlIHMuW2ldXG4gIGRvbmU7XG4gICgqIHJlZHVjZSB0byAzMSBiaXRzICopXG4gIGFjY3UgOj0gIWFjY3UgbGFuZCAoMSBsc2wgMzEgLSAxKTtcbiAgKCogbWFrZSBpdCBzaWduZWQgZm9yIDY0IGJpdHMgYXJjaGl0ZWN0dXJlcyAqKVxuICBsZXQgdGFnID0gaWYgIWFjY3UgPiAweDNGRkZGRkZGIHRoZW4gIWFjY3UgLSAoMSBsc2wgMzEpIGVsc2UgIWFjY3UgaW5cbiAgKCogUHJpbnRmLmVwcmludGYgXCIlcyA9ICVkXFxuXCIgcyB0YWc7IGZsdXNoIHN0ZGVycjsgKilcbiAgbWFnaWMgdGFnXG5cbigqKioqIFNwYXJzZSBhcnJheSAqKioqKVxuXG5tb2R1bGUgVmFycyA9XG4gIE1hcC5NYWtlKHN0cnVjdCB0eXBlIHQgPSBzdHJpbmcgbGV0IGNvbXBhcmUgKHg6dCkgeSA9IGNvbXBhcmUgeCB5IGVuZClcbnR5cGUgdmFycyA9IGludCBWYXJzLnRcblxubW9kdWxlIE1ldGhzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IHN0cmluZyBsZXQgY29tcGFyZSAoeDp0KSB5ID0gY29tcGFyZSB4IHkgZW5kKVxudHlwZSBtZXRocyA9IGxhYmVsIE1ldGhzLnRcbm1vZHVsZSBMYWJzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IGxhYmVsIGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG50eXBlIGxhYnMgPSBib29sIExhYnMudFxuXG4oKiBUaGUgY29tcGlsZXIgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBbc2l6ZV0uICopXG50eXBlIHRhYmxlID1cbiB7IG11dGFibGUgc2l6ZTogaW50O1xuICAgbXV0YWJsZSBtZXRob2RzOiBjbG9zdXJlIGFycmF5O1xuICAgbXV0YWJsZSBtZXRob2RzX2J5X25hbWU6IG1ldGhzO1xuICAgbXV0YWJsZSBtZXRob2RzX2J5X2xhYmVsOiBsYWJzO1xuICAgbXV0YWJsZSBwcmV2aW91c19zdGF0ZXM6XG4gICAgIChtZXRocyAqIGxhYnMgKiAobGFiZWwgKiBpdGVtKSBsaXN0ICogdmFycyAqXG4gICAgICBsYWJlbCBsaXN0ICogc3RyaW5nIGxpc3QpIGxpc3Q7XG4gICBtdXRhYmxlIGhpZGRlbl9tZXRoczogKGxhYmVsICogaXRlbSkgbGlzdDtcbiAgIG11dGFibGUgdmFyczogdmFycztcbiAgIG11dGFibGUgaW5pdGlhbGl6ZXJzOiAob2JqIC0+IHVuaXQpIGxpc3QgfVxuXG5sZXQgZHVtbXlfdGFibGUgPVxuICB7IG1ldGhvZHMgPSBbfCBkdW1teV9pdGVtIHxdO1xuICAgIG1ldGhvZHNfYnlfbmFtZSA9IE1ldGhzLmVtcHR5O1xuICAgIG1ldGhvZHNfYnlfbGFiZWwgPSBMYWJzLmVtcHR5O1xuICAgIHByZXZpb3VzX3N0YXRlcyA9IFtdO1xuICAgIGhpZGRlbl9tZXRocyA9IFtdO1xuICAgIHZhcnMgPSBWYXJzLmVtcHR5O1xuICAgIGluaXRpYWxpemVycyA9IFtdO1xuICAgIHNpemUgPSAwIH1cblxubGV0IHRhYmxlX2NvdW50ID0gcmVmIDBcblxuKCogZHVtbXlfbWV0IHNob3VsZCBiZSBhIHBvaW50ZXIsIHNvIHVzZSBhbiBhdG9tICopXG5sZXQgZHVtbXlfbWV0IDogaXRlbSA9IG9iaiAoT2JqLm5ld19ibG9jayAwIDApXG4oKiBpZiBkZWJ1Z2dpbmcgaXMgbmVlZGVkLCB0aGlzIGNvdWxkIGJlIGEgZ29vZCBpZGVhOiAqKVxuKCogbGV0IGR1bW15X21ldCAoKSA9IGZhaWx3aXRoIFwiVW5kZWZpbmVkIG1ldGhvZFwiICopXG5cbmxldCByZWMgZml0X3NpemUgbiA9XG4gIGlmIG4gPD0gMiB0aGVuIG4gZWxzZVxuICBmaXRfc2l6ZSAoKG4rMSkvMikgKiAyXG5cbmxldCBuZXdfdGFibGUgcHViX2xhYmVscyA9XG4gIGluY3IgdGFibGVfY291bnQ7XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcHViX2xhYmVscyBpblxuICBsZXQgbWV0aG9kcyA9IEFycmF5Lm1ha2UgKGxlbioyKzIpIGR1bW15X21ldCBpblxuICBtZXRob2RzLigwKSA8LSBtYWdpYyBsZW47XG4gIG1ldGhvZHMuKDEpIDwtIG1hZ2ljIChmaXRfc2l6ZSBsZW4gKiBTeXMud29yZF9zaXplIC8gOCAtIDEpO1xuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkbyBtZXRob2RzLihpKjIrMykgPC0gbWFnaWMgcHViX2xhYmVscy4oaSkgZG9uZTtcbiAgeyBtZXRob2RzID0gbWV0aG9kcztcbiAgICBtZXRob2RzX2J5X25hbWUgPSBNZXRocy5lbXB0eTtcbiAgICBtZXRob2RzX2J5X2xhYmVsID0gTGFicy5lbXB0eTtcbiAgICBwcmV2aW91c19zdGF0ZXMgPSBbXTtcbiAgICBoaWRkZW5fbWV0aHMgPSBbXTtcbiAgICB2YXJzID0gVmFycy5lbXB0eTtcbiAgICBpbml0aWFsaXplcnMgPSBbXTtcbiAgICBzaXplID0gaW5pdGlhbF9vYmplY3Rfc2l6ZSB9XG5cbmxldCByZXNpemUgYXJyYXkgbmV3X3NpemUgPVxuICBsZXQgb2xkX3NpemUgPSBBcnJheS5sZW5ndGggYXJyYXkubWV0aG9kcyBpblxuICBpZiBuZXdfc2l6ZSA+IG9sZF9zaXplIHRoZW4gYmVnaW5cbiAgICBsZXQgbmV3X2J1Y2sgPSBBcnJheS5tYWtlIG5ld19zaXplIGR1bW15X21ldCBpblxuICAgIEFycmF5LmJsaXQgYXJyYXkubWV0aG9kcyAwIG5ld19idWNrIDAgb2xkX3NpemU7XG4gICAgYXJyYXkubWV0aG9kcyA8LSBuZXdfYnVja1xuIGVuZFxuXG5sZXQgcHV0IGFycmF5IGxhYmVsIGVsZW1lbnQgPVxuICByZXNpemUgYXJyYXkgKGxhYmVsICsgMSk7XG4gIGFycmF5Lm1ldGhvZHMuKGxhYmVsKSA8LSBlbGVtZW50XG5cbigqKioqIENsYXNzZXMgKioqKilcblxubGV0IG1ldGhvZF9jb3VudCA9IHJlZiAwXG5sZXQgaW5zdF92YXJfY291bnQgPSByZWYgMFxuXG4oKiB0eXBlIHQgKilcbnR5cGUgbWV0aCA9IGl0ZW1cblxubGV0IG5ld19tZXRob2QgdGFibGUgPVxuICBsZXQgaW5kZXggPSBBcnJheS5sZW5ndGggdGFibGUubWV0aG9kcyBpblxuICByZXNpemUgdGFibGUgKGluZGV4ICsgMSk7XG4gIGluZGV4XG5cbmxldCBnZXRfbWV0aG9kX2xhYmVsIHRhYmxlIG5hbWUgPVxuICB0cnlcbiAgICBNZXRocy5maW5kIG5hbWUgdGFibGUubWV0aG9kc19ieV9uYW1lXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgbGV0IGxhYmVsID0gbmV3X21ldGhvZCB0YWJsZSBpblxuICAgIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSA8LSBNZXRocy5hZGQgbmFtZSBsYWJlbCB0YWJsZS5tZXRob2RzX2J5X25hbWU7XG4gICAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSBMYWJzLmFkZCBsYWJlbCB0cnVlIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWw7XG4gICAgbGFiZWxcblxubGV0IGdldF9tZXRob2RfbGFiZWxzIHRhYmxlIG5hbWVzID1cbiAgQXJyYXkubWFwIChnZXRfbWV0aG9kX2xhYmVsIHRhYmxlKSBuYW1lc1xuXG5sZXQgc2V0X21ldGhvZCB0YWJsZSBsYWJlbCBlbGVtZW50ID1cbiAgaW5jciBtZXRob2RfY291bnQ7XG4gIGlmIExhYnMuZmluZCBsYWJlbCB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIHRoZW5cbiAgICBwdXQgdGFibGUgbGFiZWwgZWxlbWVudFxuICBlbHNlXG4gICAgdGFibGUuaGlkZGVuX21ldGhzIDwtIChsYWJlbCwgZWxlbWVudCkgOjogdGFibGUuaGlkZGVuX21ldGhzXG5cbmxldCBnZXRfbWV0aG9kIHRhYmxlIGxhYmVsID1cbiAgdHJ5IExpc3QuYXNzb2MgbGFiZWwgdGFibGUuaGlkZGVuX21ldGhzXG4gIHdpdGggTm90X2ZvdW5kIC0+IHRhYmxlLm1ldGhvZHMuKGxhYmVsKVxuXG5sZXQgdG9fbGlzdCBhcnIgPVxuICBpZiBhcnIgPT0gbWFnaWMgMCB0aGVuIFtdIGVsc2UgQXJyYXkudG9fbGlzdCBhcnJcblxubGV0IG5hcnJvdyB0YWJsZSB2YXJzIHZpcnRfbWV0aHMgY29uY3JfbWV0aHMgPVxuICBsZXQgdmFycyA9IHRvX2xpc3QgdmFyc1xuICBhbmQgdmlydF9tZXRocyA9IHRvX2xpc3QgdmlydF9tZXRoc1xuICBhbmQgY29uY3JfbWV0aHMgPSB0b19saXN0IGNvbmNyX21ldGhzIGluXG4gIGxldCB2aXJ0X21ldGhfbGFicyA9IExpc3QubWFwIChnZXRfbWV0aG9kX2xhYmVsIHRhYmxlKSB2aXJ0X21ldGhzIGluXG4gIGxldCBjb25jcl9tZXRoX2xhYnMgPSBMaXN0Lm1hcCAoZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSkgY29uY3JfbWV0aHMgaW5cbiAgdGFibGUucHJldmlvdXNfc3RhdGVzIDwtXG4gICAgICh0YWJsZS5tZXRob2RzX2J5X25hbWUsIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwsIHRhYmxlLmhpZGRlbl9tZXRocyxcbiAgICAgIHRhYmxlLnZhcnMsIHZpcnRfbWV0aF9sYWJzLCB2YXJzKVxuICAgICA6OiB0YWJsZS5wcmV2aW91c19zdGF0ZXM7XG4gIHRhYmxlLnZhcnMgPC1cbiAgICBWYXJzLmZvbGRcbiAgICAgIChmdW4gbGFiIGluZm8gdHZhcnMgLT5cbiAgICAgICAgaWYgTGlzdC5tZW0gbGFiIHZhcnMgdGhlbiBWYXJzLmFkZCBsYWIgaW5mbyB0dmFycyBlbHNlIHR2YXJzKVxuICAgICAgdGFibGUudmFycyBWYXJzLmVtcHR5O1xuICBsZXQgYnlfbmFtZSA9IHJlZiBNZXRocy5lbXB0eSBpblxuICBsZXQgYnlfbGFiZWwgPSByZWYgTGFicy5lbXB0eSBpblxuICBMaXN0Lml0ZXIyXG4gICAgKGZ1biBtZXQgbGFiZWwgLT5cbiAgICAgICBieV9uYW1lIDo9IE1ldGhzLmFkZCBtZXQgbGFiZWwgIWJ5X25hbWU7XG4gICAgICAgYnlfbGFiZWwgOj1cbiAgICAgICAgICBMYWJzLmFkZCBsYWJlbFxuICAgICAgICAgICAgKHRyeSBMYWJzLmZpbmQgbGFiZWwgdGFibGUubWV0aG9kc19ieV9sYWJlbCB3aXRoIE5vdF9mb3VuZCAtPiB0cnVlKVxuICAgICAgICAgICAgIWJ5X2xhYmVsKVxuICAgIGNvbmNyX21ldGhzIGNvbmNyX21ldGhfbGFicztcbiAgTGlzdC5pdGVyMlxuICAgIChmdW4gbWV0IGxhYmVsIC0+XG4gICAgICAgYnlfbmFtZSA6PSBNZXRocy5hZGQgbWV0IGxhYmVsICFieV9uYW1lO1xuICAgICAgIGJ5X2xhYmVsIDo9IExhYnMuYWRkIGxhYmVsIGZhbHNlICFieV9sYWJlbClcbiAgICB2aXJ0X21ldGhzIHZpcnRfbWV0aF9sYWJzO1xuICB0YWJsZS5tZXRob2RzX2J5X25hbWUgPC0gIWJ5X25hbWU7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gIWJ5X2xhYmVsO1xuICB0YWJsZS5oaWRkZW5fbWV0aHMgPC1cbiAgICAgTGlzdC5mb2xkX3JpZ2h0XG4gICAgICAgKGZ1biAoKGxhYiwgXykgYXMgbWV0KSBobSAtPlxuICAgICAgICAgIGlmIExpc3QubWVtIGxhYiB2aXJ0X21ldGhfbGFicyB0aGVuIGhtIGVsc2UgbWV0OjpobSlcbiAgICAgICB0YWJsZS5oaWRkZW5fbWV0aHNcbiAgICAgICBbXVxuXG5sZXQgd2lkZW4gdGFibGUgPVxuICBsZXQgKGJ5X25hbWUsIGJ5X2xhYmVsLCBzYXZlZF9oaWRkZW5fbWV0aHMsIHNhdmVkX3ZhcnMsIHZpcnRfbWV0aHMsIHZhcnMpID1cbiAgICBMaXN0LmhkIHRhYmxlLnByZXZpb3VzX3N0YXRlc1xuICBpblxuICB0YWJsZS5wcmV2aW91c19zdGF0ZXMgPC0gTGlzdC50bCB0YWJsZS5wcmV2aW91c19zdGF0ZXM7XG4gIHRhYmxlLnZhcnMgPC1cbiAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAoZnVuIHMgdiAtPiBWYXJzLmFkZCB2IChWYXJzLmZpbmQgdiB0YWJsZS52YXJzKSBzKVxuICAgICAgIHNhdmVkX3ZhcnMgdmFycztcbiAgdGFibGUubWV0aG9kc19ieV9uYW1lIDwtIGJ5X25hbWU7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gYnlfbGFiZWw7XG4gIHRhYmxlLmhpZGRlbl9tZXRocyA8LVxuICAgICBMaXN0LmZvbGRfcmlnaHRcbiAgICAgICAoZnVuICgobGFiLCBfKSBhcyBtZXQpIGhtIC0+XG4gICAgICAgICAgaWYgTGlzdC5tZW0gbGFiIHZpcnRfbWV0aHMgdGhlbiBobSBlbHNlIG1ldDo6aG0pXG4gICAgICAgdGFibGUuaGlkZGVuX21ldGhzXG4gICAgICAgc2F2ZWRfaGlkZGVuX21ldGhzXG5cbmxldCBuZXdfc2xvdCB0YWJsZSA9XG4gIGxldCBpbmRleCA9IHRhYmxlLnNpemUgaW5cbiAgdGFibGUuc2l6ZSA8LSBpbmRleCArIDE7XG4gIGluZGV4XG5cbmxldCBuZXdfdmFyaWFibGUgdGFibGUgbmFtZSA9XG4gIHRyeSBWYXJzLmZpbmQgbmFtZSB0YWJsZS52YXJzXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgbGV0IGluZGV4ID0gbmV3X3Nsb3QgdGFibGUgaW5cbiAgICBpZiBuYW1lIDw+IFwiXCIgdGhlbiB0YWJsZS52YXJzIDwtIFZhcnMuYWRkIG5hbWUgaW5kZXggdGFibGUudmFycztcbiAgICBpbmRleFxuXG5sZXQgdG9fYXJyYXkgYXJyID1cbiAgaWYgYXJyID0gT2JqLm1hZ2ljIDAgdGhlbiBbfHxdIGVsc2UgYXJyXG5cbmxldCBuZXdfbWV0aG9kc192YXJpYWJsZXMgdGFibGUgbWV0aHMgdmFscyA9XG4gIGxldCBtZXRocyA9IHRvX2FycmF5IG1ldGhzIGluXG4gIGxldCBubWV0aHMgPSBBcnJheS5sZW5ndGggbWV0aHMgYW5kIG52YWxzID0gQXJyYXkubGVuZ3RoIHZhbHMgaW5cbiAgbGV0IHJlcyA9IEFycmF5Lm1ha2UgKG5tZXRocyArIG52YWxzKSAwIGluXG4gIGZvciBpID0gMCB0byBubWV0aHMgLSAxIGRvXG4gICAgcmVzLihpKSA8LSBnZXRfbWV0aG9kX2xhYmVsIHRhYmxlIG1ldGhzLihpKVxuICBkb25lO1xuICBmb3IgaSA9IDAgdG8gbnZhbHMgLSAxIGRvXG4gICAgcmVzLihpK25tZXRocykgPC0gbmV3X3ZhcmlhYmxlIHRhYmxlIHZhbHMuKGkpXG4gIGRvbmU7XG4gIHJlc1xuXG5sZXQgZ2V0X3ZhcmlhYmxlIHRhYmxlIG5hbWUgPVxuICB0cnkgVmFycy5maW5kIG5hbWUgdGFibGUudmFycyB3aXRoIE5vdF9mb3VuZCAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGdldF92YXJpYWJsZXMgdGFibGUgbmFtZXMgPVxuICBBcnJheS5tYXAgKGdldF92YXJpYWJsZSB0YWJsZSkgbmFtZXNcblxubGV0IGFkZF9pbml0aWFsaXplciB0YWJsZSBmID1cbiAgdGFibGUuaW5pdGlhbGl6ZXJzIDwtIGY6OnRhYmxlLmluaXRpYWxpemVyc1xuXG4oKlxubW9kdWxlIEtleXMgPVxuICBNYXAuTWFrZShzdHJ1Y3QgdHlwZSB0ID0gdGFnIGFycmF5IGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG5sZXQga2V5X21hcCA9IHJlZiBLZXlzLmVtcHR5XG5sZXQgZ2V0X2tleSB0YWdzIDogaXRlbSA9XG4gIHRyeSBtYWdpYyAoS2V5cy5maW5kIHRhZ3MgIWtleV9tYXAgOiB0YWcgYXJyYXkpXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAga2V5X21hcCA6PSBLZXlzLmFkZCB0YWdzIHRhZ3MgIWtleV9tYXA7XG4gICAgbWFnaWMgdGFnc1xuKilcblxubGV0IGNyZWF0ZV90YWJsZSBwdWJsaWNfbWV0aG9kcyA9XG4gIGlmIHB1YmxpY19tZXRob2RzID09IG1hZ2ljIDAgdGhlbiBuZXdfdGFibGUgW3x8XSBlbHNlXG4gICgqIFtwdWJsaWNfbWV0aG9kc10gbXVzdCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yIGJ5dGVjb2RlICopXG4gIGxldCB0YWdzID0gQXJyYXkubWFwIHB1YmxpY19tZXRob2RfbGFiZWwgcHVibGljX21ldGhvZHMgaW5cbiAgbGV0IHRhYmxlID0gbmV3X3RhYmxlIHRhZ3MgaW5cbiAgQXJyYXkuaXRlcmlcbiAgICAoZnVuIGkgbWV0IC0+XG4gICAgICBsZXQgbGFiID0gaSoyKzIgaW5cbiAgICAgIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSAgPC0gTWV0aHMuYWRkIG1ldCBsYWIgdGFibGUubWV0aG9kc19ieV9uYW1lO1xuICAgICAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSBMYWJzLmFkZCBsYWIgdHJ1ZSB0YWJsZS5tZXRob2RzX2J5X2xhYmVsKVxuICAgIHB1YmxpY19tZXRob2RzO1xuICB0YWJsZVxuXG5sZXQgaW5pdF9jbGFzcyB0YWJsZSA9XG4gIGluc3RfdmFyX2NvdW50IDo9ICFpbnN0X3Zhcl9jb3VudCArIHRhYmxlLnNpemUgLSAxO1xuICB0YWJsZS5pbml0aWFsaXplcnMgPC0gTGlzdC5yZXYgdGFibGUuaW5pdGlhbGl6ZXJzO1xuICByZXNpemUgdGFibGUgKDMgKyBtYWdpYyB0YWJsZS5tZXRob2RzLigxKSAqIDE2IC8gU3lzLndvcmRfc2l6ZSlcblxubGV0IGluaGVyaXRzIGNsYSB2YWxzIHZpcnRfbWV0aHMgY29uY3JfbWV0aHMgKF8sIHN1cGVyLCBfLCBlbnYpIHRvcCA9XG4gIG5hcnJvdyBjbGEgdmFscyB2aXJ0X21ldGhzIGNvbmNyX21ldGhzO1xuICBsZXQgaW5pdCA9XG4gICAgaWYgdG9wIHRoZW4gc3VwZXIgY2xhIGVudiBlbHNlIE9iai5yZXByIChzdXBlciBjbGEpIGluXG4gIHdpZGVuIGNsYTtcbiAgQXJyYXkuY29uY2F0XG4gICAgW1t8IHJlcHIgaW5pdCB8XTtcbiAgICAgbWFnaWMgKEFycmF5Lm1hcCAoZ2V0X3ZhcmlhYmxlIGNsYSkgKHRvX2FycmF5IHZhbHMpIDogaW50IGFycmF5KTtcbiAgICAgQXJyYXkubWFwXG4gICAgICAgKGZ1biBubSAtPiByZXByIChnZXRfbWV0aG9kIGNsYSAoZ2V0X21ldGhvZF9sYWJlbCBjbGEgbm0pIDogY2xvc3VyZSkpXG4gICAgICAgKHRvX2FycmF5IGNvbmNyX21ldGhzKSBdXG5cbmxldCBtYWtlX2NsYXNzIHB1Yl9tZXRocyBjbGFzc19pbml0ID1cbiAgbGV0IHRhYmxlID0gY3JlYXRlX3RhYmxlIHB1Yl9tZXRocyBpblxuICBsZXQgZW52X2luaXQgPSBjbGFzc19pbml0IHRhYmxlIGluXG4gIGluaXRfY2xhc3MgdGFibGU7XG4gIChlbnZfaW5pdCAoT2JqLnJlcHIgMCksIGNsYXNzX2luaXQsIGVudl9pbml0LCBPYmoucmVwciAwKVxuXG50eXBlIGluaXRfdGFibGUgPSB7IG11dGFibGUgZW52X2luaXQ6IHQ7IG11dGFibGUgY2xhc3NfaW5pdDogdGFibGUgLT4gdCB9XG5bQEB3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXVxuXG5sZXQgbWFrZV9jbGFzc19zdG9yZSBwdWJfbWV0aHMgY2xhc3NfaW5pdCBpbml0X3RhYmxlID1cbiAgbGV0IHRhYmxlID0gY3JlYXRlX3RhYmxlIHB1Yl9tZXRocyBpblxuICBsZXQgZW52X2luaXQgPSBjbGFzc19pbml0IHRhYmxlIGluXG4gIGluaXRfY2xhc3MgdGFibGU7XG4gIGluaXRfdGFibGUuY2xhc3NfaW5pdCA8LSBjbGFzc19pbml0O1xuICBpbml0X3RhYmxlLmVudl9pbml0IDwtIGVudl9pbml0XG5cbmxldCBkdW1teV9jbGFzcyBsb2MgPVxuICBsZXQgdW5kZWYgPSBmdW4gXyAtPiByYWlzZSAoVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgbG9jKSBpblxuICAoT2JqLm1hZ2ljIHVuZGVmLCB1bmRlZiwgdW5kZWYsIE9iai5yZXByIDApXG5cbigqKioqIE9iamVjdHMgKioqKilcblxubGV0IGNyZWF0ZV9vYmplY3QgdGFibGUgPVxuICAoKiBYWFggQXBwZWwgZGUgW29ial9ibG9ja10gfCBDYWxsIHRvIFtvYmpfYmxvY2tdICAqKVxuICBsZXQgb2JqID0gT2JqLm5ld19ibG9jayBPYmoub2JqZWN0X3RhZyB0YWJsZS5zaXplIGluXG4gICgqIFhYWCBBcHBlbCBkZSBbY2FtbF9tb2RpZnldIHwgQ2FsbCB0byBbY2FtbF9tb2RpZnldICopXG4gIE9iai5zZXRfZmllbGQgb2JqIDAgKE9iai5yZXByIHRhYmxlLm1ldGhvZHMpO1xuICBPYmoub2JqIChzZXRfaWQgb2JqKVxuXG5sZXQgY3JlYXRlX29iamVjdF9vcHQgb2JqXzAgdGFibGUgPVxuICBpZiAoT2JqLm1hZ2ljIG9ial8wIDogYm9vbCkgdGhlbiBvYmpfMCBlbHNlIGJlZ2luXG4gICAgKCogWFhYIEFwcGVsIGRlIFtvYmpfYmxvY2tdIHwgQ2FsbCB0byBbb2JqX2Jsb2NrXSAgKilcbiAgICBsZXQgb2JqID0gT2JqLm5ld19ibG9jayBPYmoub2JqZWN0X3RhZyB0YWJsZS5zaXplIGluXG4gICAgKCogWFhYIEFwcGVsIGRlIFtjYW1sX21vZGlmeV0gfCBDYWxsIHRvIFtjYW1sX21vZGlmeV0gKilcbiAgICBPYmouc2V0X2ZpZWxkIG9iaiAwIChPYmoucmVwciB0YWJsZS5tZXRob2RzKTtcbiAgICBPYmoub2JqIChzZXRfaWQgb2JqKVxuICBlbmRcblxubGV0IHJlYyBpdGVyX2Ygb2JqID1cbiAgZnVuY3Rpb25cbiAgICBbXSAgIC0+ICgpXG4gIHwgZjo6bCAtPiBmIG9iajsgaXRlcl9mIG9iaiBsXG5cbmxldCBydW5faW5pdGlhbGl6ZXJzIG9iaiB0YWJsZSA9XG4gIGxldCBpbml0cyA9IHRhYmxlLmluaXRpYWxpemVycyBpblxuICBpZiBpbml0cyA8PiBbXSB0aGVuXG4gICAgaXRlcl9mIG9iaiBpbml0c1xuXG5sZXQgcnVuX2luaXRpYWxpemVyc19vcHQgb2JqXzAgb2JqIHRhYmxlID1cbiAgaWYgKE9iai5tYWdpYyBvYmpfMCA6IGJvb2wpIHRoZW4gb2JqIGVsc2UgYmVnaW5cbiAgICBsZXQgaW5pdHMgPSB0YWJsZS5pbml0aWFsaXplcnMgaW5cbiAgICBpZiBpbml0cyA8PiBbXSB0aGVuIGl0ZXJfZiBvYmogaW5pdHM7XG4gICAgb2JqXG4gIGVuZFxuXG5sZXQgY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVycyBvYmpfMCB0YWJsZSA9XG4gIGlmIChPYmoubWFnaWMgb2JqXzAgOiBib29sKSB0aGVuIG9ial8wIGVsc2UgYmVnaW5cbiAgICBsZXQgb2JqID0gY3JlYXRlX29iamVjdCB0YWJsZSBpblxuICAgIHJ1bl9pbml0aWFsaXplcnMgb2JqIHRhYmxlO1xuICAgIG9ialxuICBlbmRcblxuKCogRXF1aXZhbGVudCBwcmltaXRpdmUgYmVsb3dcbmxldCBzZW5kc2VsZiBvYmogbGFiID1cbiAgKG1hZ2ljIG9iaiA6IChvYmogLT4gdCkgYXJyYXkgYXJyYXkpLigwKS4obGFiKSBvYmpcbiopXG5leHRlcm5hbCBzZW5kIDogb2JqIC0+IHRhZyAtPiAnYSA9IFwiJXNlbmRcIlxuZXh0ZXJuYWwgc2VuZGNhY2hlIDogb2JqIC0+IHRhZyAtPiB0IC0+IGludCAtPiAnYSA9IFwiJXNlbmRjYWNoZVwiXG5leHRlcm5hbCBzZW5kc2VsZiA6IG9iaiAtPiBsYWJlbCAtPiAnYSA9IFwiJXNlbmRzZWxmXCJcbmV4dGVybmFsIGdldF9wdWJsaWNfbWV0aG9kIDogb2JqIC0+IHRhZyAtPiBjbG9zdXJlXG4gICAgPSBcImNhbWxfZ2V0X3B1YmxpY19tZXRob2RcIiBbQEBub2FsbG9jXVxuXG4oKioqKiB0YWJsZSBjb2xsZWN0aW9uIGFjY2VzcyAqKioqKVxuXG50eXBlIHRhYmxlcyA9XG4gIHwgRW1wdHlcbiAgfCBDb25zIG9mIHtrZXkgOiBjbG9zdXJlOyBtdXRhYmxlIGRhdGE6IHRhYmxlczsgbXV0YWJsZSBuZXh0OiB0YWJsZXN9XG5cbmxldCBzZXRfZGF0YSB0YWJsZXMgdiA9IG1hdGNoIHRhYmxlcyB3aXRoXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLmRhdGEgPC0gdlxubGV0IHNldF9uZXh0IHRhYmxlcyB2ID0gbWF0Y2ggdGFibGVzIHdpdGhcbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMubmV4dCA8LSB2XG5sZXQgZ2V0X2tleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLmtleVxubGV0IGdldF9kYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMuZGF0YVxubGV0IGdldF9uZXh0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMubmV4dFxuXG5sZXQgYnVpbGRfcGF0aCBuIGtleXMgdGFibGVzID1cbiAgbGV0IHJlcyA9IENvbnMge2tleSA9IE9iai5tYWdpYyAwOyBkYXRhID0gRW1wdHk7IG5leHQgPSBFbXB0eX0gaW5cbiAgbGV0IHIgPSByZWYgcmVzIGluXG4gIGZvciBpID0gMCB0byBuIGRvXG4gICAgciA6PSBDb25zIHtrZXkgPSBrZXlzLihpKTsgZGF0YSA9ICFyOyBuZXh0ID0gRW1wdHl9XG4gIGRvbmU7XG4gIHNldF9kYXRhIHRhYmxlcyAhcjtcbiAgcmVzXG5cbmxldCByZWMgbG9va3VwX2tleXMgaSBrZXlzIHRhYmxlcyA9XG4gIGlmIGkgPCAwIHRoZW4gdGFibGVzIGVsc2VcbiAgbGV0IGtleSA9IGtleXMuKGkpIGluXG4gIGxldCByZWMgbG9va3VwX2tleSAodGFibGVzOnRhYmxlcykgPVxuICAgIGlmIGdldF9rZXkgdGFibGVzID09IGtleSB0aGVuXG4gICAgICBtYXRjaCBnZXRfZGF0YSB0YWJsZXMgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgQ29ucyBfIGFzIHRhYmxlc19kYXRhIC0+XG4gICAgICAgICAgbG9va3VwX2tleXMgKGktMSkga2V5cyB0YWJsZXNfZGF0YVxuICAgIGVsc2VcbiAgICAgIG1hdGNoIGdldF9uZXh0IHRhYmxlcyB3aXRoXG4gICAgICB8IENvbnMgXyBhcyBuZXh0IC0+IGxvb2t1cF9rZXkgbmV4dFxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIGxldCBuZXh0IDogdGFibGVzID0gQ29ucyB7a2V5OyBkYXRhID0gRW1wdHk7IG5leHQgPSBFbXB0eX0gaW5cbiAgICAgICAgICBzZXRfbmV4dCB0YWJsZXMgbmV4dDtcbiAgICAgICAgICBidWlsZF9wYXRoIChpLTEpIGtleXMgbmV4dFxuICBpblxuICBsb29rdXBfa2V5IHRhYmxlc1xuXG5sZXQgbG9va3VwX3RhYmxlcyByb290IGtleXMgPVxuICBtYXRjaCBnZXRfZGF0YSByb290IHdpdGhcbiAgfCBDb25zIF8gYXMgcm9vdF9kYXRhIC0+XG4gICAgbG9va3VwX2tleXMgKEFycmF5Lmxlbmd0aCBrZXlzIC0gMSkga2V5cyByb290X2RhdGFcbiAgfCBFbXB0eSAtPlxuICAgIGJ1aWxkX3BhdGggKEFycmF5Lmxlbmd0aCBrZXlzIC0gMSkga2V5cyByb290XG5cbigqKioqIGJ1aWx0aW4gbWV0aG9kcyAqKioqKVxuXG5sZXQgZ2V0X2NvbnN0IHggPSByZXQgKGZ1biBfb2JqIC0+IHgpXG5sZXQgZ2V0X3ZhciBuICAgPSByZXQgKGZ1biBvYmogLT4gQXJyYXkudW5zYWZlX2dldCBvYmogbilcbmxldCBnZXRfZW52IGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pXG5sZXQgZ2V0X21ldGggbiAgPSByZXQgKGZ1biBvYmogLT4gc2VuZHNlbGYgb2JqIG4pXG5sZXQgc2V0X3ZhciBuICAgPSByZXQgKGZ1biBvYmogeCAtPiBBcnJheS51bnNhZmVfc2V0IG9iaiBuIHgpXG5sZXQgYXBwX2NvbnN0IGYgeCA9IHJldCAoZnVuIF9vYmogLT4gZiB4KVxubGV0IGFwcF92YXIgZiBuICAgPSByZXQgKGZ1biBvYmogLT4gZiAoQXJyYXkudW5zYWZlX2dldCBvYmogbikpXG5sZXQgYXBwX2VudiBmIGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIGYgKEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pKVxubGV0IGFwcF9tZXRoIGYgbiAgPSByZXQgKGZ1biBvYmogLT4gZiAoc2VuZHNlbGYgb2JqIG4pKVxubGV0IGFwcF9jb25zdF9jb25zdCBmIHggeSA9IHJldCAoZnVuIF9vYmogLT4gZiB4IHkpXG5sZXQgYXBwX2NvbnN0X3ZhciBmIHggbiAgID0gcmV0IChmdW4gb2JqIC0+IGYgeCAoQXJyYXkudW5zYWZlX2dldCBvYmogbikpXG5sZXQgYXBwX2NvbnN0X21ldGggZiB4IG4gPSByZXQgKGZ1biBvYmogLT4gZiB4IChzZW5kc2VsZiBvYmogbikpXG5sZXQgYXBwX3Zhcl9jb25zdCBmIG4geCA9IHJldCAoZnVuIG9iaiAtPiBmIChBcnJheS51bnNhZmVfZ2V0IG9iaiBuKSB4KVxubGV0IGFwcF9tZXRoX2NvbnN0IGYgbiB4ID0gcmV0IChmdW4gb2JqIC0+IGYgKHNlbmRzZWxmIG9iaiBuKSB4KVxubGV0IGFwcF9jb25zdF9lbnYgZiB4IGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIGYgeCAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikpXG5sZXQgYXBwX2Vudl9jb25zdCBmIGUgbiB4ID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgZiAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikgeClcbmxldCBtZXRoX2FwcF9jb25zdCBuIHggPSByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKSB4KVxubGV0IG1ldGhfYXBwX3ZhciBuIG0gPVxuICByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKSAoQXJyYXkudW5zYWZlX2dldCBvYmogbSkpXG5sZXQgbWV0aF9hcHBfZW52IG4gZSBtID1cbiAgcmV0IChmdW4gb2JqIC0+IChzZW5kc2VsZiBvYmogbiA6IF8gLT4gXylcbiAgICAgIChBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBtKSlcbmxldCBtZXRoX2FwcF9tZXRoIG4gbSA9XG4gIHJldCAoZnVuIG9iaiAtPiAoc2VuZHNlbGYgb2JqIG4gOiBfIC0+IF8pIChzZW5kc2VsZiBvYmogbSkpXG5sZXQgc2VuZF9jb25zdCBtIHggYyA9XG4gIHJldCAoZnVuIG9iaiAtPiBzZW5kY2FjaGUgeCBtIChBcnJheS51bnNhZmVfZ2V0IG9iaiAwKSBjKVxubGV0IHNlbmRfdmFyIG0gbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlIChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pIDogb2JqKSBtXG4gICAgICAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBzZW5kX2VudiBtIGUgbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlXG4gICAgICAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0XG4gICAgICAgICAgICAgICAgICAgIChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKSA6IG9iailcbiAgICAgIG0gKEFycmF5LnVuc2FmZV9nZXQgb2JqIDApIGMpXG5sZXQgc2VuZF9tZXRoIG0gbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlIChzZW5kc2VsZiBvYmogbikgbSAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBuZXdfY2FjaGUgdGFibGUgPVxuICBsZXQgbiA9IG5ld19tZXRob2QgdGFibGUgaW5cbiAgbGV0IG4gPVxuICAgIGlmIG4gbW9kIDIgPSAwIHx8IG4gPiAyICsgbWFnaWMgdGFibGUubWV0aG9kcy4oMSkgKiAxNiAvIFN5cy53b3JkX3NpemVcbiAgICB0aGVuIG4gZWxzZSBuZXdfbWV0aG9kIHRhYmxlXG4gIGluXG4gIHRhYmxlLm1ldGhvZHMuKG4pIDwtIE9iai5tYWdpYyAwO1xuICBuXG5cbnR5cGUgaW1wbCA9XG4gICAgR2V0Q29uc3RcbiAgfCBHZXRWYXJcbiAgfCBHZXRFbnZcbiAgfCBHZXRNZXRoXG4gIHwgU2V0VmFyXG4gIHwgQXBwQ29uc3RcbiAgfCBBcHBWYXJcbiAgfCBBcHBFbnZcbiAgfCBBcHBNZXRoXG4gIHwgQXBwQ29uc3RDb25zdFxuICB8IEFwcENvbnN0VmFyXG4gIHwgQXBwQ29uc3RFbnZcbiAgfCBBcHBDb25zdE1ldGhcbiAgfCBBcHBWYXJDb25zdFxuICB8IEFwcEVudkNvbnN0XG4gIHwgQXBwTWV0aENvbnN0XG4gIHwgTWV0aEFwcENvbnN0XG4gIHwgTWV0aEFwcFZhclxuICB8IE1ldGhBcHBFbnZcbiAgfCBNZXRoQXBwTWV0aFxuICB8IFNlbmRDb25zdFxuICB8IFNlbmRWYXJcbiAgfCBTZW5kRW52XG4gIHwgU2VuZE1ldGhcbiAgfCBDbG9zdXJlIG9mIGNsb3N1cmVcblxubGV0IG1ldGhvZF9pbXBsIHRhYmxlIGkgYXJyID1cbiAgbGV0IG5leHQgKCkgPSBpbmNyIGk7IG1hZ2ljIGFyci4oIWkpIGluXG4gIG1hdGNoIG5leHQoKSB3aXRoXG4gICAgR2V0Q29uc3QgLT4gbGV0IHggOiB0ID0gbmV4dCgpIGluIGdldF9jb25zdCB4XG4gIHwgR2V0VmFyICAgLT4gbGV0IG4gPSBuZXh0KCkgaW4gZ2V0X3ZhciBuXG4gIHwgR2V0RW52ICAgLT4gbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW4gZ2V0X2VudiBlIG5cbiAgfCBHZXRNZXRoICAtPiBsZXQgbiA9IG5leHQoKSBpbiBnZXRfbWV0aCBuXG4gIHwgU2V0VmFyICAgLT4gbGV0IG4gPSBuZXh0KCkgaW4gc2V0X3ZhciBuXG4gIHwgQXBwQ29uc3QgLT4gbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gYXBwX2NvbnN0IGYgeFxuICB8IEFwcFZhciAgIC0+IGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBhcHBfdmFyIGYgblxuICB8IEFwcEVudiAgIC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiAgbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9lbnYgZiBlIG5cbiAgfCBBcHBNZXRoICAtPiBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQgKCkgaW4gYXBwX21ldGggZiBuXG4gIHwgQXBwQ29uc3RDb25zdCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IHkgPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9jb25zdCBmIHggeVxuICB8IEFwcENvbnN0VmFyIC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgYXBwX2NvbnN0X3ZhciBmIHggblxuICB8IEFwcENvbnN0RW52IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQgKCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9lbnYgZiB4IGUgblxuICB8IEFwcENvbnN0TWV0aCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9tZXRoIGYgeCBuXG4gIHwgQXBwVmFyQ29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluXG4gICAgICBhcHBfdmFyX2NvbnN0IGYgbiB4XG4gIHwgQXBwRW52Q29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCBlID0gbmV4dCAoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpblxuICAgICAgYXBwX2Vudl9jb25zdCBmIGUgbiB4XG4gIHwgQXBwTWV0aENvbnN0IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpblxuICAgICAgYXBwX21ldGhfY29uc3QgZiBuIHhcbiAgfCBNZXRoQXBwQ29uc3QgLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIG1ldGhfYXBwX2NvbnN0IG4geFxuICB8IE1ldGhBcHBWYXIgLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCBtID0gbmV4dCgpIGluIG1ldGhfYXBwX3ZhciBuIG1cbiAgfCBNZXRoQXBwRW52IC0+XG4gICAgICBsZXQgbiA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbSA9IG5leHQoKSBpblxuICAgICAgbWV0aF9hcHBfZW52IG4gZSBtXG4gIHwgTWV0aEFwcE1ldGggLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCBtID0gbmV4dCgpIGluIG1ldGhfYXBwX21ldGggbiBtXG4gIHwgU2VuZENvbnN0IC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBzZW5kX2NvbnN0IG0geCAobmV3X2NhY2hlIHRhYmxlKVxuICB8IFNlbmRWYXIgLT5cbiAgICAgIGxldCBtID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBzZW5kX3ZhciBtIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBTZW5kRW52IC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgc2VuZF9lbnYgbSBlIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBTZW5kTWV0aCAtPlxuICAgICAgbGV0IG0gPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0ICgpIGluIHNlbmRfbWV0aCBtIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBDbG9zdXJlIF8gYXMgY2xvIC0+IG1hZ2ljIGNsb1xuXG5sZXQgc2V0X21ldGhvZHMgdGFibGUgbWV0aG9kcyA9XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggbWV0aG9kcyBpbiBsZXQgaSA9IHJlZiAwIGluXG4gIHdoaWxlICFpIDwgbGVuIGRvXG4gICAgbGV0IGxhYmVsID0gbWV0aG9kcy4oIWkpIGluIGxldCBjbG8gPSBtZXRob2RfaW1wbCB0YWJsZSBpIG1ldGhvZHMgaW5cbiAgICBzZXRfbWV0aG9kIHRhYmxlIGxhYmVsIGNsbztcbiAgICBpbmNyIGlcbiAgZG9uZVxuXG4oKioqKiBTdGF0aXN0aWNzICoqKiopXG5cbnR5cGUgc3RhdHMgPVxuICB7IGNsYXNzZXM6IGludDsgbWV0aG9kczogaW50OyBpbnN0X3ZhcnM6IGludDsgfVxuXG5sZXQgc3RhdHMgKCkgPVxuICB7IGNsYXNzZXMgPSAhdGFibGVfY291bnQ7XG4gICAgbWV0aG9kcyA9ICFtZXRob2RfY291bnQ7IGluc3RfdmFycyA9ICFpbnN0X3Zhcl9jb3VudDsgfVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHNoYXBlID1cbiAgfCBGdW5jdGlvblxuICB8IExhenlcbiAgfCBDbGFzc1xuICB8IE1vZHVsZSBvZiBzaGFwZSBhcnJheVxuICB8IFZhbHVlIG9mIE9iai50XG5cbmxldCByZWMgaW5pdF9tb2RfZmllbGQgbW9kdSBpIGxvYyBzaGFwZSA9XG4gIGxldCBpbml0ID1cbiAgICBtYXRjaCBzaGFwZSB3aXRoXG4gICAgfCBGdW5jdGlvbiAtPlxuICAgICAgIGxldCByZWMgZm4gKHggOiAnYSkgPVxuICAgICAgICAgbGV0IGZuJyA6ICdhIC0+ICdiID0gT2JqLm9iaiAoT2JqLmZpZWxkIG1vZHUgaSkgaW5cbiAgICAgICAgIGlmIGZuID09IGZuJyB0aGVuXG4gICAgICAgICAgIHJhaXNlIChVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSBsb2MpXG4gICAgICAgICBlbHNlXG4gICAgICAgICAgIGZuJyB4IGluXG4gICAgICAgT2JqLnJlcHIgZm5cbiAgICB8IExhenkgLT5cbiAgICAgICBsZXQgcmVjIGwgPVxuICAgICAgICAgbGF6eSAoXG4gICAgICAgICAgIGxldCBsJyA9IE9iai5vYmogKE9iai5maWVsZCBtb2R1IGkpIGluXG4gICAgICAgICAgIGlmIGwgPT0gbCcgdGhlblxuICAgICAgICAgICAgIHJhaXNlIChVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSBsb2MpXG4gICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICBMYXp5LmZvcmNlIGwnKSBpblxuICAgICAgIE9iai5yZXByIGxcbiAgICB8IENsYXNzIC0+XG4gICAgICAgT2JqLnJlcHIgKENhbWxpbnRlcm5hbE9PLmR1bW15X2NsYXNzIGxvYylcbiAgICB8IE1vZHVsZSBjb21wcyAtPlxuICAgICAgIE9iai5yZXByIChpbml0X21vZF9ibG9jayBsb2MgY29tcHMpXG4gICAgfCBWYWx1ZSB2IC0+IHZcbiAgaW5cbiAgT2JqLnNldF9maWVsZCBtb2R1IGkgaW5pdFxuXG5hbmQgaW5pdF9tb2RfYmxvY2sgbG9jIGNvbXBzID1cbiAgbGV0IGxlbmd0aCA9IEFycmF5Lmxlbmd0aCBjb21wcyBpblxuICBsZXQgbW9kdSA9IE9iai5uZXdfYmxvY2sgMCBsZW5ndGggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCAtIDEgZG9cbiAgICBpbml0X21vZF9maWVsZCBtb2R1IGkgbG9jIGNvbXBzLihpKVxuICBkb25lO1xuICBtb2R1XG5cbmxldCBpbml0X21vZCBsb2Mgc2hhcGUgPVxuICBtYXRjaCBzaGFwZSB3aXRoXG4gIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgIE9iai5yZXByIChpbml0X21vZF9ibG9jayBsb2MgY29tcHMpXG4gIHwgXyAtPiBmYWlsd2l0aCBcIkNhbWxpbnRlcm5hbE1vZC5pbml0X21vZDogbm90IGEgbW9kdWxlXCJcblxubGV0IHJlYyB1cGRhdGVfbW9kX2ZpZWxkIG1vZHUgaSBzaGFwZSBuID1cbiAgbWF0Y2ggc2hhcGUgd2l0aFxuICB8IEZ1bmN0aW9uIHwgTGF6eSAtPlxuICAgICBPYmouc2V0X2ZpZWxkIG1vZHUgaSBuXG4gIHwgVmFsdWUgXyAtPlxuICAgICAoKSAoKiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGVyZSAqKVxuICB8IENsYXNzIC0+XG4gICAgIGFzc2VydCAoT2JqLnRhZyBuID0gMCAmJiBPYmouc2l6ZSBuID0gNCk7XG4gICAgIGxldCBjbCA9IE9iai5maWVsZCBtb2R1IGkgaW5cbiAgICAgZm9yIGogPSAwIHRvIDMgZG9cbiAgICAgICBPYmouc2V0X2ZpZWxkIGNsIGogKE9iai5maWVsZCBuIGopXG4gICAgIGRvbmVcbiAgfCBNb2R1bGUgY29tcHMgLT5cbiAgICAgdXBkYXRlX21vZF9ibG9jayBjb21wcyAoT2JqLmZpZWxkIG1vZHUgaSkgblxuXG5hbmQgdXBkYXRlX21vZF9ibG9jayBjb21wcyBvIG4gPVxuICBhc3NlcnQgKE9iai50YWcgbiA9IDAgJiYgT2JqLnNpemUgbiA+PSBBcnJheS5sZW5ndGggY29tcHMpO1xuICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGNvbXBzIC0gMSBkb1xuICAgIHVwZGF0ZV9tb2RfZmllbGQgbyBpIGNvbXBzLihpKSAoT2JqLmZpZWxkIG4gaSlcbiAgZG9uZVxuXG5sZXQgdXBkYXRlX21vZCBzaGFwZSBvIG4gPVxuICBtYXRjaCBzaGFwZSB3aXRoXG4gIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgIHVwZGF0ZV9tb2RfYmxvY2sgY29tcHMgbyBuXG4gIHwgXyAtPiBmYWlsd2l0aCBcIkNhbWxpbnRlcm5hbE1vZC51cGRhdGVfbW9kOiBub3QgYSBtb2R1bGVcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zXCJdICgqIGlnbm9yZSBkZXByZWNhdGlvbiB3YXJuaW5nIGFib3V0IG1vZHVsZSBTdHJlYW0gKilcblxudHlwZSB0b2tlbiA9XG4gICAgS3dkIG9mIHN0cmluZ1xuICB8IElkZW50IG9mIHN0cmluZ1xuICB8IEludCBvZiBpbnRcbiAgfCBGbG9hdCBvZiBmbG9hdFxuICB8IFN0cmluZyBvZiBzdHJpbmdcbiAgfCBDaGFyIG9mIGNoYXJcblxuKCogVGhlIHN0cmluZyBidWZmZXJpbmcgbWFjaGluZXJ5ICopXG5cbmxldCBpbml0aWFsX2J1ZmZlciA9IEJ5dGVzLmNyZWF0ZSAzMlxuXG5sZXQgYnVmZmVyID0gcmVmIGluaXRpYWxfYnVmZmVyXG5sZXQgYnVmcG9zID0gcmVmIDBcblxubGV0IHJlc2V0X2J1ZmZlciAoKSA9IGJ1ZmZlciA6PSBpbml0aWFsX2J1ZmZlcjsgYnVmcG9zIDo9IDBcblxubGV0IHN0b3JlIGMgPVxuICBpZiAhYnVmcG9zID49IEJ5dGVzLmxlbmd0aCAhYnVmZmVyIHRoZW4gYmVnaW5cbiAgICBsZXQgbmV3YnVmZmVyID0gQnl0ZXMuY3JlYXRlICgyICogIWJ1ZnBvcykgaW5cbiAgICBCeXRlcy5ibGl0ICFidWZmZXIgMCBuZXdidWZmZXIgMCAhYnVmcG9zO1xuICAgIGJ1ZmZlciA6PSBuZXdidWZmZXJcbiAgZW5kO1xuICBCeXRlcy5zZXQgIWJ1ZmZlciAhYnVmcG9zIGM7XG4gIGluY3IgYnVmcG9zXG5cbmxldCBnZXRfc3RyaW5nICgpID1cbiAgbGV0IHMgPSBCeXRlcy5zdWJfc3RyaW5nICFidWZmZXIgMCAhYnVmcG9zIGluIGJ1ZmZlciA6PSBpbml0aWFsX2J1ZmZlcjsgc1xuXG4oKiBUaGUgbGV4ZXIgKilcblxubGV0IG1ha2VfbGV4ZXIga2V5d29yZHMgPVxuICBsZXQga3dkX3RhYmxlID0gSGFzaHRibC5jcmVhdGUgMTcgaW5cbiAgTGlzdC5pdGVyIChmdW4gcyAtPiBIYXNodGJsLmFkZCBrd2RfdGFibGUgcyAoS3dkIHMpKSBrZXl3b3JkcztcbiAgbGV0IGlkZW50X29yX2tleXdvcmQgaWQgPVxuICAgIHRyeSBIYXNodGJsLmZpbmQga3dkX3RhYmxlIGlkIHdpdGhcbiAgICAgIE5vdF9mb3VuZCAtPiBJZGVudCBpZFxuICBhbmQga2V5d29yZF9vcl9lcnJvciBjID1cbiAgICBsZXQgcyA9IFN0cmluZy5tYWtlIDEgYyBpblxuICAgIHRyeSBIYXNodGJsLmZpbmQga3dkX3RhYmxlIHMgd2l0aFxuICAgICAgTm90X2ZvdW5kIC0+IHJhaXNlIChTdHJlYW0uRXJyb3IgKFwiSWxsZWdhbCBjaGFyYWN0ZXIgXCIgXiBzKSlcbiAgaW5cbiAgbGV0IHJlYyBuZXh0X3Rva2VuIChzdHJtX18gOiBfIFN0cmVhbS50KSA9XG4gICAgbWF0Y2ggU3RyZWFtLnBlZWsgc3RybV9fIHdpdGhcbiAgICAgIFNvbWUgKCcgJyB8ICdcXDAxMCcgfCAnXFwwMTMnIHwgJ1xcMDA5JyB8ICdcXDAyNicgfCAnXFwwMTInKSAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187IG5leHRfdG9rZW4gc3RybV9fXG4gICAgfCBTb21lICgnQScuLidaJyB8ICdhJy4uJ3onIHwgJ18nIHwgJ1xcMTkyJy4uJ1xcMjU1JyBhcyBjKSAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGxldCBzID0gc3RybV9fIGluIHJlc2V0X2J1ZmZlciAoKTsgc3RvcmUgYzsgaWRlbnQgc1xuICAgIHwgU29tZVxuICAgICAgICAoJyEnIHwgJyUnIHwgJyYnIHwgJyQnIHwgJyMnIHwgJysnIHwgJy8nIHwgJzonIHwgJzwnIHwgJz0nIHwgJz4nIHxcbiAgICAgICAgICc/JyB8ICdAJyB8ICdcXFxcJyB8ICd+JyB8ICdeJyB8ICd8JyB8ICcqJyBhcyBjKSAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGxldCBzID0gc3RybV9fIGluIHJlc2V0X2J1ZmZlciAoKTsgc3RvcmUgYzsgaWRlbnQyIHNcbiAgICB8IFNvbWUgKCcwJy4uJzknIGFzIGMpIC0+XG4gICAgICAgIFN0cmVhbS5qdW5rIHN0cm1fXztcbiAgICAgICAgbGV0IHMgPSBzdHJtX18gaW4gcmVzZXRfYnVmZmVyICgpOyBzdG9yZSBjOyBudW1iZXIgc1xuICAgIHwgU29tZSAnXFwnJyAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGxldCBjID1cbiAgICAgICAgICB0cnkgY2hhciBzdHJtX18gd2l0aFxuICAgICAgICAgICAgU3RyZWFtLkZhaWx1cmUgLT4gcmFpc2UgKFN0cmVhbS5FcnJvciBcIlwiKVxuICAgICAgICBpblxuICAgICAgICBiZWdpbiBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgICAgIFNvbWUgJ1xcJycgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBTb21lIChDaGFyIGMpXG4gICAgICAgIHwgXyAtPiByYWlzZSAoU3RyZWFtLkVycm9yIFwiXCIpXG4gICAgICAgIGVuZFxuICAgIHwgU29tZSAnXFxcIicgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fO1xuICAgICAgICBsZXQgcyA9IHN0cm1fXyBpbiByZXNldF9idWZmZXIgKCk7IFNvbWUgKFN0cmluZyAoc3RyaW5nIHMpKVxuICAgIHwgU29tZSAnLScgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBuZWdfbnVtYmVyIHN0cm1fX1xuICAgIHwgU29tZSAnKCcgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBtYXliZV9jb21tZW50IHN0cm1fX1xuICAgIHwgU29tZSBjIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgU29tZSAoa2V5d29yZF9vcl9lcnJvciBjKVxuICAgIHwgXyAtPiBOb25lXG4gIGFuZCBpZGVudCAoc3RybV9fIDogXyBTdHJlYW0udCkgPVxuICAgIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICBTb21lXG4gICAgICAgICgnQScuLidaJyB8ICdhJy4uJ3onIHwgJ1xcMTkyJy4uJ1xcMjU1JyB8ICcwJy4uJzknIHwgJ18nIHwgJ1xcJycgYXMgYykgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSBjOyBpZGVudCBzXG4gICAgfCBfIC0+IFNvbWUgKGlkZW50X29yX2tleXdvcmQgKGdldF9zdHJpbmcgKCkpKVxuICBhbmQgaWRlbnQyIChzdHJtX18gOiBfIFN0cmVhbS50KSA9XG4gICAgbWF0Y2ggU3RyZWFtLnBlZWsgc3RybV9fIHdpdGhcbiAgICAgIFNvbWVcbiAgICAgICAgKCchJyB8ICclJyB8ICcmJyB8ICckJyB8ICcjJyB8ICcrJyB8ICctJyB8ICcvJyB8ICc6JyB8ICc8JyB8ICc9JyB8XG4gICAgICAgICAnPicgfCAnPycgfCAnQCcgfCAnXFxcXCcgfCAnficgfCAnXicgfCAnfCcgfCAnKicgYXMgYykgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSBjOyBpZGVudDIgc1xuICAgIHwgXyAtPiBTb21lIChpZGVudF9vcl9rZXl3b3JkIChnZXRfc3RyaW5nICgpKSlcbiAgYW5kIG5lZ19udW1iZXIgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAoJzAnLi4nOScgYXMgYykgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fO1xuICAgICAgICBsZXQgcyA9IHN0cm1fXyBpbiByZXNldF9idWZmZXIgKCk7IHN0b3JlICctJzsgc3RvcmUgYzsgbnVtYmVyIHNcbiAgICB8IF8gLT4gbGV0IHMgPSBzdHJtX18gaW4gcmVzZXRfYnVmZmVyICgpOyBzdG9yZSAnLSc7IGlkZW50MiBzXG4gIGFuZCBudW1iZXIgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAoJzAnLi4nOScgYXMgYykgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSBjOyBudW1iZXIgc1xuICAgIHwgU29tZSAnLicgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSAnLic7IGRlY2ltYWxfcGFydCBzXG4gICAgfCBTb21lICgnZScgfCAnRScpIC0+XG4gICAgICAgIFN0cmVhbS5qdW5rIHN0cm1fXzsgbGV0IHMgPSBzdHJtX18gaW4gc3RvcmUgJ0UnOyBleHBvbmVudF9wYXJ0IHNcbiAgICB8IF8gLT4gU29tZSAoSW50IChpbnRfb2Zfc3RyaW5nIChnZXRfc3RyaW5nICgpKSkpXG4gIGFuZCBkZWNpbWFsX3BhcnQgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAoJzAnLi4nOScgYXMgYykgLT5cbiAgICAgICAgU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSBjOyBkZWNpbWFsX3BhcnQgc1xuICAgIHwgU29tZSAoJ2UnIHwgJ0UnKSAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187IGxldCBzID0gc3RybV9fIGluIHN0b3JlICdFJzsgZXhwb25lbnRfcGFydCBzXG4gICAgfCBfIC0+IFNvbWUgKEZsb2F0IChmbG9hdF9vZl9zdHJpbmcgKGdldF9zdHJpbmcgKCkpKSlcbiAgYW5kIGV4cG9uZW50X3BhcnQgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAoJysnIHwgJy0nIGFzIGMpIC0+XG4gICAgICAgIFN0cmVhbS5qdW5rIHN0cm1fXzsgbGV0IHMgPSBzdHJtX18gaW4gc3RvcmUgYzsgZW5kX2V4cG9uZW50X3BhcnQgc1xuICAgIHwgXyAtPiBlbmRfZXhwb25lbnRfcGFydCBzdHJtX19cbiAgYW5kIGVuZF9leHBvbmVudF9wYXJ0IChzdHJtX18gOiBfIFN0cmVhbS50KSA9XG4gICAgbWF0Y2ggU3RyZWFtLnBlZWsgc3RybV9fIHdpdGhcbiAgICAgIFNvbWUgKCcwJy4uJzknIGFzIGMpIC0+XG4gICAgICAgIFN0cmVhbS5qdW5rIHN0cm1fXzsgbGV0IHMgPSBzdHJtX18gaW4gc3RvcmUgYzsgZW5kX2V4cG9uZW50X3BhcnQgc1xuICAgIHwgXyAtPiBTb21lIChGbG9hdCAoZmxvYXRfb2Zfc3RyaW5nIChnZXRfc3RyaW5nICgpKSkpXG4gIGFuZCBzdHJpbmcgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAnXFxcIicgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBnZXRfc3RyaW5nICgpXG4gICAgfCBTb21lICdcXFxcJyAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGxldCBjID1cbiAgICAgICAgICB0cnkgZXNjYXBlIHN0cm1fXyB3aXRoXG4gICAgICAgICAgICBTdHJlYW0uRmFpbHVyZSAtPiByYWlzZSAoU3RyZWFtLkVycm9yIFwiXCIpXG4gICAgICAgIGluXG4gICAgICAgIGxldCBzID0gc3RybV9fIGluIHN0b3JlIGM7IHN0cmluZyBzXG4gICAgfCBTb21lIGMgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBsZXQgcyA9IHN0cm1fXyBpbiBzdG9yZSBjOyBzdHJpbmcgc1xuICAgIHwgXyAtPiByYWlzZSBTdHJlYW0uRmFpbHVyZVxuICBhbmQgY2hhciAoc3RybV9fIDogXyBTdHJlYW0udCkgPVxuICAgIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICBTb21lICdcXFxcJyAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGJlZ2luIHRyeSBlc2NhcGUgc3RybV9fIHdpdGhcbiAgICAgICAgICBTdHJlYW0uRmFpbHVyZSAtPiByYWlzZSAoU3RyZWFtLkVycm9yIFwiXCIpXG4gICAgICAgIGVuZFxuICAgIHwgU29tZSBjIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgY1xuICAgIHwgXyAtPiByYWlzZSBTdHJlYW0uRmFpbHVyZVxuICBhbmQgZXNjYXBlIChzdHJtX18gOiBfIFN0cmVhbS50KSA9XG4gICAgbWF0Y2ggU3RyZWFtLnBlZWsgc3RybV9fIHdpdGhcbiAgICAgIFNvbWUgJ24nIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgJ1xcbidcbiAgICB8IFNvbWUgJ3InIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgJ1xccidcbiAgICB8IFNvbWUgJ3QnIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgJ1xcdCdcbiAgICB8IFNvbWUgKCcwJy4uJzknIGFzIGMxKSAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgIGJlZ2luIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICAgICAgU29tZSAoJzAnLi4nOScgYXMgYzIpIC0+XG4gICAgICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgICAgICAgICBTb21lICgnMCcuLic5JyBhcyBjMykgLT5cbiAgICAgICAgICAgICAgICBTdHJlYW0uanVuayBzdHJtX187XG4gICAgICAgICAgICAgICAgQ2hhci5jaHJcbiAgICAgICAgICAgICAgICAgICgoQ2hhci5jb2RlIGMxIC0gNDgpICogMTAwICsgKENoYXIuY29kZSBjMiAtIDQ4KSAqIDEwICtcbiAgICAgICAgICAgICAgICAgICAgIChDaGFyLmNvZGUgYzMgLSA0OCkpXG4gICAgICAgICAgICB8IF8gLT4gcmFpc2UgKFN0cmVhbS5FcnJvciBcIlwiKVxuICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgXyAtPiByYWlzZSAoU3RyZWFtLkVycm9yIFwiXCIpXG4gICAgICAgIGVuZFxuICAgIHwgU29tZSBjIC0+IFN0cmVhbS5qdW5rIHN0cm1fXzsgY1xuICAgIHwgXyAtPiByYWlzZSBTdHJlYW0uRmFpbHVyZVxuICBhbmQgbWF5YmVfY29tbWVudCAoc3RybV9fIDogXyBTdHJlYW0udCkgPVxuICAgIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICBTb21lICcqJyAtPlxuICAgICAgICBTdHJlYW0uanVuayBzdHJtX187IGxldCBzID0gc3RybV9fIGluIGNvbW1lbnQgczsgbmV4dF90b2tlbiBzXG4gICAgfCBfIC0+IFNvbWUgKGtleXdvcmRfb3JfZXJyb3IgJygnKVxuICBhbmQgY29tbWVudCAoc3RybV9fIDogXyBTdHJlYW0udCkgPVxuICAgIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICBTb21lICcoJyAtPiBTdHJlYW0uanVuayBzdHJtX187IG1heWJlX25lc3RlZF9jb21tZW50IHN0cm1fX1xuICAgIHwgU29tZSAnKicgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBtYXliZV9lbmRfY29tbWVudCBzdHJtX19cbiAgICB8IFNvbWUgXyAtPiBTdHJlYW0uanVuayBzdHJtX187IGNvbW1lbnQgc3RybV9fXG4gICAgfCBfIC0+IHJhaXNlIFN0cmVhbS5GYWlsdXJlXG4gIGFuZCBtYXliZV9uZXN0ZWRfY29tbWVudCAoc3RybV9fIDogXyBTdHJlYW0udCkgPVxuICAgIG1hdGNoIFN0cmVhbS5wZWVrIHN0cm1fXyB3aXRoXG4gICAgICBTb21lICcqJyAtPiBTdHJlYW0uanVuayBzdHJtX187IGxldCBzID0gc3RybV9fIGluIGNvbW1lbnQgczsgY29tbWVudCBzXG4gICAgfCBTb21lIF8gLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBjb21tZW50IHN0cm1fX1xuICAgIHwgXyAtPiByYWlzZSBTdHJlYW0uRmFpbHVyZVxuICBhbmQgbWF5YmVfZW5kX2NvbW1lbnQgKHN0cm1fXyA6IF8gU3RyZWFtLnQpID1cbiAgICBtYXRjaCBTdHJlYW0ucGVlayBzdHJtX18gd2l0aFxuICAgICAgU29tZSAnKScgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyAoKVxuICAgIHwgU29tZSAnKicgLT4gU3RyZWFtLmp1bmsgc3RybV9fOyBtYXliZV9lbmRfY29tbWVudCBzdHJtX19cbiAgICB8IFNvbWUgXyAtPiBTdHJlYW0uanVuayBzdHJtX187IGNvbW1lbnQgc3RybV9fXG4gICAgfCBfIC0+IHJhaXNlIFN0cmVhbS5GYWlsdXJlXG4gIGluXG4gIGZ1biBpbnB1dCAtPiBTdHJlYW0uZnJvbSAoZnVuIF9jb3VudCAtPiBuZXh0X3Rva2VuIGlucHV0KVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuXG5tb2R1bGUgdHlwZSBTZWVkZWRTID0gc2lnXG5cbiAgdHlwZSBrZXlcbiAgdHlwZSAhJ2EgdFxuICB2YWwgY3JlYXRlIDogP3JhbmRvbSAoKnRod2FydCB0b29scy9zeW5jX3N0ZGxpYl9kb2NzKikgOiBib29sIC0+IGludCAtPiAnYSB0XG4gIHZhbCBjbGVhciA6ICdhIHQgLT4gdW5pdFxuICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgdmFsIGFkZCA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICB2YWwgZmluZF9vcHQgOiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIFtAQGFsZXJ0IG9sZF9lcGhlbWVyb25fYXBpIFwiVGhpcyBmdW5jdGlvbiB3b24ndCBiZSBhdmFpbGFibGUgaW4gNS4wXCJdXG4gIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2UgOiAoa2V5IC0+ICdhIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiB1bml0XG4gICAgW0BAYWxlcnQgb2xkX2VwaGVtZXJvbl9hcGkgXCJUaGlzIGZ1bmN0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSBpbiA1LjBcIl1cbiAgdmFsIGZvbGQgOiAoa2V5IC0+ICdhIC0+ICdiIC0+ICdiKSAtPiAnYSB0IC0+ICdiIC0+ICdiXG4gICAgW0BAYWxlcnQgb2xkX2VwaGVtZXJvbl9hcGkgXCJUaGlzIGZ1bmN0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSBpbiA1LjBcIl1cbiAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gIHZhbCBzdGF0cyA6ICdhIHQgLT4gSGFzaHRibC5zdGF0aXN0aWNzXG4gIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICBbQEBhbGVydCBvbGRfZXBoZW1lcm9uX2FwaSBcIlRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgYXZhaWxhYmxlIGluIDUuMFwiXVxuICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgW0BAYWxlcnQgb2xkX2VwaGVtZXJvbl9hcGkgXCJUaGlzIGZ1bmN0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSBpbiA1LjBcIl1cbiAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgW0BAYWxlcnQgb2xkX2VwaGVtZXJvbl9hcGkgXCJUaGlzIGZ1bmN0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSBpbiA1LjBcIl1cbiAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIHZhbCBjbGVhbjogJ2EgdCAtPiB1bml0XG4gIHZhbCBzdGF0c19hbGl2ZTogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgICAoKiogc2FtZSBhcyB7IXN0YXRzfSBidXQgb25seSBjb3VudCB0aGUgYWxpdmUgYmluZGluZ3MgKilcbmVuZFxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG5cbiAgdHlwZSBrZXlcbiAgdHlwZSAhJ2EgdFxuICB2YWwgY3JlYXRlIDogaW50IC0+ICdhIHRcbiAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gIHZhbCByZXNldCA6ICdhIHQgLT4gdW5pdFxuICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiBrZXkgLT4gdW5pdFxuICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gIHZhbCBmaW5kX29wdCA6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICB2YWwgZmluZF9hbGwgOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICB2YWwgaXRlciA6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgW0BAYWxlcnQgb2xkX2VwaGVtZXJvbl9hcGkgXCJUaGlzIGZ1bmN0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSBpbiA1LjBcIl1cbiAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZSA6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICBbQEBhbGVydCBvbGRfZXBoZW1lcm9uX2FwaSBcIlRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgYXZhaWxhYmxlIGluIDUuMFwiXVxuICB2YWwgZm9sZCA6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICBbQEBhbGVydCBvbGRfZXBoZW1lcm9uX2FwaSBcIlRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgYXZhaWxhYmxlIGluIDUuMFwiXVxuICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgdmFsIHN0YXRzIDogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgdmFsIHRvX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIFtAQGFsZXJ0IG9sZF9lcGhlbWVyb25fYXBpIFwiVGhpcyBmdW5jdGlvbiB3b24ndCBiZSBhdmFpbGFibGUgaW4gNS4wXCJdXG4gIHZhbCB0b19zZXFfa2V5cyA6IF8gdCAtPiBrZXkgU2VxLnRcbiAgICBbQEBhbGVydCBvbGRfZXBoZW1lcm9uX2FwaSBcIlRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgYXZhaWxhYmxlIGluIDUuMFwiXVxuICB2YWwgdG9fc2VxX3ZhbHVlcyA6ICdhIHQgLT4gJ2EgU2VxLnRcbiAgICBbQEBhbGVydCBvbGRfZXBoZW1lcm9uX2FwaSBcIlRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgYXZhaWxhYmxlIGluIDUuMFwiXVxuICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgdmFsIGNsZWFuOiAnYSB0IC0+IHVuaXRcbiAgdmFsIHN0YXRzX2FsaXZlOiAnYSB0IC0+IEhhc2h0Ymwuc3RhdGlzdGljc1xuICAgICgqKiBzYW1lIGFzIHshc3RhdHN9IGJ1dCBvbmx5IGNvdW50IHRoZSBhbGl2ZSBiaW5kaW5ncyAqKVxuZW5kXG5cbm1vZHVsZSBHZW5IYXNoVGFibGUgPSBzdHJ1Y3RcblxuICB0eXBlIGVxdWFsID1cbiAgfCBFVHJ1ZSB8IEVGYWxzZVxuICB8IEVEZWFkICgqKiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgcmVjbGFpbWVkIHRoZSBkYXRhICopXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWQoSDogc2lnXG4gICAgdHlwZSB0XG4gICAgdHlwZSAnYSBjb250YWluZXJcbiAgICB2YWwgY3JlYXRlOiB0IC0+ICdhIC0+ICdhIGNvbnRhaW5lclxuICAgIHZhbCBoYXNoOiBpbnQgLT4gdCAtPiBpbnRcbiAgICB2YWwgZXF1YWw6ICdhIGNvbnRhaW5lciAtPiB0IC0+IGVxdWFsXG4gICAgdmFsIGdldF9kYXRhOiAnYSBjb250YWluZXIgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGdldF9rZXk6ICdhIGNvbnRhaW5lciAtPiB0IG9wdGlvblxuICAgIHZhbCBzZXRfa2V5X2RhdGE6ICdhIGNvbnRhaW5lciAtPiB0IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgY2hlY2tfa2V5OiAnYSBjb250YWluZXIgLT4gYm9vbFxuICBlbmQpIDogU2VlZGVkUyB3aXRoIHR5cGUga2V5ID0gSC50XG4gID0gc3RydWN0XG5cbiAgICB0eXBlICdhIHQgPVxuICAgICAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgICAgICBtdXRhYmxlIGRhdGE6ICdhIGJ1Y2tldGxpc3QgYXJyYXk7ICAoKiB0aGUgYnVja2V0cyAqKVxuICAgICAgICBzZWVkOiBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBmb3IgcmFuZG9taXphdGlvbiAqKVxuICAgICAgICBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgICAoKiBpbml0aWFsIGFycmF5IHNpemUgKilcbiAgICAgIH1cblxuICAgIGFuZCAnYSBidWNrZXRsaXN0ID1cbiAgICB8IEVtcHR5XG4gICAgfCBDb25zIG9mIGludCAoKiBoYXNoIG9mIHRoZSBrZXkgKikgKiAnYSBILmNvbnRhaW5lciAqICdhIGJ1Y2tldGxpc3RcblxuICAgICgqKiB0aGUgaGFzaCBvZiB0aGUga2V5IGlzIGtlcHQgaW4gb3JkZXIgdG8gdGVzdCB0aGUgZXF1YWxpdHkgb2YgdGhlIGhhc2hcbiAgICAgIGJlZm9yZSB0aGUga2V5LiBTYW1lIHJlYXNvbiBhcyBmb3IgV2Vhay5NYWtlICopXG5cbiAgICB0eXBlIGtleSA9IEgudFxuXG4gICAgbGV0IHJlYyBwb3dlcl8yX2Fib3ZlIHggbiA9XG4gICAgICBpZiB4ID49IG4gdGhlbiB4XG4gICAgICBlbHNlIGlmIHggKiAyID4gU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiB4XG4gICAgICBlbHNlIHBvd2VyXzJfYWJvdmUgKHggKiAyKSBuXG5cbiAgICBsZXQgcHJuZyA9IGxhenkgKFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdCgpKVxuXG4gICAgbGV0IGNyZWF0ZSA/KHJhbmRvbSA9IChIYXNodGJsLmlzX3JhbmRvbWl6ZWQgKCkpKSBpbml0aWFsX3NpemUgPVxuICAgICAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IGluaXRpYWxfc2l6ZSBpblxuICAgICAgbGV0IHNlZWQgPSBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoTGF6eS5mb3JjZSBwcm5nKSBlbHNlIDAgaW5cbiAgICAgIHsgaW5pdGlhbF9zaXplID0gczsgc2l6ZSA9IDA7IHNlZWQgPSBzZWVkOyBkYXRhID0gQXJyYXkubWFrZSBzIEVtcHR5IH1cblxuICAgIGxldCBjbGVhciBoID1cbiAgICAgIGguc2l6ZSA8LSAwO1xuICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgIGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIGRvbmVcblxuICAgIGxldCByZXNldCBoID1cbiAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggaC5kYXRhIGluXG4gICAgICBpZiBsZW4gPSBoLmluaXRpYWxfc2l6ZSB0aGVuXG4gICAgICAgIGNsZWFyIGhcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgaC5zaXplIDwtIDA7XG4gICAgICAgIGguZGF0YSA8LSBBcnJheS5tYWtlIGguaW5pdGlhbF9zaXplIEVtcHR5XG4gICAgICBlbmRcblxuICAgIGxldCBjb3B5IGggPSB7IGggd2l0aCBkYXRhID0gQXJyYXkuY29weSBoLmRhdGEgfVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGhrZXkgPVxuICAgICAgaGtleSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBjbGVhbiBoID1cbiAgICAgIGxldCByZWMgZG9fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICAgRW1wdHlcbiAgICAgICAgfCBDb25zKF8sIGMsIHJlc3QpIHdoZW4gbm90IChILmNoZWNrX2tleSBjKSAtPlxuICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICBkb19idWNrZXQgcmVzdFxuICAgICAgICB8IENvbnMoaGtleSwgYywgcmVzdCkgLT5cbiAgICAgICAgICAgIENvbnMoaGtleSwgYywgZG9fYnVja2V0IHJlc3QpXG4gICAgICBpblxuICAgICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZCAtIDEgZG9cbiAgICAgICAgZC4oaSkgPC0gZG9fYnVja2V0IGQuKGkpXG4gICAgICBkb25lXG5cbiAgICAoKiogcmVzaXplIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRvIGRvIHRoZSBhY3R1YWwgY2xlYW5pbmcgb2YgZGVhZCBrZXlzXG4gICAgICAgIChyZW1vdmUgZG9lcyBpdCBqdXN0IGJlY2F1c2UgaXQgY291bGQpLlxuXG4gICAgICAgIFRoZSBnb2FsIGlzIHRvOlxuXG4gICAgICAgIC0gbm90IHJlc2l6ZSBpbmZpbml0ZWx5IHdoZW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgYWxpdmUga2V5cyBpc1xuICAgICAgICBib3VuZGVkIGJ1dCBrZXlzIGFyZSBjb250aW51b3VzbHkgYWRkZWQuIFRoYXQgd291bGQgaGFwcGVuIGlmXG4gICAgICAgIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJlc2l6ZS5cbiAgICAgICAgLSBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGVhY2ggYWRkaXRpb24sIHRoYXQgd291bGQgaGFwcGVuIGlmIHRoaXNcbiAgICAgICAgZnVuY3Rpb24gZG9uJ3QgcmVzaXplIGV2ZW4gd2hlbiBvbmx5IG9uZSBrZXkgaXMgZGVhZC5cblxuICAgICAgICBTbyB0aGUgYWxnb3JpdGhtOlxuICAgICAgICAtIGNsZWFuIHRoZSBrZXlzIGJlZm9yZSByZXNpemluZ1xuICAgICAgICAtIGlmIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGtleXMgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIHNpemUgb2YgdGhlXG4gICAgICAgIGFycmF5LCBkb24ndCByZXNpemUuXG4gICAgICAgIC0gaWYgaXQgaXMgbW9yZSwgcmVzaXplLlxuXG4gICAgICAgIFRoZSBzZWNvbmQgcHJvYmxlbSByZW1haW5zIGlmIHRoZSB0YWJsZSByZWFjaGVzIHshU3lzLm1heF9hcnJheV9sZW5ndGh9LlxuXG4gICAgKilcbiAgICBsZXQgcmVzaXplIGggPVxuICAgICAgbGV0IG9kYXRhID0gaC5kYXRhIGluXG4gICAgICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgICAgIGxldCBuc2l6ZSA9IG9zaXplICogMiBpblxuICAgICAgY2xlYW4gaDtcbiAgICAgIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggJiYgaC5zaXplID49IG9zaXplIGxzciAxIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IG5kYXRhID0gQXJyYXkubWFrZSBuc2l6ZSBFbXB0eSBpblxuICAgICAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICgqIHNvIHRoYXQga2V5X2luZGV4IHNlZXMgdGhlIG5ldyBidWNrZXQgY291bnQgKilcbiAgICAgICAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIEVtcHR5IC0+ICgpXG4gICAgICAgICAgfCBDb25zKGhrZXksIGRhdGEsIHJlc3QpIC0+XG4gICAgICAgICAgICAgIGluc2VydF9idWNrZXQgcmVzdDsgKCogcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgb2YgZWxlbWVudHMgKilcbiAgICAgICAgICAgICAgbGV0IG5pZHggPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICAgICAgICAgIG5kYXRhLihuaWR4KSA8LSBDb25zKGhrZXksIGRhdGEsIG5kYXRhLihuaWR4KSkgaW5cbiAgICAgICAgZm9yIGkgPSAwIHRvIG9zaXplIC0gMSBkb1xuICAgICAgICAgIGluc2VydF9idWNrZXQgb2RhdGEuKGkpXG4gICAgICAgIGRvbmVcbiAgICAgIGVuZFxuXG4gICAgbGV0IGFkZCBoIGtleSBpbmZvID1cbiAgICAgIGxldCBoa2V5ID0gSC5oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGggaGtleSBpblxuICAgICAgbGV0IGNvbnRhaW5lciA9IEguY3JlYXRlIGtleSBpbmZvIGluXG4gICAgICBsZXQgYnVja2V0ID0gQ29ucyhoa2V5LCBjb250YWluZXIsIGguZGF0YS4oaSkpIGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBoXG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgcmVtb3ZlX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICAgICAgfCBDb25zKGhrLCBjLCBuZXh0KSB3aGVuIGhrZXkgPSBoayAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgICB8IEVUcnVlIC0+IGguc2l6ZSA8LSBoLnNpemUgLSAxOyBuZXh0XG4gICAgICAgICAgICB8IEVGYWxzZSAtPiBDb25zKGhrLCBjLCByZW1vdmVfYnVja2V0IG5leHQpXG4gICAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgICAgKCogVGhlIGRlYWQga2V5IGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC4gSXQgaXMgYWNjZXB0YWJsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiBzaW5jZSBpdCBhbHJlYWR5IHJlbW92ZXMgYSBiaW5kaW5nICopXG4gICAgICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX2J1Y2tldCBuZXh0XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfCBDb25zKGhrLGMsbmV4dCkgLT4gQ29ucyhoaywgYywgcmVtb3ZlX2J1Y2tldCBuZXh0KSBpblxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIHJlbW92ZV9idWNrZXQgaC5kYXRhLihpKVxuXG4gICAgKCoqIHshZmluZH0gZG9uJ3QgcmVtb3ZlIGRlYWQga2V5cyBiZWNhdXNlIGl0IHdvdWxkIGJlIHN1cnByaXNpbmcgZm9yXG4gICAgICAgIHRoZSB1c2VyIHRoYXQgYSByZWFkLW9ubHkgZnVuY3Rpb24gbXV0YXRlcyB0aGUgc3RhdGUgKGVnLiBjb25jdXJyZW50XG4gICAgICAgIGFjY2VzcykuIFNhbWUgZm9yIHshaXRlcn0sIHshZm9sZH0sIHshbWVtfS5cbiAgICAqKVxuICAgIGxldCByZWMgZmluZF9yZWMga2V5IGhrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrZXkgPSBoayAgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+XG4gICAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZ2V0X2RhdGEgYyB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgKCogVGhpcyBjYXNlIGlzIG5vdCBpbXBvc3NpYmxlIGJlY2F1c2UgdGhlIGdjIGNhbiBydW4gYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgIEguZXF1YWwgYW5kIEguZ2V0X2RhdGEgKilcbiAgICAgICAgICAgICAgICAgIGZpbmRfcmVjIGtleSBoa2V5IHJlc3RcbiAgICAgICAgICAgICAgfCBTb21lIGQgLT4gZFxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICB8IEVGYWxzZSAtPiBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG4gICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG5cbiAgICBsZXQgZmluZCBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICAoKiBUT0RPIGlubGluZSAzIGl0ZXJhdGlvbnMgKilcbiAgICAgIGZpbmRfcmVjIGtleSBoa2V5IChoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5IGhrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgd2hlbiBoa2V5ID0gaGsgIC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPlxuICAgICAgICAgICAgICBiZWdpbiBtYXRjaCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICgqIFRoaXMgY2FzZSBpcyBub3QgaW1wb3NzaWJsZSBiZWNhdXNlIHRoZSBnYyBjYW4gcnVuIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgICAgICBILmVxdWFsIGFuZCBILmdldF9kYXRhICopXG4gICAgICAgICAgICAgICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuICAgICAgICAgICAgICB8IFNvbWUgXyBhcyBkIC0+IGRcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgfCBFRmFsc2UgLT4gZmluZF9yZWNfb3B0IGtleSBoa2V5IHJlc3RcbiAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgIGZpbmRfcmVjX29wdCBrZXkgaGtleSByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgICgqIFRPRE8gaW5saW5lIDMgaXRlcmF0aW9ucyAqKVxuICAgICAgZmluZF9yZWNfb3B0IGtleSBoa2V5IChoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpKVxuXG4gICAgbGV0IGZpbmRfYWxsIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgZmluZF9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBbXVxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrZXkgPSBoayAgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+IGJlZ2luIG1hdGNoIEguZ2V0X2RhdGEgYyB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgZmluZF9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgICAgICB8IFNvbWUgZCAtPiBkOjpmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB8IEVGYWxzZSAtPiBmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICBmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX2luX2J1Y2tldCByZXN0IGluXG4gICAgICBmaW5kX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpXG5cblxuICAgIGxldCByZXBsYWNlIGgga2V5IGluZm8gPVxuICAgICAgbGV0IGhrZXkgPSBILmhhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IHJlYyByZXBsYWNlX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIHwgQ29ucyhoaywgYywgbmV4dCkgd2hlbiBoa2V5ID0gaGsgLT5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgICAgfCBFVHJ1ZSAtPiBILnNldF9rZXlfZGF0YSBjIGtleSBpbmZvXG4gICAgICAgICAgICB8IEVGYWxzZSB8IEVEZWFkIC0+IHJlcGxhY2VfYnVja2V0IG5leHRcbiAgICAgICAgICAgIGVuZFxuICAgICAgICB8IENvbnMoXyxfLG5leHQpIC0+IHJlcGxhY2VfYnVja2V0IG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGhrZXkgaW5cbiAgICAgIGxldCBsID0gaC5kYXRhLihpKSBpblxuICAgICAgdHJ5XG4gICAgICAgIHJlcGxhY2VfYnVja2V0IGxcbiAgICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgIGxldCBjb250YWluZXIgPSBILmNyZWF0ZSBrZXkgaW5mbyBpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnMoaGtleSwgY29udGFpbmVyLCBsKTtcbiAgICAgICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUgaFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMoaGssIGMsIHJlc3QpIHdoZW4gaGsgPSBoa2V5IC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPiB0cnVlXG4gICAgICAgICAgfCBFRmFsc2UgfCBFRGVhZCAtPiBtZW1faW5fYnVja2V0IHJlc3RcbiAgICAgICAgICBlbmRcbiAgICAgIHwgQ29ucyhfaGssIF9jLCByZXN0KSAtPiBtZW1faW5fYnVja2V0IHJlc3QgaW5cbiAgICAgIG1lbV9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBoa2V5KVxuXG4gICAgbGV0IGl0ZXIgZiBoID1cbiAgICAgIGxldCByZWMgZG9fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICAgKClcbiAgICAgICAgfCBDb25zKF8sIGMsIHJlc3QpIC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBILmdldF9rZXkgYywgSC5nZXRfZGF0YSBjIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSwgXyB8IF8sIE5vbmUgLT4gKClcbiAgICAgICAgICAgIHwgU29tZSBrLCBTb21lIGQgLT4gZiBrIGRcbiAgICAgICAgICAgIGVuZDsgZG9fYnVja2V0IHJlc3QgaW5cbiAgICAgIGxldCBkID0gaC5kYXRhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICAgIGRvX2J1Y2tldCBkLihpKVxuICAgICAgZG9uZVxuXG4gICAgbGV0IGZvbGQgZiBoIGluaXQgPVxuICAgICAgbGV0IHJlYyBkb19idWNrZXQgYiBhY2N1ID1cbiAgICAgICAgbWF0Y2ggYiB3aXRoXG4gICAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAgIGFjY3VcbiAgICAgICAgfCBDb25zKF8sIGMsIHJlc3QpIC0+XG4gICAgICAgICAgICBsZXQgYWNjdSA9IGJlZ2luIG1hdGNoIEguZ2V0X2tleSBjLCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUsIF8gfCBfLCBOb25lIC0+IGFjY3VcbiAgICAgICAgICAgICAgfCBTb21lIGssIFNvbWUgZCAtPiBmIGsgZCBhY2N1XG4gICAgICAgICAgICBlbmQgaW5cbiAgICAgICAgICAgIGRvX2J1Y2tldCByZXN0IGFjY3UgIGluXG4gICAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgICAgbGV0IGFjY3UgPSByZWYgaW5pdCBpblxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkIC0gMSBkb1xuICAgICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgICAgZG9uZTtcbiAgICAgICFhY2N1XG5cbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gICAgICBsZXQgcmVjIGRvX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICAgIEVtcHR5XG4gICAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgLT5cbiAgICAgICAgICAgIG1hdGNoIEguZ2V0X2tleSBjLCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgfCBOb25lLCBfIHwgXywgTm9uZSAtPlxuICAgICAgICAgICAgICAgIGRvX2J1Y2tldCByZXN0XG4gICAgICAgICAgICB8IFNvbWUgaywgU29tZSBkIC0+XG4gICAgICAgICAgICAgICAgbWF0Y2ggZiBrIGQgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBkb19idWNrZXQgcmVzdFxuICAgICAgICAgICAgICAgIHwgU29tZSBuZXdfZCAtPlxuICAgICAgICAgICAgICAgICAgICBILnNldF9rZXlfZGF0YSBjIGsgbmV3X2Q7XG4gICAgICAgICAgICAgICAgICAgIENvbnMoaGssIGMsIGRvX2J1Y2tldCByZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBkID0gaC5kYXRhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICAgIGQuKGkpIDwtIGRvX2J1Y2tldCBkLihpKVxuICAgICAgZG9uZVxuXG4gICAgbGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbiAgICBsZXQgcmVjIGJ1Y2tldF9sZW5ndGggYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPiBidWNrZXRfbGVuZ3RoIChhY2N1ICsgMSkgcmVzdFxuXG4gICAgbGV0IHN0YXRzIGggPVxuICAgICAgbGV0IG1ibCA9XG4gICAgICAgIEFycmF5LmZvbGRfbGVmdCAoZnVuIG0gYiAtPiBJbnQubWF4IG0gKGJ1Y2tldF9sZW5ndGggMCBiKSkgMCBoLmRhdGEgaW5cbiAgICAgIGxldCBoaXN0byA9IEFycmF5Lm1ha2UgKG1ibCArIDEpIDAgaW5cbiAgICAgIEFycmF5Lml0ZXJcbiAgICAgICAgKGZ1biBiIC0+XG4gICAgICAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgICAgICAgaGlzdG8uKGwpIDwtIGhpc3RvLihsKSArIDEpXG4gICAgICAgIGguZGF0YTtcbiAgICAgIHsgSGFzaHRibC5udW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgICAgIG51bV9idWNrZXRzID0gQXJyYXkubGVuZ3RoIGguZGF0YTtcbiAgICAgICAgbWF4X2J1Y2tldF9sZW5ndGggPSBtYmw7XG4gICAgICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbiAgICBsZXQgcmVjIGJ1Y2tldF9sZW5ndGhfYWxpdmUgYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgQ29ucyhfLCBjLCByZXN0KSB3aGVuIEguY2hlY2tfa2V5IGMgLT5cbiAgICAgICAgICBidWNrZXRfbGVuZ3RoX2FsaXZlIChhY2N1ICsgMSkgcmVzdFxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+IGJ1Y2tldF9sZW5ndGhfYWxpdmUgYWNjdSByZXN0XG5cbiAgICBsZXQgc3RhdHNfYWxpdmUgaCA9XG4gICAgICBsZXQgc2l6ZSA9IHJlZiAwIGluXG4gICAgICBsZXQgbWJsID1cbiAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgKGZ1biBtIGIgLT4gSW50Lm1heCBtIChidWNrZXRfbGVuZ3RoX2FsaXZlIDAgYikpIDAgaC5kYXRhXG4gICAgICBpblxuICAgICAgbGV0IGhpc3RvID0gQXJyYXkubWFrZSAobWJsICsgMSkgMCBpblxuICAgICAgQXJyYXkuaXRlclxuICAgICAgICAoZnVuIGIgLT5cbiAgICAgICAgICAgbGV0IGwgPSBidWNrZXRfbGVuZ3RoX2FsaXZlIDAgYiBpblxuICAgICAgICAgICBzaXplIDo9ICFzaXplICsgbDtcbiAgICAgICAgICAgaGlzdG8uKGwpIDwtIGhpc3RvLihsKSArIDEpXG4gICAgICAgIGguZGF0YTtcbiAgICAgIHsgSGFzaHRibC5udW1fYmluZGluZ3MgPSAhc2l6ZTtcbiAgICAgICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgICAgICBtYXhfYnVja2V0X2xlbmd0aCA9IG1ibDtcbiAgICAgICAgYnVja2V0X2hpc3RvZ3JhbSA9IGhpc3RvIH1cblxuICAgIGxldCB0b19zZXEgdGJsID1cbiAgICAgICgqIGNhcHR1cmUgY3VycmVudCBhcnJheSwgc28gdGhhdCBldmVuIGlmIHRoZSB0YWJsZSBpcyByZXNpemVkIHdlXG4gICAgICAgICBrZWVwIGl0ZXJhdGluZyBvbiB0aGUgc2FtZSBhcnJheSAqKVxuICAgICAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgICAgICgqIHN0YXRlOiBpbmRleCAqIG5leHQgYnVja2V0IHRvIHRyYXZlcnNlICopXG4gICAgICBsZXQgcmVjIGF1eCBpIGJ1Y2sgKCkgPSBtYXRjaCBidWNrIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICAgaWYgaSA9IEFycmF5Lmxlbmd0aCB0YmxfZGF0YVxuICAgICAgICAgICAgdGhlbiBTZXEuTmlsXG4gICAgICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgICAgICB8IENvbnMgKF8sIGMsIG5leHQpIC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBILmdldF9rZXkgYywgSC5nZXRfZGF0YSBjIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lLCBfIHwgXywgTm9uZSAtPiBhdXggaSBuZXh0ICgpXG4gICAgICAgICAgICAgIHwgU29tZSBrZXksIFNvbWUgZGF0YSAtPlxuICAgICAgICAgICAgICAgICAgU2VxLkNvbnMgKChrZXksIGRhdGEpLCBhdXggaSBuZXh0KVxuICAgICAgICAgICAgZW5kXG4gICAgICBpblxuICAgICAgYXV4IDAgRW1wdHlcblxuICAgIGxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgbSA9IFNlcS5tYXAgc25kICh0b19zZXEgbSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgZW5kXG5lbmRcblxubW9kdWxlIE9iakVwaCA9IE9iai5FcGhlbWVyb25cblxubGV0IF9vYmpfb3B0IDogT2JqLnQgb3B0aW9uIC0+ICdhIG9wdGlvbiA9IGZ1biB4IC0+XG4gIG1hdGNoIHggd2l0aFxuICB8IE5vbmUgLT4geFxuICB8IFNvbWUgdiAtPiBTb21lIChPYmoub2JqIHYpXG5cbigqKiBUaGUgcHJldmlvdXMgZnVuY3Rpb24gaXMgdHlwZWQgc28gdGhpcyBvbmUgaXMgYWxzbyBjb3JyZWN0ICopXG5sZXQgb2JqX29wdCA6IE9iai50IG9wdGlvbiAtPiAnYSBvcHRpb24gPSBmdW4geCAtPiBPYmoubWFnaWMgeFxuXG5cbm1vZHVsZSBLMSA9IHN0cnVjdFxuICB0eXBlICgnaywnZCkgdCA9IE9iakVwaC50XG5cbiAgbGV0IGNyZWF0ZSAoKSA6ICgnaywnZCkgdCA9IE9iakVwaC5jcmVhdGUgMVxuXG4gIGxldCBnZXRfa2V5ICh0OignaywnZCkgdCkgOiAnayBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IDApXG4gIGxldCBnZXRfa2V5X2NvcHkgKHQ6KCdrLCdkKSB0KSA6ICdrIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfa2V5X2NvcHkgdCAwKVxuICBsZXQgc2V0X2tleSAodDooJ2ssJ2QpIHQpIChrOidrKSA6IHVuaXQgPSBPYmpFcGguc2V0X2tleSB0IDAgKE9iai5yZXByIGspXG4gIGxldCB1bnNldF9rZXkgKHQ6KCdrLCdkKSB0KSA6IHVuaXQgPSBPYmpFcGgudW5zZXRfa2V5IHQgMFxuICBsZXQgY2hlY2tfa2V5ICh0OignaywnZCkgdCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IDBcblxuICBsZXQgYmxpdF9rZXkgKHQxOignaywnZCkgdCkgKHQyOignaywnZCkgdCk6IHVuaXQgPVxuICAgIE9iakVwaC5ibGl0X2tleSB0MSAwIHQyIDAgMVxuXG4gIGxldCBnZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBnZXRfZGF0YV9jb3B5ICh0OignaywnZCkgdCkgOiAnZCBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2RhdGFfY29weSB0KVxuICBsZXQgc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSAoZDonZCkgOiB1bml0ID0gT2JqRXBoLnNldF9kYXRhIHQgKE9iai5yZXByIGQpXG4gIGxldCB1bnNldF9kYXRhICh0OignaywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2RhdGEgdFxuICBsZXQgY2hlY2tfZGF0YSAodDooJ2ssJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19kYXRhIHRcbiAgbGV0IGJsaXRfZGF0YSAodDE6KF8sJ2QpIHQpICh0MjooXywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLmJsaXRfZGF0YSB0MSB0MlxuXG4gIGxldCBtYWtlIGtleSBkYXRhID1cbiAgICBsZXQgZXBoID0gY3JlYXRlICgpIGluXG4gICAgc2V0X2RhdGEgZXBoIGRhdGE7XG4gICAgc2V0X2tleSBlcGgga2V5O1xuICAgIGVwaFxuXG4gIGxldCBxdWVyeSBlcGgga2V5ID1cbiAgICBtYXRjaCBnZXRfa2V5IGVwaCB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5IC0+IGdldF9kYXRhIGVwaFxuICAgIHwgU29tZSBfIC0+IE5vbmVcblxuICBtb2R1bGUgTWFrZVNlZWRlZCAoSDpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpID1cbiAgICBHZW5IYXNoVGFibGUuTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgY29udGFpbmVyID0gKEgudCwnYSkgdFxuICAgICAgdHlwZSB0ID0gSC50XG4gICAgICBsZXQgY3JlYXRlIGsgZCA9XG4gICAgICAgIGxldCBjID0gY3JlYXRlICgpIGluXG4gICAgICAgIHNldF9kYXRhIGMgZDtcbiAgICAgICAgc2V0X2tleSBjIGs7XG4gICAgICAgIGNcbiAgICAgIGxldCBoYXNoID0gSC5oYXNoXG4gICAgICBsZXQgZXF1YWwgYyBrID1cbiAgICAgICAgKCogeyFnZXRfa2V5X2NvcHl9IGlzIG5vdCB1c2VkIGJlY2F1c2UgdGhlIGVxdWFsaXR5IG9mIHRoZSB1c2VyIGNhbiBiZVxuICAgICAgICAgICAgdGhlIHBoeXNpY2FsIGVxdWFsaXR5ICopXG4gICAgICAgIG1hdGNoIGdldF9rZXkgYyB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBHZW5IYXNoVGFibGUuRURlYWRcbiAgICAgICAgfCBTb21lIGsnIC0+XG4gICAgICAgICAgICBpZiBILmVxdWFsIGsgaycgdGhlbiBHZW5IYXNoVGFibGUuRVRydWUgZWxzZSBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICBsZXQgZ2V0X2RhdGEgPSBnZXRfZGF0YVxuICAgICAgbGV0IGdldF9rZXkgPSBnZXRfa2V5XG4gICAgICBsZXQgc2V0X2tleV9kYXRhIGMgayBkID1cbiAgICAgICAgdW5zZXRfZGF0YSBjO1xuICAgICAgICBzZXRfa2V5IGMgaztcbiAgICAgICAgc2V0X2RhdGEgYyBkXG4gICAgICBsZXQgY2hlY2tfa2V5ID0gY2hlY2tfa2V5XG4gICAgZW5kKVxuXG4gIG1vZHVsZSBNYWtlKEg6IEhhc2h0YmwuSGFzaGVkVHlwZSk6IChTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgICB0eXBlIHQgPSBILnRcbiAgICAgICAgbGV0IGVxdWFsID0gSC5lcXVhbFxuICAgICAgICBsZXQgaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4gIG1vZHVsZSBCdWNrZXQgPSBzdHJ1Y3RcblxuICAgIHR5cGUgbm9ucmVjICgnaywgJ2QpIHQgPSAoJ2ssICdkKSB0IGxpc3QgcmVmXG4gICAgbGV0IGsxX21ha2UgPSBtYWtlXG4gICAgbGV0IG1ha2UgKCkgPSByZWYgW11cbiAgICBsZXQgYWRkIGIgayBkID0gYiA6PSBrMV9tYWtlIGsgZCA6OiAhYlxuXG4gICAgbGV0IHRlc3Rfa2V5IGsgZSA9XG4gICAgICBtYXRjaCBnZXRfa2V5IGUgd2l0aFxuICAgICAgfCBTb21lIHggd2hlbiB4ID09IGsgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVtb3ZlIGIgayA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5IGsgaCAtPiBiIDo9IExpc3QucmV2X2FwcGVuZCBhY2MgdFxuICAgICAgICB8IGggOjogdCAtPiBsb29wIHQgKGggOjogYWNjKVxuICAgICAgaW5cbiAgICAgIGxvb3AgIWIgW11cblxuICAgIGxldCBmaW5kIGIgayA9XG4gICAgICBtYXRjaCBMaXN0LmZpbmRfb3B0ICh0ZXN0X2tleSBrKSAhYiB3aXRoXG4gICAgICB8IFNvbWUgZSAtPiBnZXRfZGF0YSBlXG4gICAgICB8IE5vbmUgLT4gTm9uZVxuXG4gICAgbGV0IGxlbmd0aCBiID0gTGlzdC5sZW5ndGggIWJcbiAgICBsZXQgY2xlYXIgYiA9IGIgOj0gW11cblxuICBlbmRcblxuZW5kXG5cbm1vZHVsZSBLMiA9IHN0cnVjdFxuICB0eXBlICgnazEsICdrMiwgJ2QpIHQgPSBPYmpFcGgudFxuXG4gIGxldCBjcmVhdGUgKCkgOiAoJ2sxLCdrMiwnZCkgdCA9IE9iakVwaC5jcmVhdGUgMlxuXG4gIGxldCBnZXRfa2V5MSAodDooJ2sxLCdrMiwnZCkgdCkgOiAnazEgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCAwKVxuICBsZXQgZ2V0X2tleTFfY29weSAodDooJ2sxLCdrMiwnZCkgdCkgOiAnazEgb3B0aW9uID1cbiAgICBvYmpfb3B0IChPYmpFcGguZ2V0X2tleV9jb3B5IHQgMClcbiAgbGV0IHNldF9rZXkxICh0OignazEsJ2syLCdkKSB0KSAoazonazEpIDogdW5pdCA9XG4gICAgT2JqRXBoLnNldF9rZXkgdCAwIChPYmoucmVwciBrKVxuICBsZXQgdW5zZXRfa2V5MSAodDooJ2sxLCdrMiwnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2tleSB0IDBcbiAgbGV0IGNoZWNrX2tleTEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCAwXG5cbiAgbGV0IGdldF9rZXkyICh0OignazEsJ2syLCdkKSB0KSA6ICdrMiBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IDEpXG4gIGxldCBnZXRfa2V5Ml9jb3B5ICh0OignazEsJ2syLCdkKSB0KSA6ICdrMiBvcHRpb24gPVxuICAgIG9ial9vcHQgKE9iakVwaC5nZXRfa2V5X2NvcHkgdCAxKVxuICBsZXQgc2V0X2tleTIgKHQ6KCdrMSwnazIsJ2QpIHQpIChrOidrMikgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2tleSB0IDEgKE9iai5yZXByIGspXG4gIGxldCB1bnNldF9rZXkyICh0OignazEsJ2syLCdkKSB0KSA6IHVuaXQgPSBPYmpFcGgudW5zZXRfa2V5IHQgMVxuICBsZXQgY2hlY2tfa2V5MiAodDooJ2sxLCdrMiwnZCkgdCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IDFcblxuXG4gIGxldCBibGl0X2tleTEgKHQxOignazEsXyxfKSB0KSAodDI6KCdrMSxfLF8pIHQpIDogdW5pdCA9XG4gICAgT2JqRXBoLmJsaXRfa2V5IHQxIDAgdDIgMCAxXG4gIGxldCBibGl0X2tleTIgKHQxOihfLCdrMixfKSB0KSAodDI6KF8sJ2syLF8pIHQpIDogdW5pdCA9XG4gICAgT2JqRXBoLmJsaXRfa2V5IHQxIDEgdDIgMSAxXG4gIGxldCBibGl0X2tleTEyICh0MTooJ2sxLCdrMixfKSB0KSAodDI6KCdrMSwnazIsXykgdCkgOiB1bml0ID1cbiAgICBPYmpFcGguYmxpdF9rZXkgdDEgMCB0MiAwIDJcblxuICBsZXQgZ2V0X2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBnZXRfZGF0YV9jb3B5ICh0OignazEsJ2syLCdkKSB0KSA6ICdkIG9wdGlvbiA9XG4gICAgb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhX2NvcHkgdClcbiAgbGV0IHNldF9kYXRhICh0OignazEsJ2syLCdkKSB0KSAoZDonZCkgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2RhdGEgdCAoT2JqLnJlcHIgZClcbiAgbGV0IHVuc2V0X2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogdW5pdCA9IE9iakVwaC51bnNldF9kYXRhIHRcbiAgbGV0IGNoZWNrX2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19kYXRhIHRcbiAgbGV0IGJsaXRfZGF0YSAodDE6KF8sXywnZCkgdCkgKHQyOihfLF8sJ2QpIHQpIDogdW5pdCA9IE9iakVwaC5ibGl0X2RhdGEgdDEgdDJcblxuICBsZXQgbWFrZSBrZXkxIGtleTIgZGF0YSA9XG4gICAgbGV0IGVwaCA9IGNyZWF0ZSAoKSBpblxuICAgIHNldF9kYXRhIGVwaCBkYXRhO1xuICAgIHNldF9rZXkxIGVwaCBrZXkxO1xuICAgIHNldF9rZXkyIGVwaCBrZXkyO1xuICAgIGlnbm9yZSAoU3lzLm9wYXF1ZV9pZGVudGl0eSBrZXkxKTtcbiAgICBlcGhcblxuICBsZXQgcXVlcnkgZXBoIGtleTEga2V5MiA9XG4gICAgbWF0Y2ggZ2V0X2tleTEgZXBoIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXkxIC0+XG4gICAgICAgIGJlZ2luIG1hdGNoIGdldF9rZXkyIGVwaCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXkyIC0+IGdldF9kYXRhIGVwaFxuICAgICAgICB8IFNvbWUgXyAtPiBOb25lXG4gICAgICAgIGVuZFxuICAgIHwgU29tZSBfIC0+IE5vbmVcblxuICBtb2R1bGUgTWFrZVNlZWRlZFxuICAgICAgKEgxOkhhc2h0YmwuU2VlZGVkSGFzaGVkVHlwZSlcbiAgICAgIChIMjpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpID1cbiAgICBHZW5IYXNoVGFibGUuTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgY29udGFpbmVyID0gKEgxLnQsSDIudCwnYSkgdFxuICAgICAgdHlwZSB0ID0gSDEudCAqIEgyLnRcbiAgICAgIGxldCBjcmVhdGUgKGsxLGsyKSBkID1cbiAgICAgICAgbGV0IGMgPSBjcmVhdGUgKCkgaW5cbiAgICAgICAgc2V0X2RhdGEgYyBkO1xuICAgICAgICBzZXRfa2V5MSBjIGsxOyBzZXRfa2V5MiBjIGsyO1xuICAgICAgICBjXG4gICAgICBsZXQgaGFzaCBzZWVkIChrMSxrMikgPVxuICAgICAgICBIMS5oYXNoIHNlZWQgazEgKyBIMi5oYXNoIHNlZWQgazIgKiA2NTU5OVxuICAgICAgbGV0IGVxdWFsIGMgKGsxLGsyKSA9XG4gICAgICAgIG1hdGNoIGdldF9rZXkxIGMsIGdldF9rZXkyIGMgd2l0aFxuICAgICAgICB8IE5vbmUsIF8gfCBfICwgTm9uZSAtPiBHZW5IYXNoVGFibGUuRURlYWRcbiAgICAgICAgfCBTb21lIGsxJywgU29tZSBrMicgLT5cbiAgICAgICAgICAgIGlmIEgxLmVxdWFsIGsxIGsxJyAmJiBIMi5lcXVhbCBrMiBrMidcbiAgICAgICAgICAgIHRoZW4gR2VuSGFzaFRhYmxlLkVUcnVlIGVsc2UgR2VuSGFzaFRhYmxlLkVGYWxzZVxuICAgICAgbGV0IGdldF9kYXRhID0gZ2V0X2RhdGFcbiAgICAgIGxldCBnZXRfa2V5IGMgPVxuICAgICAgICBtYXRjaCBnZXRfa2V5MSBjLCBnZXRfa2V5MiBjIHdpdGhcbiAgICAgICAgfCBOb25lLCBfIHwgXyAsIE5vbmUgLT4gTm9uZVxuICAgICAgICB8IFNvbWUgazEnLCBTb21lIGsyJyAtPiBTb21lIChrMScsIGsyJylcbiAgICAgIGxldCBzZXRfa2V5X2RhdGEgYyAoazEsazIpIGQgPVxuICAgICAgICB1bnNldF9kYXRhIGM7XG4gICAgICAgIHNldF9rZXkxIGMgazE7IHNldF9rZXkyIGMgazI7XG4gICAgICAgIHNldF9kYXRhIGMgZFxuICAgICAgbGV0IGNoZWNrX2tleSBjID0gY2hlY2tfa2V5MSBjICYmIGNoZWNrX2tleTIgY1xuICAgIGVuZClcblxuICBtb2R1bGUgTWFrZShIMTogSGFzaHRibC5IYXNoZWRUeXBlKShIMjogSGFzaHRibC5IYXNoZWRUeXBlKTpcbiAgICAoUyB3aXRoIHR5cGUga2V5ID0gSDEudCAqIEgyLnQpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkXG4gICAgICAgIChzdHJ1Y3RcbiAgICAgICAgICB0eXBlIHQgPSBIMS50XG4gICAgICAgICAgbGV0IGVxdWFsID0gSDEuZXF1YWxcbiAgICAgICAgICBsZXQgaGFzaCAoX3NlZWQ6IGludCkgeCA9IEgxLmhhc2ggeFxuICAgICAgICBlbmQpXG4gICAgICAgIChzdHJ1Y3RcbiAgICAgICAgICB0eXBlIHQgPSBIMi50XG4gICAgICAgICAgbGV0IGVxdWFsID0gSDIuZXF1YWxcbiAgICAgICAgICBsZXQgaGFzaCAoX3NlZWQ6IGludCkgeCA9IEgyLmhhc2ggeFxuICAgICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4gIG1vZHVsZSBCdWNrZXQgPSBzdHJ1Y3RcblxuICAgIHR5cGUgbm9ucmVjICgnazEsICdrMiwgJ2QpIHQgPSAoJ2sxLCAnazIsICdkKSB0IGxpc3QgcmVmXG4gICAgbGV0IGsyX21ha2UgPSBtYWtlXG4gICAgbGV0IG1ha2UgKCkgPSByZWYgW11cbiAgICBsZXQgYWRkIGIgazEgazIgZCA9IGIgOj0gazJfbWFrZSBrMSBrMiBkIDo6ICFiXG5cbiAgICBsZXQgdGVzdF9rZXlzIGsxIGsyIGUgPVxuICAgICAgbWF0Y2ggZ2V0X2tleTEgZSwgZ2V0X2tleTIgZSB3aXRoXG4gICAgICB8IFNvbWUgeDEsIFNvbWUgeDIgd2hlbiB4MSA9PSBrMSAmJiB4MiA9PSBrMiAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcblxuICAgIGxldCByZW1vdmUgYiBrMSBrMiA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5cyBrMSBrMiBoIC0+IGIgOj0gTGlzdC5yZXZfYXBwZW5kIGFjYyB0XG4gICAgICAgIHwgaCA6OiB0IC0+IGxvb3AgdCAoaCA6OiBhY2MpXG4gICAgICBpblxuICAgICAgbG9vcCAhYiBbXVxuXG4gICAgbGV0IGZpbmQgYiBrMSBrMiA9XG4gICAgICBtYXRjaCBMaXN0LmZpbmRfb3B0ICh0ZXN0X2tleXMgazEgazIpICFiIHdpdGhcbiAgICAgIHwgU29tZSBlIC0+IGdldF9kYXRhIGVcbiAgICAgIHwgTm9uZSAtPiBOb25lXG5cbiAgICBsZXQgbGVuZ3RoIGIgPSBMaXN0Lmxlbmd0aCAhYlxuICAgIGxldCBjbGVhciBiID0gYiA6PSBbXVxuXG4gIGVuZFxuXG5lbmRcblxubW9kdWxlIEtuID0gc3RydWN0XG4gIHR5cGUgKCdrLCdkKSB0ID0gT2JqRXBoLnRcblxuICBsZXQgY3JlYXRlIG4gOiAoJ2ssJ2QpIHQgPSBPYmpFcGguY3JlYXRlIG5cbiAgbGV0IGxlbmd0aCAoazooJ2ssJ2QpIHQpIDogaW50ID0gT2JqRXBoLmxlbmd0aCBrXG5cbiAgbGV0IGdldF9rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIDogJ2sgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCBuKVxuICBsZXQgZ2V0X2tleV9jb3B5ICh0OignaywnZCkgdCkgKG46aW50KSA6ICdrIG9wdGlvbiA9XG4gICAgb2JqX29wdCAoT2JqRXBoLmdldF9rZXlfY29weSB0IG4pXG4gIGxldCBzZXRfa2V5ICh0OignaywnZCkgdCkgKG46aW50KSAoazonaykgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2tleSB0IG4gKE9iai5yZXByIGspXG4gIGxldCB1bnNldF9rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIDogdW5pdCA9IE9iakVwaC51bnNldF9rZXkgdCBuXG4gIGxldCBjaGVja19rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCBuXG5cbiAgbGV0IGJsaXRfa2V5ICh0MTooJ2ssJ2QpIHQpIChvMTppbnQpICh0MjooJ2ssJ2QpIHQpIChvMjppbnQpIChsOmludCkgOiB1bml0ID1cbiAgICBPYmpFcGguYmxpdF9rZXkgdDEgbzEgdDIgbzIgbFxuXG4gIGxldCBnZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBnZXRfZGF0YV9jb3B5ICh0OignaywnZCkgdCkgOiAnZCBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2RhdGFfY29weSB0KVxuICBsZXQgc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSAoZDonZCkgOiB1bml0ID0gT2JqRXBoLnNldF9kYXRhIHQgKE9iai5yZXByIGQpXG4gIGxldCB1bnNldF9kYXRhICh0OignaywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2RhdGEgdFxuICBsZXQgY2hlY2tfZGF0YSAodDooJ2ssJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19kYXRhIHRcbiAgbGV0IGJsaXRfZGF0YSAodDE6KF8sJ2QpIHQpICh0MjooXywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLmJsaXRfZGF0YSB0MSB0MlxuXG4gIGxldCBtYWtlIGtleXMgZGF0YSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGgga2V5cyBpblxuICAgIGxldCBlcGggPSBjcmVhdGUgbCBpblxuICAgIHNldF9kYXRhIGVwaCBkYXRhO1xuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyBzZXRfa2V5IGVwaCBpIGtleXMuKGkpIGRvbmU7XG4gICAgZXBoXG5cbiAgbGV0IHF1ZXJ5IGVwaCBrZXlzID1cbiAgICBsZXQgbCA9IGxlbmd0aCBlcGggaW5cbiAgICB0cnlcbiAgICAgIGlmIGwgPD4gQXJyYXkubGVuZ3RoIGtleXMgdGhlbiByYWlzZSBFeGl0O1xuICAgICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICAgIG1hdGNoIGdldF9rZXkgZXBoIGkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gcmFpc2UgRXhpdFxuICAgICAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5cy4oaSkgLT4gKClcbiAgICAgICAgfCBTb21lIF8gLT4gcmFpc2UgRXhpdFxuICAgICAgZG9uZTtcbiAgICAgIGdldF9kYXRhIGVwaFxuICAgIHdpdGggRXhpdCAtPiBOb25lXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWQgKEg6SGFzaHRibC5TZWVkZWRIYXNoZWRUeXBlKSA9XG4gICAgR2VuSGFzaFRhYmxlLk1ha2VTZWVkZWQoc3RydWN0XG4gICAgICB0eXBlICdhIGNvbnRhaW5lciA9IChILnQsJ2EpIHRcbiAgICAgIHR5cGUgdCA9IEgudCBhcnJheVxuICAgICAgbGV0IGNyZWF0ZSBrIGQgPVxuICAgICAgICBsZXQgYyA9IGNyZWF0ZSAoQXJyYXkubGVuZ3RoIGspIGluXG4gICAgICAgIHNldF9kYXRhIGMgZDtcbiAgICAgICAgZm9yIGk9MCB0byBBcnJheS5sZW5ndGggayAtMSBkb1xuICAgICAgICAgIHNldF9rZXkgYyBpIGsuKGkpO1xuICAgICAgICBkb25lO1xuICAgICAgICBjXG4gICAgICBsZXQgaGFzaCBzZWVkIGsgPVxuICAgICAgICBsZXQgaCA9IHJlZiAwIGluXG4gICAgICAgIGZvciBpPTAgdG8gQXJyYXkubGVuZ3RoIGsgLTEgZG9cbiAgICAgICAgICBoIDo9IEguaGFzaCBzZWVkIGsuKGkpICogNjU1OTkgKyAhaDtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgIWhcbiAgICAgIGxldCBlcXVhbCBjIGsgPVxuICAgICAgICBsZXQgbGVuICA9IEFycmF5Lmxlbmd0aCBrIGluXG4gICAgICAgIGxldCBsZW4nID0gbGVuZ3RoIGMgaW5cbiAgICAgICAgaWYgbGVuICE9IGxlbicgdGhlbiBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsZXQgcmVjIGVxdWFsX2FycmF5IGsgYyBpID1cbiAgICAgICAgICAgIGlmIGkgPCAwIHRoZW4gR2VuSGFzaFRhYmxlLkVUcnVlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIGdldF9rZXkgYyBpIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+IEdlbkhhc2hUYWJsZS5FRGVhZFxuICAgICAgICAgICAgICB8IFNvbWUga2kgLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwgay4oaSkga2lcbiAgICAgICAgICAgICAgICAgIHRoZW4gZXF1YWxfYXJyYXkgayBjIChpLTEpXG4gICAgICAgICAgICAgICAgICBlbHNlIEdlbkhhc2hUYWJsZS5FRmFsc2VcbiAgICAgICAgICBpblxuICAgICAgICAgIGVxdWFsX2FycmF5IGsgYyAobGVuLTEpXG4gICAgICBsZXQgZ2V0X2RhdGEgPSBnZXRfZGF0YVxuICAgICAgbGV0IGdldF9rZXkgYyA9XG4gICAgICAgIGxldCBsZW4gPSBsZW5ndGggYyBpblxuICAgICAgICBpZiBsZW4gPSAwIHRoZW4gU29tZSBbfHxdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBtYXRjaCBnZXRfa2V5IGMgMCB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgICB8IFNvbWUgazAgLT5cbiAgICAgICAgICAgICAgbGV0IHJlYyBmaWxsIGEgaSA9XG4gICAgICAgICAgICAgICAgaWYgaSA8IDEgdGhlbiBTb21lIGFcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICBtYXRjaCBnZXRfa2V5IGMgaSB3aXRoXG4gICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICAgICAgICAgICAgfCBTb21lIGtpIC0+XG4gICAgICAgICAgICAgICAgICAgICAgYS4oaSkgPC0ga2k7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsbCBhIChpLTEpXG4gICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgIGxldCBhID0gQXJyYXkubWFrZSBsZW4gazAgaW5cbiAgICAgICAgICAgICAgZmlsbCBhIChsZW4tMSlcbiAgICAgIGxldCBzZXRfa2V5X2RhdGEgYyBrIGQgPVxuICAgICAgICB1bnNldF9kYXRhIGM7XG4gICAgICAgIGZvciBpPTAgdG8gQXJyYXkubGVuZ3RoIGsgLTEgZG9cbiAgICAgICAgICBzZXRfa2V5IGMgaSBrLihpKTtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgc2V0X2RhdGEgYyBkXG4gICAgICBsZXQgY2hlY2tfa2V5IGMgPVxuICAgICAgICBsZXQgcmVjIGNoZWNrIGMgaSA9XG4gICAgICAgICAgaSA8IDAgfHwgKGNoZWNrX2tleSBjIGkgJiYgY2hlY2sgYyAoaS0xKSkgaW5cbiAgICAgICAgY2hlY2sgYyAobGVuZ3RoIGMgLSAxKVxuICAgIGVuZClcblxuICBtb2R1bGUgTWFrZShIOiBIYXNodGJsLkhhc2hlZFR5cGUpOiAoUyB3aXRoIHR5cGUga2V5ID0gSC50IGFycmF5KSA9XG4gIHN0cnVjdFxuICAgIGluY2x1ZGUgTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgICAgdHlwZSB0ID0gSC50XG4gICAgICAgIGxldCBlcXVhbCA9IEguZXF1YWxcbiAgICAgICAgbGV0IGhhc2ggKF9zZWVkOiBpbnQpIHggPSBILmhhc2ggeFxuICAgICAgZW5kKVxuICAgIGxldCBjcmVhdGUgc3ogPSBjcmVhdGUgfnJhbmRvbTpmYWxzZSBzelxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuICBlbmRcblxuICBtb2R1bGUgQnVja2V0ID0gc3RydWN0XG5cbiAgICB0eXBlIG5vbnJlYyAoJ2ssICdkKSB0ID0gKCdrLCAnZCkgdCBsaXN0IHJlZlxuICAgIGxldCBrbl9tYWtlID0gbWFrZVxuICAgIGxldCBtYWtlICgpID0gcmVmIFtdXG4gICAgbGV0IGFkZCBiIGsgZCA9IGIgOj0ga25fbWFrZSBrIGQgOjogIWJcblxuICAgIGxldCB0ZXN0X2tleXMgayBlID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBsZW5ndGggZSA8PiBBcnJheS5sZW5ndGggayB0aGVuIHJhaXNlIEV4aXQ7XG4gICAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggayAtIDEgZG9cbiAgICAgICAgICBtYXRjaCBnZXRfa2V5IGUgaSB3aXRoXG4gICAgICAgICAgfCBTb21lIHggd2hlbiB4ID09IGsuKGkpIC0+ICgpXG4gICAgICAgICAgfCBfIC0+IHJhaXNlIEV4aXRcbiAgICAgICAgZG9uZTtcbiAgICAgICAgdHJ1ZVxuICAgICAgd2l0aCBFeGl0IC0+IGZhbHNlXG5cbiAgICBsZXQgcmVtb3ZlIGIgayA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5cyBrIGggLT4gYiA6PSBMaXN0LnJldl9hcHBlbmQgYWNjIHRcbiAgICAgICAgfCBoIDo6IHQgLT4gbG9vcCB0IChoIDo6IGFjYylcbiAgICAgIGluXG4gICAgICBsb29wICFiIFtdXG5cbiAgICBsZXQgZmluZCBiIGsgPVxuICAgICAgbWF0Y2ggTGlzdC5maW5kX29wdCAodGVzdF9rZXlzIGspICFiIHdpdGhcbiAgICAgIHwgU29tZSBlIC0+IGdldF9kYXRhIGVcbiAgICAgIHwgTm9uZSAtPiBOb25lXG5cbiAgICBsZXQgbGVuZ3RoIGIgPSBMaXN0Lmxlbmd0aCAhYlxuICAgIGxldCBjbGVhciBiID0gYiA6PSBbXVxuXG4gIGVuZFxuXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICBNYW51ZWwgU2VycmFubyBldCBYYXZpZXIgTGVyb3ksIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDAgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtCaWdhcnJheV06IGxhcmdlLCBtdWx0aS1kaW1lbnNpb25hbCwgbnVtZXJpY2FsIGFycmF5cyAqKVxuXG4oKiBUaGVzZSB0eXBlcyBpbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB0YWJsZXMgaW5cbiAgIC4uL3R5cGluZy90eXBlb3B0Lm1sICopXG5cbnR5cGUgZmxvYXQzMl9lbHQgPSBGbG9hdDMyX2VsdFxudHlwZSBmbG9hdDY0X2VsdCA9IEZsb2F0NjRfZWx0XG50eXBlIGludDhfc2lnbmVkX2VsdCA9IEludDhfc2lnbmVkX2VsdFxudHlwZSBpbnQ4X3Vuc2lnbmVkX2VsdCA9IEludDhfdW5zaWduZWRfZWx0XG50eXBlIGludDE2X3NpZ25lZF9lbHQgPSBJbnQxNl9zaWduZWRfZWx0XG50eXBlIGludDE2X3Vuc2lnbmVkX2VsdCA9IEludDE2X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQzMl9lbHQgPSBJbnQzMl9lbHRcbnR5cGUgaW50NjRfZWx0ID0gSW50NjRfZWx0XG50eXBlIGludF9lbHQgPSBJbnRfZWx0XG50eXBlIG5hdGl2ZWludF9lbHQgPSBOYXRpdmVpbnRfZWx0XG50eXBlIGNvbXBsZXgzMl9lbHQgPSBDb21wbGV4MzJfZWx0XG50eXBlIGNvbXBsZXg2NF9lbHQgPSBDb21wbGV4NjRfZWx0XG5cbnR5cGUgKCdhLCAnYikga2luZCA9XG4gICAgRmxvYXQzMiA6IChmbG9hdCwgZmxvYXQzMl9lbHQpIGtpbmRcbiAgfCBGbG9hdDY0IDogKGZsb2F0LCBmbG9hdDY0X2VsdCkga2luZFxuICB8IEludDhfc2lnbmVkIDogKGludCwgaW50OF9zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50OF91bnNpZ25lZCA6IChpbnQsIGludDhfdW5zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50MTZfc2lnbmVkIDogKGludCwgaW50MTZfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3Vuc2lnbmVkIDogKGludCwgaW50MTZfdW5zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50MzIgOiAoaW50MzIsIGludDMyX2VsdCkga2luZFxuICB8IEludDY0IDogKGludDY0LCBpbnQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQgOiAoaW50LCBpbnRfZWx0KSBraW5kXG4gIHwgTmF0aXZlaW50IDogKG5hdGl2ZWludCwgbmF0aXZlaW50X2VsdCkga2luZFxuICB8IENvbXBsZXgzMiA6IChDb21wbGV4LnQsIGNvbXBsZXgzMl9lbHQpIGtpbmRcbiAgfCBDb21wbGV4NjQgOiAoQ29tcGxleC50LCBjb21wbGV4NjRfZWx0KSBraW5kXG4gIHwgQ2hhciA6IChjaGFyLCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuXG50eXBlIGNfbGF5b3V0ID0gQ19sYXlvdXRfdHlwXG50eXBlIGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRfdHlwICgqKilcblxudHlwZSAnYSBsYXlvdXQgPVxuICAgIENfbGF5b3V0OiBjX2xheW91dCBsYXlvdXRcbiAgfCBGb3J0cmFuX2xheW91dDogZm9ydHJhbl9sYXlvdXQgbGF5b3V0XG5cbigqIEtlZXAgdGhvc2UgY29uc3RhbnRzIGluIHN5bmMgd2l0aCB0aGUgY2FtbF9iYV9raW5kIGVudW1lcmF0aW9uXG4gICBpbiBiaWdhcnJheS5oICopXG5cbmxldCBmbG9hdDMyID0gRmxvYXQzMlxubGV0IGZsb2F0NjQgPSBGbG9hdDY0XG5sZXQgaW50OF9zaWduZWQgPSBJbnQ4X3NpZ25lZFxubGV0IGludDhfdW5zaWduZWQgPSBJbnQ4X3Vuc2lnbmVkXG5sZXQgaW50MTZfc2lnbmVkID0gSW50MTZfc2lnbmVkXG5sZXQgaW50MTZfdW5zaWduZWQgPSBJbnQxNl91bnNpZ25lZFxubGV0IGludDMyID0gSW50MzJcbmxldCBpbnQ2NCA9IEludDY0XG5sZXQgaW50ID0gSW50XG5sZXQgbmF0aXZlaW50ID0gTmF0aXZlaW50XG5sZXQgY29tcGxleDMyID0gQ29tcGxleDMyXG5sZXQgY29tcGxleDY0ID0gQ29tcGxleDY0XG5sZXQgY2hhciA9IENoYXJcblxubGV0IGtpbmRfc2l6ZV9pbl9ieXRlcyA6IHR5cGUgYSBiLiAoYSwgYikga2luZCAtPiBpbnQgPSBmdW5jdGlvblxuICB8IEZsb2F0MzIgLT4gNFxuICB8IEZsb2F0NjQgLT4gOFxuICB8IEludDhfc2lnbmVkIC0+IDFcbiAgfCBJbnQ4X3Vuc2lnbmVkIC0+IDFcbiAgfCBJbnQxNl9zaWduZWQgLT4gMlxuICB8IEludDE2X3Vuc2lnbmVkIC0+IDJcbiAgfCBJbnQzMiAtPiA0XG4gIHwgSW50NjQgLT4gOFxuICB8IEludCAtPiBTeXMud29yZF9zaXplIC8gOFxuICB8IE5hdGl2ZWludCAtPiBTeXMud29yZF9zaXplIC8gOFxuICB8IENvbXBsZXgzMiAtPiA4XG4gIHwgQ29tcGxleDY0IC0+IDE2XG4gIHwgQ2hhciAtPiAxXG5cbigqIEtlZXAgdGhvc2UgY29uc3RhbnRzIGluIHN5bmMgd2l0aCB0aGUgY2FtbF9iYV9sYXlvdXQgZW51bWVyYXRpb25cbiAgIGluIGJpZ2FycmF5LmggKilcblxubGV0IGNfbGF5b3V0ID0gQ19sYXlvdXRcbmxldCBmb3J0cmFuX2xheW91dCA9IEZvcnRyYW5fbGF5b3V0XG5cbm1vZHVsZSBHZW5hcnJheSA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0XG4gIGV4dGVybmFsIGNyZWF0ZTogKCdhLCAnYikga2luZCAtPiAnYyBsYXlvdXQgLT4gaW50IGFycmF5IC0+ICgnYSwgJ2IsICdjKSB0XG4gICAgID0gXCJjYW1sX2JhX2NyZWF0ZVwiXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IGFycmF5IC0+ICdhXG4gICAgID0gXCJjYW1sX2JhX2dldF9nZW5lcmljXCJcbiAgZXh0ZXJuYWwgc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9zZXRfZ2VuZXJpY1wiXG5cbiAgbGV0IHJlYyBjbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sID0gQXJyYXkubGVuZ3RoIGlkeCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMCB0byBwcmVkIG1heC4oY29sKSBkb1xuICAgICAgICAgICBpZHguKGNvbCkgPC0gajtcbiAgICAgICAgICAgY2xvb3AgYXJyIGlkeCBmIChzdWNjIGNvbCkgbWF4XG4gICAgICAgICBkb25lXG4gIGxldCByZWMgZmxvb3AgYXJyIGlkeCBmIGNvbCBtYXggPVxuICAgIGlmIGNvbCA8IDAgdGhlbiBzZXQgYXJyIGlkeCAoZiBpZHgpXG4gICAgZWxzZSBmb3IgaiA9IDEgdG8gbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBmbG9vcCBhcnIgaWR4IGYgKHByZWQgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbXMgZiA9XG4gICAgbGV0IGFyciA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW1zIGluXG4gICAgbWF0Y2ggQXJyYXkubGVuZ3RoIGRpbXMsIGxheW91dCB3aXRoXG4gICAgfCAwLCBfIC0+IGFyclxuICAgIHwgZGxlbiwgQ19sYXlvdXQgLT4gY2xvb3AgYXJyIChBcnJheS5tYWtlIGRsZW4gMCkgZiAwIGRpbXM7IGFyclxuICAgIHwgZGxlbiwgRm9ydHJhbl9sYXlvdXQgLT4gZmxvb3AgYXJyIChBcnJheS5tYWtlIGRsZW4gMSkgZiAocHJlZCBkbGVuKSBkaW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyXG5cbiAgZXh0ZXJuYWwgbnVtX2RpbXM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiY2FtbF9iYV9udW1fZGltc1wiXG4gIGV4dGVybmFsIG50aF9kaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfYmFfZGltXCJcbiAgbGV0IGRpbXMgYSA9XG4gICAgbGV0IG4gPSBudW1fZGltcyBhIGluXG4gICAgbGV0IGQgPSBBcnJheS5tYWtlIG4gMCBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG8gZC4oaSkgPC0gbnRoX2RpbSBhIGkgZG9uZTtcbiAgICBkXG5cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChBcnJheS5mb2xkX2xlZnQgKCAqICkgMSAoZGltcyBhcnIpKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzbGljZV9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBzbGljZV9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbmVuZFxuXG5tb2R1bGUgQXJyYXkwID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0ID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3x8XVxuICBsZXQgZ2V0IGFyciA9IEdlbmFycmF5LmdldCBhcnIgW3x8XVxuICBsZXQgc2V0IGFyciA9IEdlbmFycmF5LnNldCBhcnIgW3x8XVxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9IGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpXG5cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcblxuICBsZXQgb2ZfdmFsdWUga2luZCBsYXlvdXQgdiA9XG4gICAgbGV0IGEgPSBjcmVhdGUga2luZCBsYXlvdXQgaW5cbiAgICBzZXQgYSB2O1xuICAgIGFcbiAgbGV0IGluaXQgPSBvZl92YWx1ZVxuZW5kXG5cbm1vZHVsZSBBcnJheTEgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW18XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzFcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMVwiXG4gIGV4dGVybmFsIGRpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbSBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsICdjKSB0ID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZSAodHlwZSB0KSAoYSA6IChfLCBfLCB0KSBHZW5hcnJheS50KSBuID1cbiAgICBtYXRjaCBsYXlvdXQgYSB3aXRoXG4gICAgfCBDX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XTogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDEgdG8gZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0gZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgKEFycmF5Lmxlbmd0aCBkYXRhKSBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGRhdGEgLSAxIGRvIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIGRhdGEuKGkpIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkyID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMnxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzJcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzJcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzJcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMlwiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0IGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHQgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTIub2ZfYXJyYXk6IG5vbi1yZWN0YW5ndWxhciBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSByb3cuKGopXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTMgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTI7IGRpbTN8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfM1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfc2V0XzNcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8zXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBkaW0zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8zXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKSAqIChkaW0zIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfcmlnaHRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX2xlZnRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIGZvciBrID0gMCB0byBwcmVkIGRpbTMgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGsgPSAxIHRvIGRpbTMgZG9cbiAgICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGRpbTMgPSBpZiBkaW0yID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgbGV0IGNvbCA9IHJvdy4oaikgaW5cbiAgICAgICAgaWYgQXJyYXkubGVuZ3RoIGNvbCA8PiBkaW0zIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICAgIGZvciBrID0gMCB0byBkaW0zIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSAoayArIG9mcykgY29sLihrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MDogKCdhLCAnYiwgJ2MpIEFycmF5MC50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MTogKCdhLCAnYiwgJ2MpIEFycmF5MS50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MjogKCdhLCAnYiwgJ2MpIEFycmF5Mi50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MzogKCdhLCAnYiwgJ2MpIEFycmF5My50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmxldCBhcnJheTBfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAwIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkwX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTFfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAxIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkxX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTJfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAyIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkyX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTNfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAzIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkzX29mX2dlbmFycmF5XCJcblxuZXh0ZXJuYWwgcmVzaGFwZTpcbiAgICgnYSwgJ2IsICdjKSBHZW5hcnJheS50IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcImNhbWxfYmFfcmVzaGFwZVwiXG5sZXQgcmVzaGFwZV8wIGEgPSByZXNoYXBlIGEgW3x8XVxubGV0IHJlc2hhcGVfMSBhIGRpbTEgPSByZXNoYXBlIGEgW3xkaW0xfF1cbmxldCByZXNoYXBlXzIgYSBkaW0xIGRpbTIgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTJ8XVxubGV0IHJlc2hhcGVfMyBhIGRpbTEgZGltMiBkaW0zID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yO2RpbTN8XVxuXG4oKiBGb3JjZSBjYW1sX2JhX2dldF97MSwyLDMsTn0gdG8gYmUgbGlua2VkIGluLCBzaW5jZSB3ZSBkb24ndCByZWZlclxuICAgdG8gdGhvc2UgcHJpbWl0aXZlcyBkaXJlY3RseSBpbiB0aGlzIGZpbGUgKilcblxubGV0IF8gPVxuICBsZXQgXyA9IEdlbmFycmF5LmdldCBpblxuICBsZXQgXyA9IEFycmF5MS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTIuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkzLmdldCBpblxuICAoKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuZXh0ZXJuYWwgZ2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8xXCJcbmV4dGVybmFsIGdldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMlwiXG5leHRlcm5hbCBnZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzNcIlxuZXh0ZXJuYWwgc2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8xXCJcbmV4dGVybmFsIHNldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMlwiXG5leHRlcm5hbCBzZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzNcIlxuIiwibGV0IHRhcmlmID0gXCIyMDIyLTIwMjNcIlxuXG5sZXQgZGVzdGluYXRhaXJlcyA9IFwiZHVidXZhbEBnbWFpbC5jb20sZ3V5LmdyYW5nZUB3YW5hZG9vLmZyXCJcblxudHlwZSBwaWVjZSA9IENoYW1icmUxIHwgQ2hhbWJyZTIgfCBDaGFtYnJlMyB8IFNlam91ciB8IFNkYjEgfCBTZGIyXG5cbmxldCBwaWVjZXMgPSBbIENoYW1icmUxOyBDaGFtYnJlMjsgQ2hhbWJyZTM7IFNlam91cjsgU2RiMTsgU2RiMiBdXG5cbmxldCBzaG9ydF9zdHJpbmdfb2ZfcGllY2UgPSBmdW5jdGlvblxuICB8IENoYW1icmUxIC0+IFwiY2gxXCJcbiAgfCBDaGFtYnJlMiAtPiBcImNoMlwiXG4gIHwgQ2hhbWJyZTMgLT4gXCJjaDNcIlxuICB8IFNlam91ciAtPiBcInNqXCJcbiAgfCBTZGIxIC0+IFwic2RiMVwiXG4gIHwgU2RiMiAtPiBcInNkYjJcIlxuXG5sZXQgbG9uZ19zdHJpbmdfb2ZfcGllY2UgPSBmdW5jdGlvblxuICB8IENoYW1icmUxIC0+IFwiQ2hhbWJyZSAxXCJcbiAgfCBDaGFtYnJlMiAtPiBcIkNoYW1icmUgMlwiXG4gIHwgQ2hhbWJyZTMgLT4gXCJDaGFtYnJlIDNcIlxuICB8IFNlam91ciAtPiBcIlPDqWpvdXJcIlxuICB8IFNkYjEgLT4gXCJTYWxsZSBkZSBiYWlucyAxXCJcbiAgfCBTZGIyIC0+IFwiU2FsbGUgZGUgYmFpbnMgMlwiXG5cbnR5cGUgZm91cm5pdHVyZSA9IHtcbiAgbmFtZSA6IHN0cmluZztcbiAgZGVzaWduYXRpb24gOiBzdHJpbmc7XG4gIHByaXggOiBpbnQ7XG4gIGRpc3BvbmliaWxpdGUgOiAocGllY2UgKiBpbnQpIGxpc3Q7XG59XG5cbmxldCBmb3Vybml0dXJlcyA9XG4gIFtcbiAgICB7XG4gICAgICBuYW1lID0gXCJkaDgwXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiRHJhcCBob3Vzc2UgODAgY21cIjtcbiAgICAgIHByaXggPSA0O1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKENoYW1icmUxLCAyKSBdO1xuICAgIH07XG4gICAge1xuICAgICAgbmFtZSA9IFwiZGg5MFwiO1xuICAgICAgZGVzaWduYXRpb24gPSBcIkRyYXAgaG91c3NlIDkwIGNtXCI7XG4gICAgICBwcml4ID0gNDtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMywgNCkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcImRoMTQwXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiRHJhcCBob3Vzc2UgMTQwIGNtXCI7XG4gICAgICBwcml4ID0gNztcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMiwgMSk7IChTZWpvdXIsIDEpIF07XG4gICAgfTtcbiAgICB7XG4gICAgICBuYW1lID0gXCJkaGJiXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiRHJhcCBob3Vzc2UgYsOpYsOpXCI7XG4gICAgICBwcml4ID0gMjtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMSwgMSkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcImhjMXBcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJIb3Vzc2UgZGUgY291ZXR0ZSAxIHBsYWNlXCI7XG4gICAgICBwcml4ID0gNztcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMSwgMik7IChDaGFtYnJlMywgNCkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcImhjMnBcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJIb3Vzc2UgZGUgY291ZXR0ZSAyIHBsYWNlc1wiO1xuICAgICAgcHJpeCA9IDEwO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKENoYW1icmUyLCAxKTsgKFNlam91ciwgMSkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcImhjYmJcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJIb3Vzc2UgZGUgY291ZXR0ZSBiw6liw6lcIjtcbiAgICAgIHByaXggPSAzO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKENoYW1icmUxLCAxKSBdO1xuICAgIH07XG4gICAge1xuICAgICAgbmFtZSA9IFwibGl0YmJcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJMaXQgYsOpYsOpXCI7XG4gICAgICBwcml4ID0gODtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMSwgMSkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInBtODBcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJQcm90w6hnZSBtYXRlbGFzIDgwIGNtXCI7XG4gICAgICBwcml4ID0gMDtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMSwgMikgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInBtOTBcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJQcm90w6hnZSBtYXRlbGFzIDkwIGNtXCI7XG4gICAgICBwcml4ID0gMDtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChDaGFtYnJlMywgNCkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInBtMTQwXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiUHJvdMOoZ2UgbWF0ZWxhcyAxNDAgY21cIjtcbiAgICAgIHByaXggPSAwO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKENoYW1icmUyLCAxKTsgKFNlam91ciwgMSkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInBtYmJcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJQcm90w6hnZSBtYXRlbGFzIGLDqWLDqVwiO1xuICAgICAgcHJpeCA9IDA7XG4gICAgICBkaXNwb25pYmlsaXRlID0gWyAoQ2hhbWJyZTEsIDEpIF07XG4gICAgfTtcbiAgICB7XG4gICAgICBuYW1lID0gXCJ0YWllXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiVGFpZSBk4oCZb3JlaWxsZXJcIjtcbiAgICAgIHByaXggPSAxO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9XG4gICAgICAgIFsgKENoYW1icmUxLCA0KTsgKENoYW1icmUyLCA0KTsgKENoYW1icmUzLCA4KTsgKFNlam91ciwgNCkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcImRvdWNoZVwiO1xuICAgICAgZGVzaWduYXRpb24gPSBcIkRyYXAgZGUgZG91Y2hlXCI7XG4gICAgICBwcml4ID0gMjtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChTZGIxLCAzKTsgKFNkYjIsIDMpIF07XG4gICAgfTtcbiAgICB7XG4gICAgICBuYW1lID0gXCJnYW50XCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiR2FudCBkZSB0b2lsZXR0ZVwiO1xuICAgICAgcHJpeCA9IDE7XG4gICAgICBkaXNwb25pYmlsaXRlID0gWyAoU2RiMSwgNCk7IChTZGIyLCA2KSBdO1xuICAgIH07XG4gICAge1xuICAgICAgbmFtZSA9IFwic2VydlwiO1xuICAgICAgZGVzaWduYXRpb24gPSBcIlNlcnZpZXR0ZSBkZSB0b2lsZXR0ZVwiO1xuICAgICAgcHJpeCA9IDE7XG4gICAgICBkaXNwb25pYmlsaXRlID0gWyAoU2RiMSwgNCk7IChTZGIyLCA2KSBdO1xuICAgIH07XG4gICAge1xuICAgICAgbmFtZSA9IFwiaW52XCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiU2VydmlldHRlIGludml0w6lzXCI7XG4gICAgICBwcml4ID0gMTtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChTZGIxLCAxKTsgKFNkYjIsIDEpIF07XG4gICAgfTtcbiAgICB7XG4gICAgICBuYW1lID0gXCJ0YXBpc1wiO1xuICAgICAgZGVzaWduYXRpb24gPSBcIlRhcGlzIGRlIGRvdWNoZVwiO1xuICAgICAgcHJpeCA9IDI7XG4gICAgICBkaXNwb25pYmlsaXRlID0gWyAoU2RiMSwgMik7IChTZGIyLCAyKSBdO1xuICAgIH07XG4gICAge1xuICAgICAgbmFtZSA9IFwibWFpbnNcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJFc3N1aWUtbWFpbnNcIjtcbiAgICAgIHByaXggPSAxO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKFNlam91ciwgMikgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInRhYmxlXCI7XG4gICAgICBkZXNpZ25hdGlvbiA9IFwiU2VydmlldHRlcyBkZSB0YWJsZVwiO1xuICAgICAgcHJpeCA9IDE7XG4gICAgICBkaXNwb25pYmlsaXRlID0gWyAoU2Vqb3VyLCAxMCkgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcInRvcmNob25cIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJUb3JjaG9ucyDDoCB2YWlzc2VsbGVcIjtcbiAgICAgIHByaXggPSAxO1xuICAgICAgZGlzcG9uaWJpbGl0ZSA9IFsgKFNlam91ciwgMikgXTtcbiAgICB9O1xuICAgIHtcbiAgICAgIG5hbWUgPSBcIm1pY3JvZmlicmVcIjtcbiAgICAgIGRlc2lnbmF0aW9uID0gXCJUb3JjaG9ucyBtaWNyb2ZpYnJlXCI7XG4gICAgICBwcml4ID0gMDtcbiAgICAgIGRpc3BvbmliaWxpdGUgPSBbIChTZGIxLCAyKTsgKFNkYjIsIDIpOyAoU2Vqb3VyLCAyKSBdO1xuICAgIH07XG4gIF1cblxuIixudWxsLG51bGwsIm1vZHVsZSBJTCA9IEludmVudGFpcmVfbGluZ2VcblxubGV0IHNldF9zdHJpbmdfaW5wdXRfYnlfaWQgbm0gdiA9XG4gIG1hdGNoXG4gICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIG5tXG4gICAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5Db2VyY2VUby5pbnB1dFxuICB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgaW5wIC0+IGlucCMjLnZhbHVlIDo9IEpzX29mX29jYW1sLkpzLnN0cmluZyB2XG5cbmxldCByZWFkX3N0cmluZ19pbnB1dF9ieV9pZCBubSA9XG4gIG1hdGNoXG4gICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIG5tXG4gICAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5Db2VyY2VUby5pbnB1dFxuICB3aXRoXG4gIHwgTm9uZSAtPiBcIlwiXG4gIHwgU29tZSBpbnAgLT4gaW5wIyMudmFsdWUgfD4gSnNfb2Zfb2NhbWwuSnMudG9fc3RyaW5nXG5cbmxldCB6ZXJvX2ludF9pbnB1dF9ieV9pZCBubSA9XG4gIG1hdGNoXG4gICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIG5tXG4gICAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5Db2VyY2VUby5zZWxlY3RcbiAgd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIGlucCAtPiBpbnAjIy52YWx1ZSA6PSAwIHw+IHN0cmluZ19vZl9pbnQgfD4gSnNfb2Zfb2NhbWwuSnMuc3RyaW5nXG5cbmxldCByZWFkX2ludF9pbnB1dF9ieV9pZCBubSA9XG4gIG1hdGNoXG4gICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIG5tXG4gICAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5Db2VyY2VUby5zZWxlY3RcbiAgd2l0aFxuICB8IE5vbmUgLT4gMFxuICB8IFNvbWUgaW5wIC0+IGlucCMjLnZhbHVlIHw+IEpzX29mX29jYW1sLkpzLnRvX3N0cmluZyB8PiBpbnRfb2Zfc3RyaW5nXG5cbmxldCBzZXRfdGRfYnlfaWQgbm0gdiA9XG4gIG1hdGNoXG4gICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIG5tXG4gICAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5Db2VyY2VUby50ZFxuICB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgdGQgLT4gdGQjIy5pbm5lckhUTUwgOj0gSnNfb2Zfb2NhbWwuSnMuc3RyaW5nIHZcblxubGV0IGZpZWxkX2lkX2J5X2ZvdXJuaXR1cmUgZiA9XG4gIGxldCBvcGVuIElMIGluXG4gIGYuZGlzcG9uaWJpbGl0ZVxuICB8PiBMaXN0Lm1hcCAoZnVuIChwLCBfKSAtPiBmLm5hbWUgXiBcIl9cIiBeIHNob3J0X3N0cmluZ19vZl9waWVjZSBwKVxuXG5sZXQgZmllbGRfaWRfYW5kX3BpZWNlX2J5X2ZvdXJuaXR1cmUgZiA9XG4gIGxldCBvcGVuIElMIGluXG4gIGYuZGlzcG9uaWJpbGl0ZVxuICB8PiBMaXN0Lm1hcCAoZnVuIChwLCBfKSAtPlxuICAgICAgICAgKGYubmFtZSBeIFwiX1wiIF4gc2hvcnRfc3RyaW5nX29mX3BpZWNlIHAsIGxvbmdfc3RyaW5nX29mX3BpZWNlIHApKVxuXG5sZXQgYWxsX25hbWVzID0gSUwuZm91cm5pdHVyZXMgfD4gTGlzdC5tYXAgZmllbGRfaWRfYnlfZm91cm5pdHVyZSB8PiBMaXN0LmNvbmNhdFxuXG4oKiBNZXRzIMOgIGpvdXIgbGUgY29ycHMgZHUgbWFpbCAqKVxubGV0IGVtYWlsX2JvZHkgKCkgPVxuICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgNTAwIGluXG4gIFByaW50Zi5icHJpbnRmIGJcbiAgICBcIi0tLS0tIFLDqXNlcnZhdGlvbiBsaW5nZSBEdWJ1dmFsLCBMZXMgdGVycmFzc2VzIGRlcyBDaG9zZWF1eCwgQXBwYXJ0ZW1lbnQgXFxcbiAgICAgQjYgLS0tLS0lJTBBXCI7XG4gIFByaW50Zi5icHJpbnRmIGIgXCJMb2NhdGFpcmUgOiAlcyUlMEFcIiAocmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJub21fcHJlbm9tXCIpO1xuICBQcmludGYuYnByaW50ZiBiIFwiRGF0ZSBk4oCZYXJyaXbDqWUgOiAlcyUlMEFcIlxuICAgIChyZWFkX3N0cmluZ19pbnB1dF9ieV9pZCBcImFycml2ZWVcIik7XG4gIFByaW50Zi5icHJpbnRmIGIgXCJEYXRlIGRlIGTDqXBhcnQgOiAlcyUlMEFcIiAocmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJkZXBhcnRcIik7XG4gIExpc3QuZmlsdGVyX21hcFxuICAgIChmdW4gZiAtPlxuICAgICAgZmllbGRfaWRfYW5kX3BpZWNlX2J5X2ZvdXJuaXR1cmUgZlxuICAgICAgfD4gTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgKGZ1biAocywgZGV0YWlsKSAoZmllbGRfaWQsIHNob3J0KSAtPlxuICAgICAgICAgICAgIGxldCBxID0gcmVhZF9pbnRfaW5wdXRfYnlfaWQgZmllbGRfaWQgaW5cbiAgICAgICAgICAgICAoIHMgKyBxLFxuICAgICAgICAgICAgICAgaWYgcSA+IDAgdGhlbiAoc2hvcnQgXiBcIiA6IFwiIF4gc3RyaW5nX29mX2ludCBxKSA6OiBkZXRhaWxcbiAgICAgICAgICAgICAgIGVsc2UgZGV0YWlsICkpXG4gICAgICAgICAgICgwLCBbXSlcbiAgICAgIHw+IGZ1bmN0aW9uXG4gICAgICB8IDAsIF8gLT4gTm9uZVxuICAgICAgfCBxLCBkZXRhaWwgLT4gU29tZSAoZi5kZXNpZ25hdGlvbiwgcSwgZGV0YWlsKSlcbiAgICBJTC5mb3Vybml0dXJlc1xuICB8PiBMaXN0Lml0ZXIgKGZ1biAoZGVzY3IsIHEsIGRldGFpbCkgLT5cbiAgICAgICAgIFByaW50Zi5icHJpbnRmIGIgXCLigJQgJWQgJXMlcyUlMEFcIiBxIGRlc2NyXG4gICAgICAgICAgICggbWF0Y2ggZGV0YWlsIHdpdGhcbiAgICAgICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICAgICAgIHwgXyAtPiBQcmludGYuc3ByaW50ZiBcIiAoJXMpXCIgKFN0cmluZy5jb25jYXQgXCIsIFwiIGRldGFpbCkgKSk7XG4gIFByaW50Zi5icHJpbnRmIGIgXCIlJTBBVG90YWwgOiAlZCDigqwlJTBBXCJcbiAgICAoTGlzdC5mb2xkX2xlZnRcbiAgICAgICAoZnVuIHRvdGFsIGYgLT5cbiAgICAgICAgIGZpZWxkX2lkX2J5X2ZvdXJuaXR1cmUgZlxuICAgICAgICAgfD4gTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgKGZ1biBzIGZpZWxkX2lkIC0+IHMgKyByZWFkX2ludF9pbnB1dF9ieV9pZCBmaWVsZF9pZClcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgfD4gKCAqICkgZi5JTC5wcml4IHw+ICggKyApIHRvdGFsKVxuICAgICAgIDAgSUwuZm91cm5pdHVyZXMpO1xuICBCdWZmZXIuY29udGVudHMgYlxuXG4oKiBNZXRzIMOgIGpvdXIgbGUgY29ycHMgZHUgbWFpbCAqKVxubGV0IHJlc3VtZV9ib2R5ICgpID1cbiAgVHl4bWwuSHRtbC4oXG4gICAgZGl2XG4gICAgICBbXG4gICAgICAgIHBcbiAgICAgICAgICBbXG4gICAgICAgICAgICBiIFsgdHh0IFwiTG9jYXRhaXJlIDogXCI7IHR4dCAocmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJub21fcHJlbm9tXCIpIF07XG4gICAgICAgICAgXTtcbiAgICAgICAgcFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGJcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHR4dCBcIkRhdGUgZOKAmWFycml2w6llIDogXCI7XG4gICAgICAgICAgICAgICAgdHh0IChyZWFkX3N0cmluZ19pbnB1dF9ieV9pZCBcImFycml2ZWVcIik7XG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgXTtcbiAgICAgICAgcFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGJcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHR4dCBcIkRhdGUgZGUgZMOpcGFydCA6IFwiOyB0eHQgKHJlYWRfc3RyaW5nX2lucHV0X2J5X2lkIFwiZGVwYXJ0XCIpO1xuICAgICAgICAgICAgICBdO1xuICAgICAgICAgIF07XG4gICAgICAgIGJyICgpO1xuICAgICAgICB1bFxuICAgICAgICAgICggTGlzdC5maWx0ZXJfbWFwXG4gICAgICAgICAgICAgIChmdW4gZiAtPlxuICAgICAgICAgICAgICAgIGZpZWxkX2lkX2FuZF9waWVjZV9ieV9mb3Vybml0dXJlIGZcbiAgICAgICAgICAgICAgICB8PiBMaXN0LmZvbGRfbGVmdFxuICAgICAgICAgICAgICAgICAgICAgKGZ1biAocywgZGV0YWlsKSAoZmllbGRfaWQsIHNob3J0KSAtPlxuICAgICAgICAgICAgICAgICAgICAgICBsZXQgcSA9IHJlYWRfaW50X2lucHV0X2J5X2lkIGZpZWxkX2lkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICggcyArIHEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWYgcSA+IDAgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0IF4gXCIgOiBcIiBeIHN0cmluZ19vZl9pbnQgcSkgOjogZGV0YWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZXRhaWwgKSlcbiAgICAgICAgICAgICAgICAgICAgICgwLCBbXSlcbiAgICAgICAgICAgICAgICB8PiBmdW5jdGlvblxuICAgICAgICAgICAgICAgIHwgMCwgXyAtPiBOb25lXG4gICAgICAgICAgICAgICAgfCBxLCBkZXRhaWwgLT4gU29tZSAoZi5kZXNpZ25hdGlvbiwgcSwgTGlzdC5yZXYgZGV0YWlsKSlcbiAgICAgICAgICAgICAgSUwuZm91cm5pdHVyZXNcbiAgICAgICAgICB8PiBMaXN0Lm1hcCAoZnVuIChkZXNjciwgcSwgZGV0YWlsKSAtPlxuICAgICAgICAgICAgICAgICBsaVxuICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgIHR4dCAoc3RyaW5nX29mX2ludCBxKTtcbiAgICAgICAgICAgICAgICAgICAgIHR4dCBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgIHR4dCBkZXNjcjtcbiAgICAgICAgICAgICAgICAgICAgIHR4dFxuICAgICAgICAgICAgICAgICAgICAgICAoIG1hdGNoIGRldGFpbCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICB8IF8gLT4gUHJpbnRmLnNwcmludGYgXCIgKCVzKVwiIChTdHJpbmcuY29uY2F0IFwiLCBcIiBkZXRhaWwpXG4gICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgXSkgKTtcbiAgICAgICAgYnIgKCk7XG4gICAgICAgIHBcbiAgICAgICAgICBbXG4gICAgICAgICAgICBiIFsgdHh0IFwiVG90YWwgOiBcIiBdO1xuICAgICAgICAgICAgdHh0XG4gICAgICAgICAgICAgICggTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAgIChmdW4gdG90YWwgZiAtPlxuICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZF9ieV9mb3Vybml0dXJlIGZcbiAgICAgICAgICAgICAgICAgICAgfD4gTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuIHMgZmllbGRfaWQgLT4gcyArIHJlYWRfaW50X2lucHV0X2J5X2lkIGZpZWxkX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgfD4gKCAqICkgZi5JTC5wcml4IHw+ICggKyApIHRvdGFsKVxuICAgICAgICAgICAgICAgICAgMCBJTC5mb3Vybml0dXJlc1xuICAgICAgICAgICAgICB8PiBzdHJpbmdfb2ZfaW50ICk7XG4gICAgICAgICAgICB0eHQgXCLCoOKCrFwiO1xuICAgICAgICAgIF07XG4gICAgICBdKVxuICB8PiBGb3JtYXQuYXNwcmludGYgXCIlYVwiIChUeXhtbC5IdG1sLnBwX2VsdCAoKSlcbiAgfD4gSnNfb2Zfb2NhbWwuSnMuc3RyaW5nXG5cbigqIFByaW50Zi5icHJpbnRmIGIgXCJMb2NhdGFpcmUgOiAlcyUlMEFcIiAocmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJub21fcHJlbm9tXCIpO1xuICogUHJpbnRmLmJwcmludGYgYiBcIkRhdGUgZOKAmWFycml2w6llIDogJXMlJTBBXCJcbiAqICAgKHJlYWRfc3RyaW5nX2lucHV0X2J5X2lkIFwiYXJyaXZlZVwiKTtcbiAqIFByaW50Zi5icHJpbnRmIGIgXCJEYXRlIGRlIGTDqXBhcnQgOiAlcyUlMEFcIiAocmVhZF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJkZXBhcnRcIik7XG4gKiBMaXN0LmZpbHRlcl9tYXBcbiAqICAgKGZ1biBmIC0+XG4gKiAgICAgZmllbGRfaWRfYW5kX3BpZWNlX2J5X2ZvdXJuaXR1cmUgZlxuICogICAgIHw+IExpc3QuZm9sZF9sZWZ0XG4gKiAgICAgICAgICAoZnVuIChzLCBkZXRhaWwpIChmaWVsZF9pZCwgc2hvcnQpIC0+XG4gKiAgICAgICAgICAgIGxldCBxID0gcmVhZF9pbnRfaW5wdXRfYnlfaWQgZmllbGRfaWQgaW5cbiAqICAgICAgICAgICAgKCBzICsgcSxcbiAqICAgICAgICAgICAgICBpZiBxID4gMCB0aGVuIChzaG9ydCBeIFwiIDogXCIgXiBzdHJpbmdfb2ZfaW50IHEpIDo6IGRldGFpbFxuICogICAgICAgICAgICAgIGVsc2UgZGV0YWlsICkpXG4gKiAgICAgICAgICAoMCwgW10pXG4gKiAgICAgfD4gZnVuY3Rpb25cbiAqICAgICB8IDAsIF8gLT4gTm9uZVxuICogICAgIHwgcSwgZGV0YWlsIC0+IFNvbWUgKGYuZGVzaWduYXRpb24sIHEsIGRldGFpbCkpXG4gKiAgIElMLmZvdXJuaXR1cmVzXG4gKiB8PiBMaXN0Lml0ZXIgKGZ1biAoZGVzY3IsIHEsIGRldGFpbCkgLT5cbiAqICAgICAgICBQcmludGYuYnByaW50ZiBiIFwi4oCUICVkICVzJXMlJTBBXCIgcSBkZXNjclxuICogICAgICAgICAgKCBtYXRjaCBkZXRhaWwgd2l0aFxuICogICAgICAgICAgfCBbXSAtPiBcIlwiXG4gKiAgICAgICAgICB8IF8gLT4gUHJpbnRmLnNwcmludGYgXCIgKCVzKVwiIChTdHJpbmcuY29uY2F0IFwiLCBcIiBkZXRhaWwpICkpO1xuICogUHJpbnRmLmJwcmludGYgYiBcIiUlMEFUb3RhbCA6ICVkIOKCrCUlMEFcIlxuICogICAoTGlzdC5mb2xkX2xlZnRcbiAqICAgICAgKGZ1biB0b3RhbCBmIC0+XG4gKiAgICAgICAgZmllbGRfaWRfYnlfZm91cm5pdHVyZSBmXG4gKiAgICAgICAgfD4gTGlzdC5mb2xkX2xlZnRcbiAqICAgICAgICAgICAgIChmdW4gcyBmaWVsZF9pZCAtPiBzICsgcmVhZF9pbnRfaW5wdXRfYnlfaWQgZmllbGRfaWQpXG4gKiAgICAgICAgICAgICAwXG4gKiAgICAgICAgfD4gKCAqICkgZi5wcml4IHw+ICggKyApIHRvdGFsKVxuICogICAgICAwIElMLmZvdXJuaXR1cmVzKTtcbiAqIEJ1ZmZlci5jb250ZW50cyBiICopXG5cbmxldCB1cGRhdGVfbXNnICgpID1cbiAgbGV0ICgpID1cbiAgICBtYXRjaFxuICAgICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuZ2V0RWxlbWVudEJ5SWRfY29lcmNlIFwiYmVudm9pXCJcbiAgICAgICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuQ29lcmNlVG8uYVxuICAgIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYSAtPlxuICAgICAgICBhIyMuaHJlZiA6PVxuICAgICAgICAgIEpzX29mX29jYW1sLkpzLnN0cmluZ1xuICAgICAgICAgICAgKCBcIm1haWx0bzpcIiBeIElMLmRlc3RpbmF0YWlyZXNcbiAgICAgICAgICAgIF4gXCI/c3ViamVjdD1Sw6lzZXJ2YXRpb24gbGluZ2UgRHVidXZhbCZib2R5PVwiIF4gZW1haWxfYm9keSAoKSApXG4gIGluXG5cbiAgbWF0Y2hcbiAgICBKc19vZl9vY2FtbC5Eb21faHRtbC5nZXRFbGVtZW50QnlJZF9jb2VyY2UgXCJyZXN1bWVcIlxuICAgICAgSnNfb2Zfb2NhbWwuRG9tX2h0bWwuQ29lcmNlVG8uZGl2XG4gIHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSByZXN1bWUgLT4gcmVzdW1lIyMuaW5uZXJIVE1MIDo9IHJlc3VtZV9ib2R5ICgpXG5cbigqIFJlLWNhbGN1bCAqKVxubGV0IGNvbXB1dGUgKCkgPVxuICBMaXN0Lml0ZXJcbiAgICAoZnVuIGYgLT5cbiAgICAgIGZpZWxkX2lkX2J5X2ZvdXJuaXR1cmUgZlxuICAgICAgfD4gTGlzdC5mb2xkX2xlZnQgKGZ1biBzIGZpZWxkX2lkIC0+IHMgKyByZWFkX2ludF9pbnB1dF9ieV9pZCBmaWVsZF9pZCkgMFxuICAgICAgfD4gZnVuIHF0ZSAtPlxuICAgICAgc2V0X3RkX2J5X2lkIGYuSUwubmFtZSAoKHF0ZSAqIGYucHJpeCB8PiBzdHJpbmdfb2ZfaW50KSBeIFwiwqDigqxcIik7XG4gICAgICBzdHJpbmdfb2ZfaW50IHF0ZSB8PiBzZXRfdGRfYnlfaWQgKGYuSUwubmFtZSBeIFwiX3F0ZVwiKSlcbiAgICBJTC5mb3Vybml0dXJlcztcbiAgTGlzdC5mb2xkX2xlZnRcbiAgICAoZnVuIHRvdGFsIGYgLT5cbiAgICAgIGZpZWxkX2lkX2J5X2ZvdXJuaXR1cmUgZlxuICAgICAgfD4gTGlzdC5mb2xkX2xlZnQgKGZ1biBzIGZpZWxkX2lkIC0+IHMgKyByZWFkX2ludF9pbnB1dF9ieV9pZCBmaWVsZF9pZCkgMFxuICAgICAgfD4gKCAqICkgZi5JTC5wcml4IHw+ICggKyApIHRvdGFsKVxuICAgIDAgSUwuZm91cm5pdHVyZXNcbiAgfD4gc3RyaW5nX29mX2ludCB8PiBGdW4uZmxpcCAoIF4gKSBcIsKg4oKsXCIgfD4gc2V0X3RkX2J5X2lkIFwidG90YWxcIjtcbiAgdXBkYXRlX21zZyAoKVxuXG5sZXQgcmVzZXRfZm9ybSAoKSA9XG4gIGxldCBkb2l0ID1cbiAgICBKc19vZl9vY2FtbC5Eb21faHRtbC53aW5kb3cjI2NvbmZpcm1cbiAgICAgIChKc19vZl9vY2FtbC5Kcy5zdHJpbmcgXCJSw6lpbml0aWFsaXNlciBjb21wbMOodGVtZW50IGxlIGZvcm11bGFpcmUgP1wiKVxuICAgIHw+IEpzX29mX29jYW1sLkpzLnRvX2Jvb2xcbiAgaW5cbiAgaWYgZG9pdCB0aGVuIChcbiAgICBzZXRfc3RyaW5nX2lucHV0X2J5X2lkIFwibm9tX3ByZW5vbVwiIFwiXCI7XG4gICAgc2V0X3N0cmluZ19pbnB1dF9ieV9pZCBcImFycml2ZWVcIiBcIlwiO1xuICAgIHNldF9zdHJpbmdfaW5wdXRfYnlfaWQgXCJkZXBhcnRcIiBcIlwiO1xuICAgIGFsbF9uYW1lcyB8PiBMaXN0Lml0ZXIgemVyb19pbnRfaW5wdXRfYnlfaWQ7XG4gICAgY29tcHV0ZSAoKSApXG5cbmxldCBfID1cbiAgSnNfb2Zfb2NhbWwuSnMuZXhwb3J0IFwiY29tcHV0ZVwiIGNvbXB1dGU7XG4gIEpzX29mX29jYW1sLkpzLmV4cG9ydCBcInJlc2V0X2Zvcm1cIiByZXNldF9mb3JtXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEVuc3VyZSB0aGF0IFthdF9leGl0XSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHByb2dyYW0gKilcblxubGV0IF8gPSBkb19hdF9leGl0KClcbiJdfQ==
//]]>

  </script>
  <div>
   <p><b>Tarifs de location du linge — SCI Dubuval — 2022-2023</b></p>
   <br/>
   <p>
    <b>
     Si nécessaire, complétez ce formulaire dès la réservation, puis
     cliquez sur le bouton « Envoi par courriel » situé en bas de page
     pour nous l’envoyer par courriel.
    </b>
   </p>
   <p>Votre demande est modifiable jusqu’à 7 jours avant votre arrivée.
   </p>
   <p>
    <b>
     Le montant sera réglé directement à la Société Guy Grange le jour
     de votre arrivée.
    </b>
   </p><br/>
   <p>
    <button type="button" onclick="reset_form()">Réinitialiser le formulaire
    </button>
   </p><br/>
   <table>
    <tr><td><b>Nom et prénom du locataire : </b></td>
     <td><input id="nom_prenom" onchange="compute()"/></td>
    </tr>
    <tr><td><b>Date d’arrivée (aaaa-mm-jj) : </b></td>
     <td><input id="arrivee" onchange="compute()"/></td>
    </tr>
    <tr><td><b>Date de départ (aaaa-mm-jj) : </b></td>
     <td><input id="depart" onchange="compute()"/></td>
    </tr>
   </table>
  </div>
  <div><br/>
   <table class="montablo">
    <tr class="gras"><td></td><td>Prix unitaire</td><td>Chambre 1</td>
     <td>Chambre 2</td><td>Chambre 3</td><td>Séjour</td>
     <td>Salle de bains 1</td><td>Salle de bains 2</td><td>Quantités</td>
     <td>Totaux</td>
    </tr>
    <tr><td class="gras">Drap housse 80 cm</td><td id="dh80_prix">4 €</td>
     <td>
      <select id="dh80_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="dh80_qte"></td><td id="dh80"></td>
    </tr>
    <tr><td class="gras">Drap housse 90 cm</td><td id="dh90_prix">4 €</td>
     <td></td><td></td>
     <td>
      <select id="dh90_ch3" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td><td></td><td></td><td></td><td id="dh90_qte"></td>
     <td id="dh90"></td>
    </tr>
    <tr><td class="gras">Drap housse 140 cm</td>
     <td id="dh140_prix">7 €</td><td></td>
     <td>
      <select id="dh140_ch2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
      </select>
     </td><td></td>
     <td>
      <select id="dh140_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td id="dh140_qte"></td><td id="dh140"></td>
    </tr>
    <tr><td class="gras">Drap housse bébé</td><td id="dhbb_prix">2 €</td>
     <td>
      <select id="dhbb_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="dhbb_qte"></td><td id="dhbb"></td>
    </tr>
    <tr><td class="gras">Housse de couette 1 place</td>
     <td id="hc1p_prix">7 €</td>
     <td>
      <select id="hc1p_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
      </select>
     </td><td></td>
     <td>
      <select id="hc1p_ch3" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td><td></td><td></td><td></td><td id="hc1p_qte"></td>
     <td id="hc1p"></td>
    </tr>
    <tr><td class="gras">Housse de couette 2 places</td>
     <td id="hc2p_prix">10 €</td><td></td>
     <td>
      <select id="hc2p_ch2" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td>
     <td>
      <select id="hc2p_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td id="hc2p_qte"></td><td id="hc2p"></td>
    </tr>
    <tr><td class="gras">Housse de couette bébé</td>
     <td id="hcbb_prix">3 €</td>
     <td>
      <select id="hcbb_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="hcbb_qte"></td><td id="hcbb"></td>
    </tr>
    <tr><td class="gras">Lit bébé</td><td id="litbb_prix">8 €</td>
     <td>
      <select id="litbb_ch1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="litbb_qte"></td><td id="litbb"></td>
    </tr>
    <tr><td class="gras">Protège matelas 80 cm</td>
     <td id="pm80_prix">0 €</td>
     <td>
      <select id="pm80_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="pm80_qte"></td><td id="pm80"></td>
    </tr>
    <tr><td class="gras">Protège matelas 90 cm</td>
     <td id="pm90_prix">0 €</td><td></td><td></td>
     <td>
      <select id="pm90_ch3" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td><td></td><td></td><td></td><td id="pm90_qte"></td>
     <td id="pm90"></td>
    </tr>
    <tr><td class="gras">Protège matelas 140 cm</td>
     <td id="pm140_prix">0 €</td><td></td>
     <td>
      <select id="pm140_ch2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
      </select>
     </td><td></td>
     <td>
      <select id="pm140_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td id="pm140_qte"></td><td id="pm140"></td>
    </tr>
    <tr><td class="gras">Protège matelas bébé</td>
     <td id="pmbb_prix">0 €</td>
     <td>
      <select id="pmbb_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td></td><td></td><td></td><td></td><td></td>
     <td id="pmbb_qte"></td><td id="pmbb"></td>
    </tr>
    <tr><td class="gras">Taie d’oreiller</td><td id="taie_prix">1 €</td>
     <td>
      <select id="taie_ch1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td>
     <td>
      <select id="taie_ch2" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td>
     <td>
      <select id="taie_ch3" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
       <option value="5">5</option><option value="6">6</option>
       <option value="7">7</option><option value="8">8</option>
      </select>
     </td>
     <td>
      <select id="taie_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
      </select>
     </td><td></td><td></td><td id="taie_qte"></td><td id="taie"></td>
    </tr>
    <tr><td class="gras">Drap de douche</td><td id="douche_prix">2 €</td>
     <td></td><td></td><td></td><td></td>
     <td>
      <select id="douche_sdb1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
      </select>
     </td>
     <td>
      <select id="douche_sdb2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
      </select>
     </td><td id="douche_qte"></td><td id="douche"></td>
    </tr>
    <tr><td class="gras">Gant de toilette</td><td id="gant_prix">1 €</td>
     <td></td><td></td><td></td><td></td>
     <td>
      <select id="gant_sdb1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
       <option value="4">4</option>
      </select>
     </td>
     <td>
      <select id="gant_sdb2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
       <option value="4">4</option><option value="5">5</option>
       <option value="6">6</option>
      </select>
     </td><td id="gant_qte"></td><td id="gant"></td>
    </tr>
    <tr><td class="gras">Serviette de toilette</td>
     <td id="serv_prix">1 €</td><td></td><td></td><td></td><td></td>
     <td>
      <select id="serv_sdb1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
       <option value="4">4</option>
      </select>
     </td>
     <td>
      <select id="serv_sdb2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option><option value="3">3</option>
       <option value="4">4</option><option value="5">5</option>
       <option value="6">6</option>
      </select>
     </td><td id="serv_qte"></td><td id="serv"></td>
    </tr>
    <tr><td class="gras">Serviette invités</td><td id="inv_prix">1 €</td>
     <td></td><td></td><td></td><td></td>
     <td>
      <select id="inv_sdb1" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td>
     <td>
      <select id="inv_sdb2" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option>
      </select>
     </td><td id="inv_qte"></td><td id="inv"></td>
    </tr>
    <tr><td class="gras">Tapis de douche</td><td id="tapis_prix">2 €</td>
     <td></td><td></td><td></td><td></td>
     <td>
      <select id="tapis_sdb1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td>
     <td>
      <select id="tapis_sdb2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td><td id="tapis_qte"></td><td id="tapis"></td>
    </tr>
    <tr><td class="gras">Essuie-mains</td><td id="mains_prix">1 €</td>
     <td></td><td></td><td></td>
     <td>
      <select id="mains_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
      </select>
     </td><td></td><td></td><td id="mains_qte"></td><td id="mains"></td>
    </tr>
    <tr><td class="gras">Serviettes de table</td>
     <td id="table_prix">1 €</td><td></td><td></td><td></td>
     <td>
      <select id="table_sj" onchange="compute()"><option value="0">0</option>
       <option value="1">1</option><option value="2">2</option>
       <option value="3">3</option><option value="4">4</option>
       <option value="5">5</option><option value="6">6</option>
       <option value="7">7</option><option value="8">8</option>
       <option value="9">9</option><option value="10">10</option>
      </select>
     </td><td></td><td></td><td id="table_qte"></td><td id="table"></td>
    </tr>
    <tr><td class="gras">Torchons à vaisselle</td>
     <td id="torchon_prix">1 €</td><td></td><td></td><td></td>
     <td>
      <select id="torchon_sj" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td><td></td><td></td><td id="torchon_qte"></td><td id="torchon"></td>
    </tr>
    <tr><td class="gras">Torchons microfibre</td>
     <td id="microfibre_prix">0 €</td><td></td><td></td><td></td>
     <td>
      <select id="microfibre_sj" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td>
     <td>
      <select id="microfibre_sdb1" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td>
     <td>
      <select id="microfibre_sdb2" onchange="compute()">
       <option value="0">0</option><option value="1">1</option>
       <option value="2">2</option>
      </select>
     </td><td id="microfibre_qte"></td><td id="microfibre"></td>
    </tr>
    <tr><td class="gras">Totaux</td><td></td><td></td><td></td><td></td>
     <td></td><td></td><td></td><td></td><td id="total"></td>
    </tr>
    <tr class="gras"><td></td><td>Prix unitaire</td><td>Chambre 1</td>
     <td>Chambre 2</td><td>Chambre 3</td><td>Séjour</td>
     <td>Salle de bains 1</td><td>Salle de bains 2</td><td>Quantités</td>
     <td>Totaux</td>
    </tr>
   </table><br/>
   <a id="benvoi"><button type="button">Envoi par courriel</button></a>
   <p>
    Si jamais le bouton d’envoi par courriel ne fonctionne pas, vous pouvez
    nous envoyer une copie du résumé ci-dessous :
   </p><div id="resume"></div>
  </div>
 </body>