ETH Price: $3,428.50 (-5.41%)

Contract

0x7BE91e16353F46EA18a63831DD2EC792092511Ad
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Upgrade Cont...166745992023-02-21 4:47:35667 days ago1676954855IN
0x7BE91e16...2092511Ad
0 ETH0.0006018120.82202123
Set Upgrade Cont...166716052023-02-20 18:41:35668 days ago1676918495IN
0x7BE91e16...2092511Ad
0 ETH0.001830439.78880656
Set Upgrade Cont...166665642023-02-20 1:42:47668 days ago1676857367IN
0x7BE91e16...2092511Ad
0 ETH0.0004711619.74471885
Set Upgrade Cont...166665272023-02-20 1:35:11668 days ago1676856911IN
0x7BE91e16...2092511Ad
0 ETH0.0011527925.05903906
Set Rpc165859242023-02-08 18:46:59680 days ago1675882019IN
0x7BE91e16...2092511Ad
0 ETH0.0031069933.77793684

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OnchainCheckRenderer

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 6 : OnChainCheckRenderer.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.16;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./Compiler.sol";
import "./Base64.sol";
import "./IMetaDataURI.sol";

contract OnchainCheckRenderer is IMetaDataURI, Ownable {

  IDataChunkCompiler private compiler;
  address[9] private threeAddresses;
  string private rpc;
  uint256 private immutable MAX_MINT_GAS_PRICE = 1000000; // 1000 gwei mint would show all checks
  IMetaDataURI public upgradeContract;

  constructor(
    address _compiler,
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5,
    address chunk6,
    address chunk7,
    address chunk8,
    address chunk9
  ) {
    compiler = IDataChunkCompiler(_compiler);
    threeAddresses[0] = chunk1;
    threeAddresses[1] = chunk2;
    threeAddresses[2] = chunk3;
    threeAddresses[3] = chunk4;
    threeAddresses[4] = chunk5;
    threeAddresses[5] = chunk6;
    threeAddresses[6] = chunk7;
    threeAddresses[7] = chunk8;
    threeAddresses[8] = chunk9;
  }

  function setRpc(string memory _rpc) public onlyOwner {
    rpc = _rpc;
  }

  function setUpgradeContract(address _upgradeContract) public onlyOwner {
    upgradeContract = IMetaDataURI(_upgradeContract);
  }

  function tokenURI(uint256 tokenId, uint256 seed, uint24 gasPrice)
    public
    view
    returns (string memory)
  {
    if (upgradeContract != IMetaDataURI(address(0))) {
      return upgradeContract.tokenURI(tokenId, seed, gasPrice);
    }
    string memory threejs = compiler.compile9(
      threeAddresses[0],
      threeAddresses[1],
      threeAddresses[2],
      threeAddresses[3],
      threeAddresses[4],
      threeAddresses[5],
      threeAddresses[6],
      threeAddresses[7],
      threeAddresses[8]
    );

    string memory tokenIdStr = uint2str(tokenId);
    string memory gasPriceGweiStr = gasPriceToStr(gasPrice);
    string memory gasPriceIntegerInGweiStr = uint2str(
      gasPrice / 1000
    );
    bool isDark = seed % 2 == 0;
    string memory numberOfCheckMarks = uint2str(getNumberOfCheckMarks(seed, gasPrice));

    return
      string.concat(
        compiler.BEGIN_JSON(),
        string.concat(
          compiler.BEGIN_METADATA_VAR("animation_url", false),
          compiler.HTML_HEAD(),
          string.concat(
            compiler.BEGIN_SCRIPT_DATA_COMPRESSED(),
            threejs,
            compiler.END_SCRIPT_DATA_COMPRESSED(),
            compiler.BEGIN_SCRIPT(),
            compiler.SCRIPT_VAR("tokenId", tokenIdStr, true),
            compiler.SCRIPT_VAR("gasPrice", gasPriceGweiStr, true),
            compiler.SCRIPT_VAR(
              "rpc",
              string.concat("%2522", rpc, "%2522"),
              true
            ),
            compiler.END_SCRIPT()
          ),
          "%253Cstyle%253E%250A%2520%2520*%2520%257B%250A%2520%2520%2520%2520margin%253A%25200%253B%250A%2520%2520%2520%2520padding%253A%25200%253B%250A%2520%2520%257D%250A%2520%2520canvas%2520%257B%250A%2520%2520%2520%2520width%253A%2520100%2525%253B%250A%2520%2520%2520%2520height%253A%2520100%2525%253B%250A%2520%2520%257D%250A%253C%252Fstyle%253E%250A%253Cscript%253E%250A%2520%2520%2522use%2520strict%2522%253Bwindow.onload%253D()%253D%253E%257Blet%2520m%252Ca%253Ddocument.body%252Cc%253DgasPrice%252Cu%253D!1%253Bconst%2520G%253Dt%253D%253E%2560%253C%253Fxml%2520version%253D%25221.0%2522%2520encoding%253D%2522UTF-8%2522%253F%253E%250A%253Csvg%2520version%253D%25221.1%2522%2520viewBox%253D%25220%25200%252024%252024%2522%2520xmlns%253D%2522http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg%2522%253E%250A%253Cg%2520fill%253D%2522%2524%257Bt%257D%2522%253E%250A%253Cpath%2520d%253D%2522M22.25%252012c0-1.43-.88-2.67-2.19-3.34.46-1.39.2-2.9-.81-3.91s-2.52-1.27-3.91-.81c-.66-1.31-1.91-2.19-3.34-2.19s-2.67.88-3.33%25202.19c-1.4-.46-2.91-.2-3.92.81s-1.26%25202.52-.8%25203.91c-1.31.67-2.2%25201.91-2.2%25203.34s.89%25202.67%25202.2%25203.34c-.46%25201.39-.21%25202.9.8%25203.91s2.52%25201.26%25203.91.81c.67%25201.31%25201.91%25202.19%25203.34%25202.19s2.68-.88%25203.34-2.19c1.39.45%25202.9.2%25203.91-.81s1.27-2.52.81-3.91c1.31-.67%25202.19-1.91%25202.19-3.34zm-11.71%25204.2L6.8%252012.46l1.41-1.42%25202.26%25202.26%25204.8-5.23%25201.47%25201.36-6.2%25206.77z%2522%2520fill%253D%2522%25231d9bf0%2522%252F%253E%250A%253C%252Fg%253E%250A%253C%252Fsvg%253E%2560%252Cz%253Dt%253D%253E%257Bconst%2520o%253Dnew%2520THREE.TextureLoader().load(%2560data%253Aimage%252Fsvg%252Bxml%252C%2524%257BencodeURIComponent(t)%257D%2560)%252Cb%253Dnew%2520THREE.MeshBasicMaterial(%257Btransparent%253A!0%252Copacity%253A.65%252Ccolor%253A16777147%252Cblending%253ATHREE.AdditiveBlending%252Cmap%253Ao%257D)%252Ce%253Dnew%2520THREE.PlaneGeometry(128%252C128)%252Cd%253Dnew%2520THREE.Mesh(e%252Cb)%253Breturn%257Btexture%253Ao%252Cmaterial%253Ab%252Cgeometry%253Ae%252Cmesh%253Ad%257D%257D%252Cy%253Ddocument.createElement(%2522input%2522)%253By.type%253D%2522checkbox%2522%252Cy.id%253D%2522liveCheckbox%2522%253Bconst%2520h%253Ddocument.createElement(%2522label%2522)%253Bh.htmlFor%253D%2522liveCheckbox%2522%252Ch.innerText%253D%2522Live%2520update%2522%253Bconst%2520r%253Ddocument.createElement(%2522span%2522)%253Br.style.position%253D%2522absolute%2522%252Cr.style.bottom%253D%252210%2522%252Cr.style.left%253D%252210%2522%252Ch.style.color%253D%2522white%2522%252Ch.style.marginLeft%253D%252210px%2522%252Cr.appendChild(y)%252Cr.appendChild(h)%252Ca.appendChild(r)%252Cy.addEventListener(%2522change%2522%252Ct%253D%253E%257Bu%253Dt.target.checked%252Cu%2526%2526(M%253D0)%257D)%253Bconst%2520f%253Ddocument.createElement(%2522div%2522)%253Bf.style%253D%2522position%253A%2520absolute%253B%2520top%253A%252010%253B%2520right%253A%252010%253B%2520color%253A%2520white%2522%252Cf.innerText%253D%2560Gas%2520price%253A%2520%2524%257BgasPrice%257D%2520gwei%2560%252Ca.appendChild(f)%253Bconst%2520l%253Dt%253D%253E(t!%253D%253Dvoid%25200%2526%2526(m%253Dt%25252147483647)%253C%253D0%2526%2526(m%252B%253D2147483646)%252C((m%253D16807*m%25252147483647)-1)%252F2147483646)%253Bl(tokenId)%253Bconst%257Bwidth%253AR%252Cheight%253AE%257D%253Da.getBoundingClientRect()%253Blet%2520T%253DE%252F2%252Ci%253DE*2%252CP%253D0%253Bconst%2520s%253Dnew%2520THREE.PerspectiveCamera(80%252CR%252FE%252C1%252C3e3)%253Bs.position.z%253D1500%253Bfunction%2520A(t)%257Bt.isPrimary%2526%2526(P%253Dt.clientY-T)%257Dconst%2520n%253Dnew%2520THREE.Scene%253Bn.background%253Dnew%2520THREE.Color(0)%253Bconst%2520B%253Dnew%2520THREE.HemisphereLight(16777147%252C526368%252C1)%253Bn.add(B)%253Bconst%2520w%253Dnew%2520THREE.PointLight(16777147%252C1%252C1e3%252C0)%253Bw.position.set(0%252C0%252C150)%252Cw.lookAt(0%252C0%252C0)%252Cn.add(w)%253Bconst%2520p%253Dnew%2520THREE.WebGLRenderer(%257Bantialias%253A!0%257D)%253Bp.setPixelRatio(window.devicePixelRatio)%252Cp.setSize(R%252CE)%253Bconst%2520x%253Dnew%2520THREE.CylinderGeometry(50%252C100%252Ci%252C32%252C1%252C!0)%253Bx.translate(0%252Ci%252F2%252C0)%253Bconst%2520O%253Dnew%2520THREE.MeshPhongMaterial(%257Bcolor%253AMath.ceil(16777215*l())%252Cside%253ATHREE.DoubleSide%252CflatShading%253A!0%257D)%252Cv%253Dnew%2520THREE.Mesh(x%252CO)%253Bv.position.set(0%252Ci%252F2%252C0)%252Cn.add(v)%253Blet%2520g%253D%255B%255D%253Bconst%2520H%253Dz(G(%2522%25231d9bf0%2522))%253Bfunction%2520C()%257Bconst%2520t%253DDate.now()%252Co%253Dnew%2520THREE.Mesh(H.geometry%252CH.material)%253Bo.delay%253DMath.floor(5e3*Math.random())%252Bt%252Co.position.set(10-30*Math.random()%252C2e5%252C10-30*Math.random())%252Cg.push(o)%252Cn.add(o)%257Dfor(let%2520t%253D0%253Bt%253Cc%253Bt%252B%252B)C()%253Bconst%2520j%253D%255B%255D%252CI%253D10%252BMath.ceil(10*l())%252C%2524%253Dnew%2520THREE.SphereGeometry(2%252C8%252C8)%252Ck%253Dnew%2520THREE.MeshBasicMaterial%253Bk.color.set(16777215)%253Bfor(let%2520t%253D0%253Bt%253CI%253Bt%252B%252B)%257Bconst%2520o%253Dnew%2520THREE.Mesh(%2524%252Ck)%253Bo.position.set(1e3-2e3*l()%252C1e3-2e3*l()%252C1e3-2e3*l())%252Cj.push(o)%252Cn.add(o)%257Dfunction%2520S()%257Bconst%257Bwidth%253At%252Cheight%253Ao%257D%253Da.getBoundingClientRect()%253BT%253Do%252F2%252Ci%253Do*2%252Cs.aspect%253Dt%252Fo%252Cs.updateProjectionMatrix()%252Cp.setSize(t%252Co)%252Cv.position.set(0%252Ci%252F2%252C0)%257Da.appendChild(p.domElement)%252Ca.style.touchAction%253D%2522none%2522%252Ca.addEventListener(%2522pointermove%2522%252CA)%252Cwindow.addEventListener(%2522resize%2522%252CS)%252CS()%253Blet%2520M%253D240%253Bfunction%2520L()%257Bif(requestAnimationFrame(L)%252Cu%2526%2526M--%253C0%2526%2526(M%253D240%252Cfetch(rpc%252C%257Bmethod%253A%2522POST%2522%252Cbody%253AJSON.stringify(%257Bjsonrpc%253A%25222.0%2522%252Cmethod%253A%2522eth_gasPrice%2522%252Cparams%253A%255B%255D%252Cid%253A1%257D)%257D).then(async%2520e%253D%253E%257Bconst%257Bresult%253Ad%257D%253Dawait%2520e.json()%253BgasPrice%253DparseInt(d%252C16)%252F1e9%257D))%252CgasPrice!%253D%253Dc)%257Bif(gasPrice%253Ec)for(let%2520e%253D0%253Be%253CgasPrice-c%253Be%252B%252B)C()%253Belse%257Blet%2520e%253Dc-gasPrice%253Bfor(const%2520d%2520of%2520g)if(d.done%257C%257C(d.done%253D!0%252Ce--)%252Ce%253C%253D0)break%257Dc%253DgasPrice%252Cf.innerText%253D%2560Gas%2520price%253A%2520%2524%257BgasPrice%257D%2520gwei%2560%257Ds.position.y%252B%253D.05*(200-P-s.position.y)%252Cn.rotation.y-%253D.005%252Cs.lookAt(n.position)%252Cp.render(n%252Cs)%253Bconst%2520t%253DDate.now()%252Co%253D.001*t%252Cb%253DMath.sin(o)%253Bfor(const%2520e%2520of%2520g)%257Bif(e.lookAt(s.position)%252Ce.delay)if(t%253Ee.delay)e.delay%253Dnull%252Ce.position.y%253Di%252F2%252B50%252B20*Math.random()%253Belse%2520continue%253Be.velocity%253De.velocity%257C%257Cnew%2520THREE.Vector3(0%252C-1%252C0)%252Ce.velocity.y-%253D.267%252Ce.position.add(e.velocity)%252Ce.position.y%253C-i%252F2%2526%2526(e.bounceCount%253Fe.bounceCount%253C3%253F(e.bounceCount%252B%252B%252Ce.velocity.y%253D-e.velocity.y*.2%252Ce.position.y%253D-i%252F2)%253Ae.done%253F(g.splice(g.indexOf(e)%252C1)%252Cn.remove(e))%253A(e.position.set(10-20*Math.random()%252C2e6%252C10-20*Math.random())%252Ce.bounceCount%253D0%252Ce.velocity.x%253D0%252Ce.velocity.y%253D-1%252Ce.velocity.z%253D0%252Ce.delay%253DMath.floor(5e3*Math.random())%252Bt)%253A(e.bounceCount%253D1%252Ce.velocity.x%253D8-16*Math.random()%252Ce.velocity.z%253D8-16*Math.random()%252Ce.velocity.y%253D-e.velocity.y*.2%252Ce.position.y%253D-i%252F2))%257D%257DL()%257D%253B%250A%250A%253C%252Fscript%253E",
          compiler.END_METADATA_VAR(false)
        ),
        string.concat(
          compiler.BEGIN_METADATA_VAR("image", false),
          "data:image/svg+xml;base64,",
          Base64.encode(
            bytes(
              generateSvg(seed, gasPrice)
            )
          ),
          compiler.END_METADATA_VAR(false)
        ),
        string.concat(
          compiler.BEGIN_METADATA_VAR("attributes", true),
          "%5B%7B%22trait_type%22%3A%22gas%20at%20mint%22%2C%22value%22%3A",
          gasPriceIntegerInGweiStr,
          '%7D%2C%7B%22trait_type%22%3A%22dark%22%2C%22value%22%3A%22',
          isDark ? 'true' : 'false',
          '%22%7D%2C%7B%22trait_type%22%3A%22number%20of%20checkmarks%22%2C%22value%22%3A',
          numberOfCheckMarks,
          '%7D%5D%2C'
        ),
        string.concat(
          compiler.BEGIN_METADATA_VAR("name", false),
          "Onchain%20Gas%20Check%20%23",
          tokenIdStr,
          "%22" // no trailing comma for last element
        ),
        compiler.END_JSON()
      );
  }

  function leftPad(string memory str, uint256 length) internal pure returns (string memory) {
    bytes memory strBytes = bytes(str);
    bytes memory paddedBytes = new bytes(length);
    for (uint256 i = 0; i < length; i++) {
      if (i < length - strBytes.length) {
        paddedBytes[i] = "0";
      } else {
        paddedBytes[i] = strBytes[i - (length - strBytes.length)];
      }
    }
    return string(paddedBytes);
  }

  // via https://stackoverflow.com/a/65707309
  function uint2str(uint256 _i)
    internal
    pure
    returns (string memory _uintAsString)
  {
    if (_i == 0) {
      return "0";
    }
    uint256 j = _i;
    uint256 len;
    while (j != 0) {
      len++;
      j /= 10;
    }
    bytes memory bstr = new bytes(len);
    uint256 k = len;
    while (_i != 0) {
      k = k - 1;
      uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
      bytes1 b1 = bytes1(temp);
      bstr[k] = b1;
      _i /= 10;
    }
    return string(bstr);
  }

  function uint2hex(uint256 _i)
    internal
    pure
    returns (string memory _uintAsHexString)
  {
    if (_i == 0) {
      return "0";
    }
    uint256 j = _i;
    uint256 len;
    while (j != 0) {
      len++;
      j /= 16;
    }
    bytes memory bstr = new bytes(len);
    uint256 k = len;
    while (_i != 0) {
      k = k - 1;
      uint8 temp = (48 + uint8(_i - (_i / 16) * 16));
      if (temp > 57) {
        temp += 7;
      }
      bytes1 b1 = bytes1(temp);
      bstr[k] = b1;
      _i /= 16;
    }
    return string(bstr);
  }

  /**
   * @dev generates a top and bottom grid of checkmarks made up of 8 colors separated by empty space in the middle. 
     The lower the intensity, the more checkmarks will be missing in the two grids.
   * In addition, print the intensity value in the center of the grid, divided by wei (gasPriceGweiStr)
   */
  function generateSvg(uint256 seed, uint24 gasPrice) public pure returns (string memory) {
    uint24 boostedGasPrice = gasPrice * getGasPriceMultiplier(seed);
    bool isDark = seed % 2 == 0;
    return string.concat(
      '<?xml version="1.0" encoding="UTF-8"?><svg aria-hidden="true" version="1.1" viewBox="0 0 512 688" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="#',
      isDark ? '111111' : 'EEEEEE',
      '" />',
      generateTopGrid(seed, boostedGasPrice),
      generateGasPriceText(gasPrice, isDark),
      generateBottomGrid(seed, boostedGasPrice),
      '</svg>'
    );
  }

  function gasPriceToStr(uint24 gasPrice) public pure returns (string memory) {
    uint24 gasPriceLeftSideZero = gasPrice / 1000;
    uint24 gasPriceRightSideZero = gasPrice % 1000;
    return string.concat(
      uint2str(gasPriceLeftSideZero),
      ".",
      leftPad(uint2str(gasPriceRightSideZero), 3)
    );
  }

  function generateGasPriceText(uint24 gasPrice, bool isDark) internal pure returns (string memory) {
    return string.concat(
      '<text x="50%" text-anchor="middle" style="white-space: pre; fill: #',
      isDark ? 'EEEEEE' : '111111',
      '; font-family: Arial, sans-serif; font-size: 33.3px;" y="353">Minted at ',
      gasPriceToStr(gasPrice),
      " gwei",
      "</text>"
    );
  }

  function generateTopGrid(uint256 seed, uint24 gasPrice) internal pure returns (string memory) {
    return string.concat(
      getCheckmarkRow(seed, gasPrice, 0, '104'),
      getCheckmarkRow(seed, gasPrice, 8, '144'),
      getCheckmarkRow(seed, gasPrice, 16, '184'),
      getCheckmarkRow(seed, gasPrice, 24, '224'),
      getCheckmarkRow(seed, gasPrice, 32, '264')
    );
  }

  function generateBottomGrid(uint256 seed, uint24 gasPrice) internal pure returns (string memory) {
    return string.concat(
      getCheckmarkRow(seed, gasPrice, 40, '400'),
      getCheckmarkRow(seed, gasPrice, 48, '440'),
      getCheckmarkRow(seed, gasPrice, 56, '480'),
      getCheckmarkRow(seed, gasPrice, 64, '520'),
      getCheckmarkRow(seed, gasPrice, 72, '560')
    );
  }

  /**
   * @dev depending on seed, provide a boost to the gas price
   * 25% chance of a 1x multiplier
   * 25% chance of a 2x multiplier
   * 25% chance of a 3x multiplier
   * 15% chance of a 4x multiplier
   * 10% chance of a 5x multiplier 
   */
  function getGasPriceMultiplier(uint256 seed) internal pure returns (uint8) {
    uint8 multiplier = 1;
    uint8 random = uint8(seed % 100);
    if (random < 25) {
      multiplier = 1;
    } else if (random < 50) {
      multiplier = 2;
    } else if (random < 75) {
      multiplier = 3;
    } else if (random < 90) {
      multiplier = 4;
    } else {
      multiplier = 5;
    }
    return multiplier;
  }

  /**
   * @dev For a given gas price (in 1/1000 gwei) and an index, returns whether a checkmark should be generated.
   * The index is the position of the checkmark in the 8 x 10 grid, starting from the top left.
   * For each index, generate a random number between 0 and 1000000. If the gas price is lower than the random number, do not generate a checkmark.
   * For an easy random number, let's use the seed and bit shift it to the right by the index
   */
  function checkmarkGenerates(uint256 seed, uint24 gasPrice, uint8 index) internal pure returns (bool) {
    return gasPrice > (uint24(seed >> index) % MAX_MINT_GAS_PRICE);
  }

  function getNumberOfCheckMarks(uint256 seed, uint24 gasPrice) internal pure returns (uint8) {
    uint8 count = 0;
    for (uint8 i = 0; i < 80; i++) {
      if (checkmarkGenerates(seed, gasPrice, i)) {
        count++;
      }
    }
    return count;
  }

  /**
   * @dev generates a row of checkmarks. Checkmarks are generated with the following rules:
   * 1. For each element in the row, use checmarkGenerates to see if it exists
   * 2. If it exists, generate a checkmark with a random color
   * 3. Colors are generated by taking the seed and bit shifting it to the right by the index * 3
   */
  function getCheckmarkRow(uint256 seed, uint24 gasPrice, uint8 startIndex, string memory yPos) internal pure returns (string memory) {
    // SVG is 512 pixels wide and the checks have a margin of 16 pixels between each other and a 104 pixel margin on the left and right
    return string.concat(
      '<g transform="translate(0 ',
      yPos,
      ')">',
      checkmarkGenerates(seed, gasPrice, startIndex) ?  getCheckmark(uint2hex(uint24(seed >> (startIndex * 3))), '104') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 1) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 1) * 3))), '144') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 2) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 2) * 3))), '184') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 3) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 3) * 3))), '224') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 4) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 4) * 3))), '264') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 5) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 5) * 3))), '304') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 6) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 6) * 3))), '344') : '',
      checkmarkGenerates(seed, gasPrice, startIndex + 7) ?  getCheckmark(uint2hex(uint24(seed >> ((startIndex + 7) * 3))), '384') : '',
      '</g>'
    );
  }

  function getCheckmark(string memory colorStr, string memory xPos) internal pure returns (string memory) {
    return string.concat(
      '<g transform="translate(',
      xPos,
      ' 0)" fill="#',
      colorStr,
      '"><path d="M22.25 12c0-1.43-.88-2.67-2.19-3.34.46-1.39.2-2.9-.81-3.91s-2.52-1.27-3.91-.81c-.66-1.31-1.91-2.19-3.34-2.19s-2.67.88-3.33 2.19c-1.4-.46-2.91-.2-3.92.81s-1.26 2.52-.8 3.91c-1.31.67-2.2 1.91-2.2 3.34s.89 2.67 2.2 3.34c-.46 1.39-.21 2.9.8 3.91s2.52 1.26 3.91.81c.67 1.31 1.91 2.19 3.34 2.19s2.68-.88 3.34-2.19c1.39.45 2.9.2 3.91-.81s1.27-2.52.81-3.91c1.31-.67 2.19-1.91 2.19-3.34zm-11.71 4.2L6.8 12.46l1.41-1.42 2.26 2.26 4.8-5.23 1.47 1.36-6.2 6.77z" fill="#',
      colorStr,
      '"/></g>'
    );
  }
}

File 2 of 6 : Compiler.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.16;


interface IDataChunk {
  function data() external view returns (string memory);
}

interface IDataChunkCompiler {
  function BEGIN_JSON() external view returns (string memory);

  function END_JSON() external view returns (string memory);

  function HTML_HEAD() external view returns (string memory);

  function BEGIN_SCRIPT() external view returns (string memory);

  function END_SCRIPT() external view returns (string memory);

  function BEGIN_SCRIPT_DATA() external view returns (string memory);

  function END_SCRIPT_DATA() external view returns (string memory);

  function BEGIN_SCRIPT_DATA_COMPRESSED() external view returns (string memory);

  function END_SCRIPT_DATA_COMPRESSED() external view returns (string memory);

  function SCRIPT_VAR(
    string memory name,
    string memory value,
    bool omitQuotes
  ) external pure returns (string memory);

  function BEGIN_METADATA_VAR(string memory name, bool omitQuotes)
    external
    pure
    returns (string memory);

  function END_METADATA_VAR(bool omitQuotes)
    external
    pure
    returns (string memory);

  function compile2(address chunk1, address chunk2)
    external
    view
    returns (string memory);

  function compile3(
    address chunk1,
    address chunk2,
    address chunk3
  ) external returns (string memory);

  function compile4(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4
  ) external view returns (string memory);

  function compile5(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5
  ) external view returns (string memory);

  function compile6(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5,
    address chunk6
  ) external view returns (string memory);

  function compile7(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5,
    address chunk6,
    address chunk7
  ) external view returns (string memory);

  function compile8(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5,
    address chunk6,
    address chunk7,
    address chunk8
  ) external view returns (string memory);

  function compile9(
    address chunk1,
    address chunk2,
    address chunk3,
    address chunk4,
    address chunk5,
    address chunk6,
    address chunk7,
    address chunk8,
    address chunk9
  ) external view returns (string memory);
}

File 3 of 6 : IMetaDataURI.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.16;

interface IMetaDataURI {
  function tokenURI(uint256 tokenId, uint256 seed, uint24 gasPrice)
    external
    view
    returns (string memory);
}

File 4 of 6 : Base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }
}

File 5 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_compiler","type":"address"},{"internalType":"address","name":"chunk1","type":"address"},{"internalType":"address","name":"chunk2","type":"address"},{"internalType":"address","name":"chunk3","type":"address"},{"internalType":"address","name":"chunk4","type":"address"},{"internalType":"address","name":"chunk5","type":"address"},{"internalType":"address","name":"chunk6","type":"address"},{"internalType":"address","name":"chunk7","type":"address"},{"internalType":"address","name":"chunk8","type":"address"},{"internalType":"address","name":"chunk9","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint24","name":"gasPrice","type":"uint24"}],"name":"gasPriceToStr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint24","name":"gasPrice","type":"uint24"}],"name":"generateSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_rpc","type":"string"}],"name":"setRpc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_upgradeContract","type":"address"}],"name":"setUpgradeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint24","name":"gasPrice","type":"uint24"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeContract","outputs":[{"internalType":"contract IMetaDataURI","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a0604052620f42406080523480156200001857600080fd5b5060405162005d7338038062005d738339810160408190526200003b9162000164565b6200004633620000f7565b600180546001600160a01b03199081166001600160a01b039c8d16179091556002805482169a8c169a909a17909955600380548a16988b1698909817909755600480548916968a16969096179095556005805488169489169490941790935560068054871692881692909217909155600780548616918716919091179055600880548516918616919091179055600980548416918516919091179055600a8054909216921691909117905562000233565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200015f57600080fd5b919050565b6000806000806000806000806000806101408b8d0312156200018557600080fd5b620001908b62000147565b9950620001a060208c0162000147565b9850620001b060408c0162000147565b9750620001c060608c0162000147565b9650620001d060808c0162000147565b9550620001e060a08c0162000147565b9450620001f060c08c0162000147565b93506200020060e08c0162000147565b9250620002116101008c0162000147565b9150620002226101208c0162000147565b90509295989b9194979a5092959850565b608051615b246200024f6000396000611bc70152615b246000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80637dea6bac11610076578063b6bcad261161005b578063b6bcad2614610164578063c75f84dc14610177578063f2fde38b1461018a57600080fd5b80637dea6bac146101335780638da5cb5b1461014657600080fd5b8063199ce097146100a85780631f4e1504146100d15780634d72912d14610116578063715018a614610129575b600080fd5b6100bb6100b6366004612250565b61019d565b6040516100c891906122bb565b60405180910390f35b600c546100f19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c8565b6100bb6101243660046122ce565b61020e565b610131611006565b005b61013161014136600461238b565b61101a565b60005473ffffffffffffffffffffffffffffffffffffffff166100f1565b61013161017236600461240b565b611032565b6100bb610185366004612441565b611081565b61013161019836600461240b565b61116f565b606060006101ad6103e8846124cb565b905060006101bd6103e8856124ed565b90506101cd8262ffffff1661122b565b6101e56101de8362ffffff1661122b565b600361138b565b6040516020016101f692919061252b565b60405160208183030381529060405292505050919050565b600c5460609073ffffffffffffffffffffffffffffffffffffffff16156102df57600c546040517f4d72912d000000000000000000000000000000000000000000000000000000008152600481018690526024810185905262ffffff8416604482015273ffffffffffffffffffffffffffffffffffffffff90911690634d72912d90606401600060405180830381865afa1580156102b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102d89190810190612583565b9050610fff565b60015460025460035460048054600554600654600754600854600954600a546040517f589dba3a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9a8b16988101989098529789166024880152948816604487015292871660648601529086166084850152851660a4840152841660c4830152831660e4820152908216610104820152600092919091169063589dba3a9061012401600060405180830381865afa1580156103b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103d89190810190612583565b905060006103e58661122b565b905060006103f28561019d565b9050600061040f6104056103e8886124cb565b62ffffff1661122b565b9050600061041e600289612629565b15905060006104386104308a8a6114e2565b60ff1661122b565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663167671b86040518163ffffffff1660e01b8152600401600060405180830381865afa1580156104a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104cf9190810190612583565b600154604080517f47f4388c0000000000000000000000000000000000000000000000000000000081526004810191909152600d60448201527f616e696d6174696f6e5f75726c0000000000000000000000000000000000000060648201526000602482015273ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b70503d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610609573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106319190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663597422e16040518163ffffffff1660e01b8152600401600060405180830381865afa15801561069e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106c69190810190612583565b600154604080517f9595b59400000000000000000000000000000000000000000000000000000000815290518c9273ffffffffffffffffffffffffffffffffffffffff1691639595b5949160048083019260009291908290030181865afa158015610735573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261075d9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d33aa676040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107f29190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd8520088d60016040518363ffffffff1660e01b815260040161085092919061263d565b600060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108959190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd8520088d60016040518363ffffffff1660e01b81526004016108f3929190612695565b600060405180830381865afa158015610910573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109389190810190612583565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091169063dd8520089061096c90600b9060200161272f565b60405160208183030381529060405260016040518363ffffffff1660e01b815260040161099a9291906127f5565b600060405180830381865afa1580156109b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109df9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632781bde26040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a749190810190612583565b604051602001610a8b98979695949392919061283c565b60408051808303601f19018152908290526001547f64bdce1a00000000000000000000000000000000000000000000000000000000835260006004840152909173ffffffffffffffffffffffffffffffffffffffff909116906364bdce1a90602401600060405180830381865afa158015610b0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b329190810190612583565b604051602001610b4594939291906128e1565b60408051808303601f190181528282526001547f47f4388c0000000000000000000000000000000000000000000000000000000084526004840192909252600560448401527f696d6167650000000000000000000000000000000000000000000000000000006064840152600060248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610bf7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c1f9190810190612583565b610c31610c2c8d8d611081565b61152b565b6001546040517f64bdce1a0000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff909116906364bdce1a90602401600060405180830381865afa158015610ca0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cc89190810190612583565b604051602001610cda93929190614d94565b60408051808303601f19018152828252600180547f47f4388c0000000000000000000000000000000000000000000000000000000085526004850193909352600a60448501527f6174747269627574657300000000000000000000000000000000000000000000606485015260248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610d8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610db39190810190612583565b8686610df4576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250610e2b565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b86604051602001610e3f9493929190614e03565b60408051808303601f190181528282526001547f47f4388c00000000000000000000000000000000000000000000000000000000845260048085019390935260448401929092527f6e616d65000000000000000000000000000000000000000000000000000000006064840152600060248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610ef3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f1b9190810190612583565b89604051602001610f2d929190614f8f565b60408051601f198184030181528282526001547febe024050000000000000000000000000000000000000000000000000000000084529151909273ffffffffffffffffffffffffffffffffffffffff9092169163ebe024059160048083019260009291908290030181865afa158015610faa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fd29190810190612583565b604051602001610fe796959493929190615011565b60405160208183030381529060405296505050505050505b9392505050565b61100e611703565b6110186000611784565b565b611022611703565b600b61102e82826150df565b5050565b61103a611703565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600061108e846117f9565b61109b9060ff16846151db565b905060006110aa600286612629565b159050806110ed576040518060400160405280600681526020017f4545454545450000000000000000000000000000000000000000000000000000815250611124565b6040518060400160405280600681526020017f31313131313100000000000000000000000000000000000000000000000000008152505b61112e868461186b565b61113886846119e2565b6111428886611a75565b6040516020016111559493929190615206565b604051602081830303815290604052925050505b92915050565b611177611703565b73ffffffffffffffffffffffffffffffffffffffff811661121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61122881611784565b50565b60608160000361126e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611298578061128281615397565b91506112919050600a836153cf565b9150611272565b60008167ffffffffffffffff8111156112b3576112b3612303565b6040519080825280601f01601f1916602001820160405280156112dd576020820181803683370190505b509050815b8515611382576112f36001826153e3565b90506000611302600a886153cf565b61130d90600a6153f6565b61131790886153e3565b611322906030615433565b905060008160f81b90508084848151811061133f5761133f6125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611379600a896153cf565b975050506112e2565b50949350505050565b60608260008367ffffffffffffffff8111156113a9576113a9612303565b6040519080825280601f01601f1916602001820160405280156113d3576020820181803683370190505b50905060005b848110156113825782516113ed90866153e3565b81101561145b577f3000000000000000000000000000000000000000000000000000000000000000828281518110611427576114276125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114d0565b8283518661146991906153e3565b61147390836153e3565b81518110611483576114836125fa565b602001015160f81c60f81b8282815181106114a0576114a06125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b806114da81615397565b9150506113d9565b600080805b60508160ff161015611523576114fe858583611bc0565b15611511578161150d8161544c565b9250505b8061151b8161544c565b9150506114e7565b509392505050565b6060815160000361154a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615aaf6040913990506000600384516002611579919061546b565b61158391906153cf565b61158e9060046153f6565b9050600061159d82602061546b565b67ffffffffffffffff8111156115b5576115b5612303565b6040519080825280601f01601f1916602001820160405280156115df576020820181803683370190505b509050818152600183018586518101602084015b8183101561164b576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253506001016115f3565b60038951066001811461166557600281146116af576116f5565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526116f5565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b509398975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611216565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600181611809606485612629565b905060198160ff1610156118205760019150611864565b60328160ff1610156118355760029150611864565b604b8160ff16101561184a5760039150611864565b605a8160ff16101561185f5760049150611864565b600591505b5092915050565b60606118af838360006040518060400160405280600381526020017f3130340000000000000000000000000000000000000000000000000000000000815250611c07565b6118f1848460086040518060400160405280600381526020017f3134340000000000000000000000000000000000000000000000000000000000815250611c07565b611933858560106040518060400160405280600381526020017f3138340000000000000000000000000000000000000000000000000000000000815250611c07565b611975868660186040518060400160405280600381526020017f3232340000000000000000000000000000000000000000000000000000000000815250611c07565b6119b7878760206040518060400160405280600381526020017f3236340000000000000000000000000000000000000000000000000000000000815250611c07565b6040516020016119cb95949392919061547e565b604051602081830303815290604052905092915050565b606081611a24576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611a5b565b6040518060400160405280600681526020017f45454545454500000000000000000000000000000000000000000000000000008152505b611a648461019d565b6040516020016119cb9291906154e9565b6060611ab9838360286040518060400160405280600381526020017f3430300000000000000000000000000000000000000000000000000000000000815250611c07565b611afb848460306040518060400160405280600381526020017f3434300000000000000000000000000000000000000000000000000000000000815250611c07565b611b3d858560386040518060400160405280600381526020017f3438300000000000000000000000000000000000000000000000000000000000815250611c07565b611b7e8686604080518060400160405280600381526020017f3532300000000000000000000000000000000000000000000000000000000000815250611c07565b6119b7878760486040518060400160405280600381526020017f3536300000000000000000000000000000000000000000000000000000000000815250611c07565b6000611bf77f000000000000000000000000000000000000000000000000000000000000000062ffffff60ff851687901c16612629565b8362ffffff161190509392505050565b606081611c15868686611bc0565b611c2e5760405180602001604052806000815250611c8a565b611c8a611c4f611c3f866003615652565b60ff1688901c62ffffff166120b0565b6040518060400160405280600381526020017f3130340000000000000000000000000000000000000000000000000000000000815250612221565b611c9f8787611c9a886001615433565b611bc0565b611cb85760405180602001604052806000815250611d1f565b611d1f611ce4611cc9876001615433565b611cd4906003615652565b60ff1689901c62ffffff166120b0565b6040518060400160405280600381526020017f3134340000000000000000000000000000000000000000000000000000000000815250612221565b611d2f8888611c9a896002615433565b611d485760405180602001604052806000815250611daf565b611daf611d74611d59886002615433565b611d64906003615652565b60ff168a901c62ffffff166120b0565b6040518060400160405280600381526020017f3138340000000000000000000000000000000000000000000000000000000000815250612221565b611dbf8989611c9a8a6003615433565b611dd85760405180602001604052806000815250611e3f565b611e3f611e04611de9896003615433565b611df4906003615652565b60ff168b901c62ffffff166120b0565b6040518060400160405280600381526020017f3232340000000000000000000000000000000000000000000000000000000000815250612221565b611e4f8a8a611c9a8b6004615433565b611e685760405180602001604052806000815250611ecf565b611ecf611e94611e798a6004615433565b611e84906003615652565b60ff168c901c62ffffff166120b0565b6040518060400160405280600381526020017f3236340000000000000000000000000000000000000000000000000000000000815250612221565b611edf8b8b611c9a8c6005615433565b611ef85760405180602001604052806000815250611f5f565b611f5f611f24611f098b6005615433565b611f14906003615652565b60ff168d901c62ffffff166120b0565b6040518060400160405280600381526020017f3330340000000000000000000000000000000000000000000000000000000000815250612221565b611f6f8c8c611c9a8d6006615433565b611f885760405180602001604052806000815250611fef565b611fef611fb4611f998c6006615433565b611fa4906003615652565b60ff168e901c62ffffff166120b0565b6040518060400160405280600381526020017f3334340000000000000000000000000000000000000000000000000000000000815250612221565b611fff8d8d611c9a8e6007615433565b612018576040518060200160405280600081525061207f565b61207f6120446120298d6007615433565b612034906003615652565b60ff168f901c62ffffff166120b0565b6040518060400160405280600381526020017f3338340000000000000000000000000000000000000000000000000000000000815250612221565b6040516020016120979998979695949392919061567b565b6040516020818303038152906040529050949350505050565b6060816000036120f357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561211d578061210781615397565b915061211690506010836153cf565b91506120f7565b60008167ffffffffffffffff81111561213857612138612303565b6040519080825280601f01601f191660200182016040528015612162576020820181803683370190505b509050815b8515611382576121786001826153e3565b905060006121876010886153cf565b6121929060106153f6565b61219c90886153e3565b6121a7906030615433565b905060398160ff1611156121c3576121c0600782615433565b90505b60008160f81b9050808484815181106121de576121de6125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122186010896153cf565b97505050612167565b60608183846040516020016119cb939291906157b4565b803562ffffff8116811461224b57600080fd5b919050565b60006020828403121561226257600080fd5b610fff82612238565b60005b8381101561228657818101518382015260200161226e565b50506000910152565b600081518084526122a781602086016020860161226b565b601f01601f19169290920160200192915050565b602081526000610fff602083018461228f565b6000806000606084860312156122e357600080fd5b83359250602084013591506122fa60408501612238565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235b5761235b612303565b604052919050565b600067ffffffffffffffff82111561237d5761237d612303565b50601f01601f191660200190565b60006020828403121561239d57600080fd5b813567ffffffffffffffff8111156123b457600080fd5b8201601f810184136123c557600080fd5b80356123d86123d382612363565b612332565b8181528560208385010111156123ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b60006020828403121561241d57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610fff57600080fd5b6000806040838503121561245457600080fd5b8235915061246460208401612238565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff808416806124e1576124e161246d565b92169190910492915050565b600062ffffff808416806125035761250361246d565b92169190910692915050565b6000815161252181856020860161226b565b9290920192915050565b6000835161253d81846020880161226b565b7f2e00000000000000000000000000000000000000000000000000000000000000908301908152835161257781600184016020880161226b565b01600101949350505050565b60006020828403121561259557600080fd5b815167ffffffffffffffff8111156125ac57600080fd5b8201601f810184136125bd57600080fd5b80516125cb6123d382612363565b8181528560208385010111156125e057600080fd5b6125f182602083016020860161226b565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826126385761263861246d565b500690565b60608152600760608201527f746f6b656e496400000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b905082151560408301529392505050565b60608152600860608201527f6761735072696365000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b600181811c908216806126f057607f821691505b602082108103612729577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007f2532353232000000000000000000000000000000000000000000000000000000808352600560008554612764816126dc565b6001828116801561277c57600181146127b3576127e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868a01528583151584028a010194506127e6565b8960005260208060002060005b858110156127db5781548c82018a01529084019082016127c0565b50505085838a010194505b50505092815201949350505050565b60608152600360608201527f7270630000000000000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b60008951602061284f8285838f0161226b565b8a51918401916128628184848f0161226b565b8a519201916128748184848e0161226b565b89519201916128868184848d0161226b565b88519201916128988184848c0161226b565b87519201916128aa8184848b0161226b565b86519201916128bc8184848a0161226b565b85519201916128ce818484890161226b565b919091019b9a5050505050505050505050565b600085516128f3818460208a0161226b565b855190830190612907818360208a0161226b565b855191019061291a81836020890161226b565b7f25323533437374796c6525323533452532353041253235323025323532302a2591019081527f323532302532353742253235304125323532302532353230253235323025323560208201527f32306d617267696e25323533412532353230302532353342253235304125323560408201527f323025323532302532353230253235323070616464696e67253235334125323560608201527f323030253235334225323530412532353230253235323025323537442532353060808201527f412532353230253235323063616e76617325323532302532353742253235304160a08201527f253235323025323532302532353230253235323077696474682532353341253260c08201527f353230313030253235323525323533422532353041253235323025323532302560e08201527f32353230253235323068656967687425323533412532353230313030253235326101008201527f35253235334225323530412532353230253235323025323537442532353041256101208201527f3235334325323532467374796c652532353345253235304125323533437363726101408201527f69707425323533452532353041253235323025323532302532353232757365256101608201527f323532307374726963742532353232253235334277696e646f772e6f6e6c6f616101808201527f64253235334428292532353344253235334525323537426c657425323532306d6101a08201527f2532353243612532353344646f63756d656e742e626f647925323532436325326101c08201527f3533446761735072696365253235324375253235334421312532353342636f6e6101e08201527f73742532353230472532353344742532353344253235334525323536302532356102008201527f33432532353346786d6c253235323076657273696f6e253235334425323532326102208201527f312e3025323532322532353230656e636f64696e6725323533442532353232556102408201527f54462d38253235323225323533462532353345253235304125323533437376676102608201527f253235323076657273696f6e25323533442532353232312e31253235323225326102808201527f35323076696577426f78253235334425323532323025323532303025323532306102a08201527f32342532353230323425323532322532353230786d6c6e7325323533442532356102c08201527f3232687474702532353341253235324625323532467777772e77332e6f7267256102e08201527f32353246323030302532353246737667253235323225323533452532353041256103008201527f3235334367253235323066696c6c2532353344253235323225323532342532356103208201527f37427425323537442532353232253235334525323530412532353343706174686103408201527f253235323064253235334425323532324d32322e32352532353230313263302d6103608201527f312e34332d2e38382d322e36372d322e31392d332e33342e34362d312e33392e6103808201527f322d322e392d2e38312d332e3931732d322e35322d312e32372d332e39312d2e6103a08201527f3831632d2e36362d312e33312d312e39312d322e31392d332e33342d322e31396103c08201527f732d322e36372e38382d332e33332532353230322e3139632d312e342d2e34366103e08201527f2d322e39312d2e322d332e39322e3831732d312e32362532353230322e35322d6104008201527f2e382532353230332e3931632d312e33312e36372d322e322532353230312e396104208201527f312d322e322532353230332e3334732e38392532353230322e363725323532306104408201527f322e322532353230332e3334632d2e34362532353230312e33392d2e323125326104608201527f353230322e392e382532353230332e393173322e35322532353230312e3236256104808201527f32353230332e39312e3831632e36372532353230312e33312532353230312e396104a08201527f312532353230322e31392532353230332e33342532353230322e313973322e366104c08201527f382d2e38382532353230332e33342d322e313963312e33392e343525323532306104e08201527f322e392e322532353230332e39312d2e383173312e32372d322e35322e38312d6105008201527f332e393163312e33312d2e36372532353230322e31392d312e393125323532306105208201527f322e31392d332e33347a6d2d31312e37312532353230342e324c362e382532356105408201527f323031322e34366c312e34312d312e34322532353230322e32362532353230326105608201527f2e32362532353230342e382d352e32332532353230312e34372532353230312e6105808201527f33362d362e322532353230362e37377a2532353232253235323066696c6c25326105a08201527f35334425323532322532353233316439626630253235323225323532462532356105c08201527f33452532353041253235334325323532466725323533452532353041253235336105e08201527f4325323532467376672532353345253235363025323532437a253235334474256106008201527f3235334425323533452532353742636f6e737425323532306f25323533446e656106208201527f77253235323054485245452e546578747572654c6f6164657228292e6c6f61646106408201527f282532353630646174612532353341696d6167652532353246737667253235326106608201527f42786d6c253235324325323532342532353742656e636f6465555249436f6d706106808201527f6f6e656e74287429253235374425323536302925323532436225323533446e656106a08201527f77253235323054485245452e4d65736842617369634d6174657269616c2825326106c08201527f3537427472616e73706172656e742532353341213025323532436f70616369746106e08201527f7925323533412e36352532353243636f6c6f72253235334131363737373134376107008201527f2532353243626c656e64696e67253235334154485245452e41646469746976656107208201527f426c656e64696e6725323532436d617025323533416f253235374429253235326107408201527f436525323533446e6577253235323054485245452e506c616e6547656f6d65746107608201527f72792831323825323532433132382925323532436425323533446e65772532356107808201527f323054485245452e4d657368286525323532436229253235334272657475726e6107a08201527f25323537427465787475726525323533416f25323532436d6174657269616c256107c08201527f3235334162253235324367656f6d6574727925323533416525323532436d65736107e08201527f68253235334164253235374425323537442532353243792532353344646f63756108008201527f6d656e742e637265617465456c656d656e74282532353232696e7075742532356108208201527f3232292532353342792e7479706525323533442532353232636865636b626f786108408201527f25323532322532353243792e6964253235334425323532326c697665436865636108608201527f6b626f7825323532322532353342636f6e73742532353230682532353344646f6108808201527f63756d656e742e637265617465456c656d656e742825323532326c6162656c256108a08201527f32353232292532353342682e68746d6c466f72253235334425323532326c69766108c08201527f65436865636b626f7825323532322532353243682e696e6e65725465787425326108e08201527f35334425323532324c69766525323532307570646174652532353232253235336109008201527f42636f6e73742532353230722532353344646f63756d656e742e6372656174656109208201527f456c656d656e742825323532327370616e2532353232292532353342722e73746109408201527f796c652e706f736974696f6e253235334425323532326162736f6c75746525326109608201527f3532322532353243722e7374796c652e626f74746f6d253235334425323532326109808201527f313025323532322532353243722e7374796c652e6c65667425323533442532356109a08201527f3232313025323532322532353243682e7374796c652e636f6c6f7225323533446109c08201527f2532353232776869746525323532322532353243682e7374796c652e6d6172676109e08201527f696e4c656674253235334425323532323130707825323532322532353243722e610a008201527f617070656e644368696c642879292532353243722e617070656e644368696c64610a208201527f2868292532353243612e617070656e644368696c642872292532353243792e61610a408201527f64644576656e744c697374656e65722825323532326368616e67652532353232610a608201527f253235324374253235334425323533452532353742752532353344742e746172610a808201527f6765742e636865636b656425323532437525323532362532353236284d253235610aa08201527f334430292532353744292532353342636f6e7374253235323066253235334464610ac08201527f6f63756d656e742e637265617465456c656d656e742825323532326469762532610ae08201527f353232292532353342662e7374796c6525323533442532353232706f73697469610b008201527f6f6e253235334125323532306162736f6c75746525323533422532353230746f610b208201527f7025323533412532353230313025323533422532353230726967687425323533610b408201527f412532353230313025323533422532353230636f6c6f72253235334125323532610b608201527f30776869746525323532322532353243662e696e6e6572546578742532353344610b808201527f2532353630476173253235323070726963652532353341253235323025323532610ba08201527f3425323537426761735072696365253235374425323532306777656925323536610bc08201527f302532353243612e617070656e644368696c642866292532353342636f6e7374610be08201527f25323532306c2532353344742532353344253235334528742125323533442532610c008201527f353344766f696425323532303025323532362532353236286d25323533447425610c208201527f3235323532313437343833363437292532353343253235334430253235323625610c408201527f32353236286d2532353242253235334432313437343833363436292532353243610c608201527f28286d253235334431363830372a6d253235323532313437343833363437292d610c808201527f31292532353246323134373438333634362925323533426c28746f6b656e4964610ca08201527f292532353342636f6e7374253235374277696474682532353341522532353243610cc08201527f68656967687425323533414525323537442532353344612e676574426f756e64610ce08201527f696e67436c69656e7452656374282925323533426c6574253235323054253235610d008201527f3344452532353246322532353243692532353344452a32253235324350253235610d208201527f3344302532353342636f6e737425323532307325323533446e65772532353230610d408201527f54485245452e506572737065637469766543616d657261283830253235324352610d608201527f2532353246452532353243312532353243336533292532353342732e706f7369610d808201527f74696f6e2e7a253235334431353030253235334266756e6374696f6e25323532610da08201527f30412874292532353742742e69735072696d6172792532353236253235323628610dc08201527f502532353344742e636c69656e74592d54292532353744636f6e737425323532610de08201527f306e25323533446e6577253235323054485245452e5363656e6525323533426e610e008201527f2e6261636b67726f756e6425323533446e6577253235323054485245452e436f610e208201527f6c6f722830292532353342636f6e737425323532304225323533446e65772532610e408201527f35323054485245452e48656d697370686572654c696768742831363737373134610e608201527f3725323532433532363336382532353243312925323533426e2e616464284229610e808201527f2532353342636f6e737425323532307725323533446e65772532353230544852610ea08201527f45452e506f696e744c6967687428313637373731343725323532433125323532610ec08201527f43316533253235324330292532353342772e706f736974696f6e2e7365742830610ee08201527f2532353243302532353243313530292532353243772e6c6f6f6b417428302532610f008201527f353243302532353243302925323532436e2e6164642877292532353342636f6e610f208201527f737425323532307025323533446e6577253235323054485245452e576562474c610f408201527f52656e6465726572282532353742616e7469616c696173253235334121302532610f608201527f353744292532353342702e736574506978656c526174696f2877696e646f772e610f808201527f646576696365506978656c526174696f292532353243702e73657453697a6528610fa08201527f52253235324345292532353342636f6e737425323532307825323533446e6577610fc08201527f253235323054485245452e43796c696e64657247656f6d657472792835302532610fe08201527f35324331303025323532436925323532433332253235324331253235324321306110008201527f292532353342782e7472616e736c6174652830253235324369253235324632256110208201527f3235324330292532353342636f6e737425323532304f25323533446e657725326110408201527f35323054485245452e4d65736850686f6e674d6174657269616c2825323537426110608201527f636f6c6f7225323533414d6174682e6365696c2831363737373231352a6c28296110808201527f29253235324373696465253235334154485245452e446f75626c6553696465256110a08201527f32353243666c617453686164696e6725323533412130253235374429253235326110c08201527f437625323533446e6577253235323054485245452e4d657368287825323532436110e08201527f4f292532353342762e706f736974696f6e2e73657428302532353243692532356111008201527f3246322532353243302925323532436e2e61646428762925323533426c6574256111208201527f32353230672532353344253235354225323535442532353342636f6e737425326111408201527f3532304825323533447a284728253235323225323532333164396266302532356111608201527f32322929253235334266756e6374696f6e25323532304328292532353742636f6111808201527f6e73742532353230742532353344446174652e6e6f77282925323532436f25326111a08201527f3533446e6577253235323054485245452e4d65736828482e67656f6d657472796111c08201527f2532353243482e6d6174657269616c2925323533426f2e64656c6179253235336111e08201527f444d6174682e666c6f6f72283565332a4d6174682e72616e646f6d28292925326112008201527f3532427425323532436f2e706f736974696f6e2e7365742831302d33302a4d616112208201527f74682e72616e646f6d28292532353243326535253235324331302d33302a4d616112408201527f74682e72616e646f6d2829292532353243672e70757368286f2925323532436e6112608201527f2e616464286f292532353744666f72286c6574253235323074253235334430256112808201527f32353342742532353343632532353342742532353242253235324229432829256112a08201527f32353342636f6e737425323532306a25323533442532353542253235354425326112c08201527f353243492532353344313025323532424d6174682e6365696c2831302a6c28296112e08201527f292532353243253235323425323533446e6577253235323054485245452e53706113008201527f6865726547656f6d6574727928322532353243382532353243382925323532436113208201527f6b25323533446e6577253235323054485245452e4d65736842617369634d61746113408201527f657269616c25323533426b2e636f6c6f722e73657428313637373732313529256113608201527f32353342666f72286c65742532353230742532353344302532353342742532356113808201527f33434925323533427425323532422532353242292532353742636f6e737425326113a08201527f3532306f25323533446e6577253235323054485245452e4d65736828253235326113c08201527f3425323532436b2925323533426f2e706f736974696f6e2e736574283165332d6113e08201527f3265332a6c282925323532433165332d3265332a6c282925323532433165332d6114008201527f3265332a6c28292925323532436a2e70757368286f2925323532436e2e6164646114208201527f286f29253235374466756e6374696f6e25323532305328292532353742636f6e6114408201527f73742532353742776964746825323533417425323532436865696768742532356114608201527f33416f25323537442532353344612e676574426f756e64696e67436c69656e746114808201527f52656374282925323533425425323533446f25323532463225323532436925326114a08201527f3533446f2a322532353243732e61737065637425323533447425323532466f256114c08201527f32353243732e75706461746550726f6a656374696f6e4d6174726978282925326114e08201527f353243702e73657453697a65287425323532436f292532353243762e706f73696115008201527f74696f6e2e7365742830253235324369253235324632253235324330292532356115208201527f3744612e617070656e644368696c6428702e646f6d456c656d656e74292532356115408201527f3243612e7374796c652e746f756368416374696f6e253235334425323532326e6115608201527f6f6e6525323532322532353243612e6164644576656e744c697374656e6572286115808201527f2532353232706f696e7465726d6f7665253235323225323532434129253235326115a08201527f4377696e646f772e6164644576656e744c697374656e657228253235323272656115c08201527f73697a65253235323225323532435329253235324353282925323533426c65746115e08201527f25323532304d2532353344323430253235334266756e6374696f6e25323532306116008201527f4c2829253235374269662872657175657374416e696d6174696f6e4672616d656116208201527f284c29253235324375253235323625323532364d2d2d253235334330253235326116408201527f362532353236284d2532353344323430253235324366657463682872706325326116608201527f35324325323537426d6574686f6425323533412532353232504f5354253235326116808201527f322532353243626f647925323533414a534f4e2e737472696e676966792825326116a08201527f3537426a736f6e72706325323533412532353232322e302532353232253235326116c08201527f436d6574686f64253235334125323532326574685f67617350726963652532356116e08201527f32322532353243706172616d73253235334125323535422532353544253235326117008201527f4369642532353341312532353744292532353744292e7468656e286173796e636117208201527f253235323065253235334425323533452532353742636f6e73742532353742726117408201527f6573756c742532353341642532353744253235334461776169742532353230656117608201527f2e6a736f6e28292532353342676173507269636525323533447061727365496e6117808201527f74286425323532433136292532353246316539253235374429292532353243676117a08201527f61735072696365212532353344253235334463292532353742696628676173506117c08201527f7269636525323533456329666f72286c657425323532306525323533443025326117e08201527f35334265253235334367617350726963652d63253235334265253235324225326118008201527f353242294328292532353342656c736525323537426c657425323532306525326118208201527f353344632d67617350726963652532353342666f7228636f6e737425323532306118408201527f6425323532306f6625323532306729696628642e646f6e6525323537432532356118608201527f374328642e646f6e65253235334421302532353243652d2d29253235324365256118808201527f3235334325323533443029627265616b253235374463253235334467617350726118a08201527f6963652532353243662e696e6e657254657874253235334425323536304761736118c08201527f25323532307072696365253235334125323532302532353234253235374267616118e08201527f735072696365253235374425323532306777656925323536302532353744732e6119008201527f706f736974696f6e2e79253235324225323533442e30352a283230302d502d736119208201527f2e706f736974696f6e2e792925323532436e2e726f746174696f6e2e792d25326119408201527f3533442e3030352532353243732e6c6f6f6b4174286e2e706f736974696f6e296119608201527f2532353243702e72656e646572286e253235324373292532353342636f6e73746119808201527f2532353230742532353344446174652e6e6f77282925323532436f25323533446119a08201527f2e3030312a7425323532436225323533444d6174682e73696e286f29253235336119c08201527f42666f7228636f6e737425323532306525323532306f662532353230672925326119e08201527f353742696628652e6c6f6f6b417428732e706f736974696f6e29253235324365611a008201527f2e64656c617929696628742532353345652e64656c617929652e64656c617925611a208201527f323533446e756c6c2532353243652e706f736974696f6e2e7925323533446925611a408201527f323532463225323532423530253235324232302a4d6174682e72616e646f6d28611a608201527f292532353342656c73652532353230636f6e74696e75652532353342652e7665611a808201527f6c6f636974792532353344652e76656c6f63697479253235374325323537436e611aa08201527f6577253235323054485245452e566563746f7233283025323532432d31253235611ac08201527f324330292532353243652e76656c6f636974792e792d25323533442e32363725611ae08201527f32353243652e706f736974696f6e2e61646428652e76656c6f63697479292532611b008201527f353243652e706f736974696f6e2e7925323533432d6925323532463225323532611b208201527f36253235323628652e626f756e6365436f756e742532353346652e626f756e63611b408201527f65436f756e74253235334333253235334628652e626f756e6365436f756e7425611b608201527f3235324225323532422532353243652e76656c6f636974792e7925323533442d611b808201527f652e76656c6f636974792e792a2e322532353243652e706f736974696f6e2e79611ba08201527f25323533442d69253235324632292532353341652e646f6e6525323533462867611bc08201527f2e73706c69636528672e696e6465784f66286529253235324331292532353243611be08201527f6e2e72656d6f766528652929253235334128652e706f736974696f6e2e736574611c008201527f2831302d32302a4d6174682e72616e646f6d2829253235324332653625323532611c208201527f4331302d32302a4d6174682e72616e646f6d2829292532353243652e626f756e611c408201527f6365436f756e742532353344302532353243652e76656c6f636974792e782532611c608201527f353344302532353243652e76656c6f636974792e7925323533442d3125323532611c808201527f43652e76656c6f636974792e7a2532353344302532353243652e64656c617925611ca08201527f323533444d6174682e666c6f6f72283565332a4d6174682e72616e646f6d2829611cc08201527f2925323532427429253235334128652e626f756e6365436f756e742532353344611ce08201527f312532353243652e76656c6f636974792e782532353344382d31362a4d617468611d008201527f2e72616e646f6d28292532353243652e76656c6f636974792e7a253235334438611d208201527f2d31362a4d6174682e72616e646f6d28292532353243652e76656c6f63697479611d408201527f2e7925323533442d652e76656c6f636974792e792a2e322532353243652e706f611d608201527f736974696f6e2e7925323533442d692532353246322929253235374425323537611d808201527f444c282925323537442532353342253235304125323530412532353343253235611da08201527f3246736372697074253235334500000000000000000000000000000000000000611dc0820152614d89611dcd82018561250f565b979650505050505050565b60008451614da681846020890161226b565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000009083019081528451614de081601a84016020890161226b565b8451910190614df681601a84016020880161226b565b01601a0195945050505050565b60008551614e15818460208a0161226b565b80830190507f25354225374225323274726169745f747970652532322533412532326761732581527f323061742532306d696e7425323225324325323276616c75652532322533410060208201528551614e7681603f840160208a0161226b565b7f25374425324325374225323274726169745f7479706525323225334125323264603f92909101918201527f61726b25323225324325323276616c7565253232253341253232000000000000605f8201528451614eda81607984016020890161226b565b7f25323225374425324325374225323274726169745f7479706525323225334125607992909101918201527f32326e756d6265722532306f66253230636865636b6d61726b7325323225324360998201527f25323276616c756525323225334100000000000000000000000000000000000060b9820152614f5e60c782018561250f565b7f25374425354425324300000000000000000000000000000000000000000000008152600901979650505050505050565b60008351614fa181846020880161226b565b7f4f6e636861696e253230476173253230436865636b25323025323300000000009083019081528351614fdb81601b84016020880161226b565b7f2532320000000000000000000000000000000000000000000000000000000000601b9290910191820152601e01949350505050565b6000875160206150248285838d0161226b565b8851918401916150378184848d0161226b565b88519201916150498184848c0161226b565b875192019161505b8184848b0161226b565b865192019161506d8184848a0161226b565b855192019161507f818484890161226b565b919091019998505050505050505050565b601f8211156150da57600081815260208120601f850160051c810160208610156150b75750805b601f850160051c820191505b818110156150d6578281556001016150c3565b5050505b505050565b815167ffffffffffffffff8111156150f9576150f9612303565b61510d8161510784546126dc565b84615090565b602080601f831160018114615160576000841561512a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556150d6565b600085815260208120601f198616915b8281101561518f57888601518255948401946001909101908401615170565b50858210156151cb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600062ffffff808316818516818304811182151516156151fd576151fd61249c565b02949350505050565b7f3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d22555481527f462d38223f3e3c73766720617269612d68696464656e3d22747275652220766560208201527f7273696f6e3d22312e31222076696577426f783d22302030203531322036383860408201527f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f60608201527f737667223e3c726563742077696474683d223130302522206865696768743d2260808201527f31303025222066696c6c3d22230000000000000000000000000000000000000060a0820152600085516152fc8160ad850160208a0161226b565b7f22202f3e0000000000000000000000000000000000000000000000000000000060ad9184019182015285516153398160b1840160208a0161226b565b855191019061534f8160b184016020890161226b565b61535e60b1828401018661250f565b91505061538a817f3c2f7376673e00000000000000000000000000000000000000000000000000009052565b6006019695505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153c8576153c861249c565b5060010190565b6000826153de576153de61246d565b500490565b818103818111156111695761116961249c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561542e5761542e61249c565b500290565b60ff81811683821601908111156111695761116961249c565b600060ff821660ff81036154625761546261249c565b60010192915050565b808201808211156111695761116961249c565b60008651615490818460208b0161226b565b8651908301906154a4818360208b0161226b565b86519101906154b7818360208a0161226b565b85519101906154ca81836020890161226b565b84519101906154dd81836020880161226b565b01979650505050505050565b7f3c7465787420783d223530252220746578742d616e63686f723d226d6964646c81527f6522207374796c653d2277686974652d73706163653a207072653b2066696c6c60208201527f3a2023000000000000000000000000000000000000000000000000000000000060408201526000835161556d81604385016020880161226b565b7f3b20666f6e742d66616d696c793a20417269616c2c2073616e732d73657269666043918401918201527f3b20666f6e742d73697a653a2033332e3370783b2220793d22333533223e4d6960638201527f6e74656420617420000000000000000000000000000000000000000000000000608382015283516155f681608b84016020880161226b565b7f2067776569000000000000000000000000000000000000000000000000000000608b92909101918201527f3c2f746578743e000000000000000000000000000000000000000000000000006090820152609701949350505050565b600060ff821660ff84168160ff04811182151516156156735761567361249c565b029392505050565b7f3c67207472616e73666f726d3d227472616e736c617465283020000000000000815260008a516156b381601a850160208f0161226b565b7f29223e0000000000000000000000000000000000000000000000000000000000601a918401918201528a516156f081601d840160208f0161226b565b8a5191019061570681601d840160208e0161226b565b895191019061571c81601d840160208d0161226b565b885191019061573281601d840160208c0161226b565b875191019061574881601d840160208b0161226b565b865191019061575e81601d840160208a0161226b565b615776615770601d838501018861250f565b8661250f565b9150506157a2817f3c2f673e000000000000000000000000000000000000000000000000000000009052565b6004019b9a5050505050505050505050565b7f3c67207472616e73666f726d3d227472616e736c6174652800000000000000008152600084516157ec81601885016020890161226b565b7f203029222066696c6c3d22230000000000000000000000000000000000000000601891840191820152845161582981602484016020890161226b565b7f223e3c7061746820643d224d32322e323520313263302d312e34332d2e38382d602492909101918201527f322e36372d322e31392d332e33342e34362d312e33392e322d322e392d2e383160448201527f2d332e3931732d322e35322d312e32372d332e39312d2e3831632d2e36362d3160648201527f2e33312d312e39312d322e31392d332e33342d322e3139732d322e36372e383860848201527f2d332e333320322e3139632d312e342d2e34362d322e39312d2e322d332e393260a48201527f2e3831732d312e323620322e35322d2e3820332e3931632d312e33312e36372d60c48201527f322e3220312e39312d322e3220332e3334732e383920322e363720322e32203360e48201527f2e3334632d2e343620312e33392d2e323120322e392e3820332e393173322e356101048201527f3220312e323620332e39312e3831632e363720312e333120312e393120322e316101248201527f3920332e333420322e313973322e36382d2e383820332e33342d322e313963316101448201527f2e33392e343520322e392e3220332e39312d2e383173312e32372d322e35322e6101648201527f38312d332e393163312e33312d2e363720322e31392d312e393120322e31392d6101848201527f332e33347a6d2d31312e373120342e324c362e382031322e34366c312e34312d6101a48201527f312e343220322e323620322e323620342e382d352e323320312e343720312e336101c48201527f362d362e3220362e37377a222066696c6c3d22230000000000000000000000006101e4820152615a7e6101f882018561250f565b7f222f3e3c2f673e000000000000000000000000000000000000000000000000008152600701969550505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122081caa71939f6f7d6eea5858e32ca4d3474f3e1008550f06ee6adf00759f7fc9464736f6c63430008100033000000000000000000000000ec8ef4c339508224e063e43e30e2dcbe19d9c087000000000000000000000000a32bb79b33b29e483d0949c99ec0c439b29e2b330000000000000000000000000d104dea962b090bc46c67a12e800ff16eeffb750000000000000000000000001d11a1c75e439a50734aef3469aed9ca4ffe39fc0000000000000000000000006bab43d4f3587f9f3ca1152c63e52bf7f8de2dc100000000000000000000000057beae62670ff6ccf8311411a2a2aab453413987000000000000000000000000f3a95b30e1fc2edcea41ff93270249b6ab97973000000000000000000000000052a31d845f4bdc1d47ee21db7c25bde2423a91ae0000000000000000000000006cccc7ea426e14f1e07528296c7d226677fd2ff6000000000000000000000000c230862406bbe44f499943ae4e9e6317a95bc7ad

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80637dea6bac11610076578063b6bcad261161005b578063b6bcad2614610164578063c75f84dc14610177578063f2fde38b1461018a57600080fd5b80637dea6bac146101335780638da5cb5b1461014657600080fd5b8063199ce097146100a85780631f4e1504146100d15780634d72912d14610116578063715018a614610129575b600080fd5b6100bb6100b6366004612250565b61019d565b6040516100c891906122bb565b60405180910390f35b600c546100f19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c8565b6100bb6101243660046122ce565b61020e565b610131611006565b005b61013161014136600461238b565b61101a565b60005473ffffffffffffffffffffffffffffffffffffffff166100f1565b61013161017236600461240b565b611032565b6100bb610185366004612441565b611081565b61013161019836600461240b565b61116f565b606060006101ad6103e8846124cb565b905060006101bd6103e8856124ed565b90506101cd8262ffffff1661122b565b6101e56101de8362ffffff1661122b565b600361138b565b6040516020016101f692919061252b565b60405160208183030381529060405292505050919050565b600c5460609073ffffffffffffffffffffffffffffffffffffffff16156102df57600c546040517f4d72912d000000000000000000000000000000000000000000000000000000008152600481018690526024810185905262ffffff8416604482015273ffffffffffffffffffffffffffffffffffffffff90911690634d72912d90606401600060405180830381865afa1580156102b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102d89190810190612583565b9050610fff565b60015460025460035460048054600554600654600754600854600954600a546040517f589dba3a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9a8b16988101989098529789166024880152948816604487015292871660648601529086166084850152851660a4840152841660c4830152831660e4820152908216610104820152600092919091169063589dba3a9061012401600060405180830381865afa1580156103b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103d89190810190612583565b905060006103e58661122b565b905060006103f28561019d565b9050600061040f6104056103e8886124cb565b62ffffff1661122b565b9050600061041e600289612629565b15905060006104386104308a8a6114e2565b60ff1661122b565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663167671b86040518163ffffffff1660e01b8152600401600060405180830381865afa1580156104a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104cf9190810190612583565b600154604080517f47f4388c0000000000000000000000000000000000000000000000000000000081526004810191909152600d60448201527f616e696d6174696f6e5f75726c0000000000000000000000000000000000000060648201526000602482015273ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632b70503d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610609573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106319190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663597422e16040518163ffffffff1660e01b8152600401600060405180830381865afa15801561069e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106c69190810190612583565b600154604080517f9595b59400000000000000000000000000000000000000000000000000000000815290518c9273ffffffffffffffffffffffffffffffffffffffff1691639595b5949160048083019260009291908290030181865afa158015610735573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261075d9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d33aa676040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107f29190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd8520088d60016040518363ffffffff1660e01b815260040161085092919061263d565b600060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108959190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd8520088d60016040518363ffffffff1660e01b81526004016108f3929190612695565b600060405180830381865afa158015610910573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109389190810190612583565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091169063dd8520089061096c90600b9060200161272f565b60405160208183030381529060405260016040518363ffffffff1660e01b815260040161099a9291906127f5565b600060405180830381865afa1580156109b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109df9190810190612583565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632781bde26040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a749190810190612583565b604051602001610a8b98979695949392919061283c565b60408051808303601f19018152908290526001547f64bdce1a00000000000000000000000000000000000000000000000000000000835260006004840152909173ffffffffffffffffffffffffffffffffffffffff909116906364bdce1a90602401600060405180830381865afa158015610b0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b329190810190612583565b604051602001610b4594939291906128e1565b60408051808303601f190181528282526001547f47f4388c0000000000000000000000000000000000000000000000000000000084526004840192909252600560448401527f696d6167650000000000000000000000000000000000000000000000000000006064840152600060248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610bf7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c1f9190810190612583565b610c31610c2c8d8d611081565b61152b565b6001546040517f64bdce1a0000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff909116906364bdce1a90602401600060405180830381865afa158015610ca0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cc89190810190612583565b604051602001610cda93929190614d94565b60408051808303601f19018152828252600180547f47f4388c0000000000000000000000000000000000000000000000000000000085526004850193909352600a60448501527f6174747269627574657300000000000000000000000000000000000000000000606485015260248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610d8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610db39190810190612583565b8686610df4576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250610e2b565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b86604051602001610e3f9493929190614e03565b60408051808303601f190181528282526001547f47f4388c00000000000000000000000000000000000000000000000000000000845260048085019390935260448401929092527f6e616d65000000000000000000000000000000000000000000000000000000006064840152600060248401529173ffffffffffffffffffffffffffffffffffffffff909116906347f4388c90608401600060405180830381865afa158015610ef3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f1b9190810190612583565b89604051602001610f2d929190614f8f565b60408051601f198184030181528282526001547febe024050000000000000000000000000000000000000000000000000000000084529151909273ffffffffffffffffffffffffffffffffffffffff9092169163ebe024059160048083019260009291908290030181865afa158015610faa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fd29190810190612583565b604051602001610fe796959493929190615011565b60405160208183030381529060405296505050505050505b9392505050565b61100e611703565b6110186000611784565b565b611022611703565b600b61102e82826150df565b5050565b61103a611703565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6060600061108e846117f9565b61109b9060ff16846151db565b905060006110aa600286612629565b159050806110ed576040518060400160405280600681526020017f4545454545450000000000000000000000000000000000000000000000000000815250611124565b6040518060400160405280600681526020017f31313131313100000000000000000000000000000000000000000000000000008152505b61112e868461186b565b61113886846119e2565b6111428886611a75565b6040516020016111559493929190615206565b604051602081830303815290604052925050505b92915050565b611177611703565b73ffffffffffffffffffffffffffffffffffffffff811661121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61122881611784565b50565b60608160000361126e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611298578061128281615397565b91506112919050600a836153cf565b9150611272565b60008167ffffffffffffffff8111156112b3576112b3612303565b6040519080825280601f01601f1916602001820160405280156112dd576020820181803683370190505b509050815b8515611382576112f36001826153e3565b90506000611302600a886153cf565b61130d90600a6153f6565b61131790886153e3565b611322906030615433565b905060008160f81b90508084848151811061133f5761133f6125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611379600a896153cf565b975050506112e2565b50949350505050565b60608260008367ffffffffffffffff8111156113a9576113a9612303565b6040519080825280601f01601f1916602001820160405280156113d3576020820181803683370190505b50905060005b848110156113825782516113ed90866153e3565b81101561145b577f3000000000000000000000000000000000000000000000000000000000000000828281518110611427576114276125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114d0565b8283518661146991906153e3565b61147390836153e3565b81518110611483576114836125fa565b602001015160f81c60f81b8282815181106114a0576114a06125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b806114da81615397565b9150506113d9565b600080805b60508160ff161015611523576114fe858583611bc0565b15611511578161150d8161544c565b9250505b8061151b8161544c565b9150506114e7565b509392505050565b6060815160000361154a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615aaf6040913990506000600384516002611579919061546b565b61158391906153cf565b61158e9060046153f6565b9050600061159d82602061546b565b67ffffffffffffffff8111156115b5576115b5612303565b6040519080825280601f01601f1916602001820160405280156115df576020820181803683370190505b509050818152600183018586518101602084015b8183101561164b576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f81168501518253506001016115f3565b60038951066001811461166557600281146116af576116f5565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526116f5565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b509398975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611216565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600181611809606485612629565b905060198160ff1610156118205760019150611864565b60328160ff1610156118355760029150611864565b604b8160ff16101561184a5760039150611864565b605a8160ff16101561185f5760049150611864565b600591505b5092915050565b60606118af838360006040518060400160405280600381526020017f3130340000000000000000000000000000000000000000000000000000000000815250611c07565b6118f1848460086040518060400160405280600381526020017f3134340000000000000000000000000000000000000000000000000000000000815250611c07565b611933858560106040518060400160405280600381526020017f3138340000000000000000000000000000000000000000000000000000000000815250611c07565b611975868660186040518060400160405280600381526020017f3232340000000000000000000000000000000000000000000000000000000000815250611c07565b6119b7878760206040518060400160405280600381526020017f3236340000000000000000000000000000000000000000000000000000000000815250611c07565b6040516020016119cb95949392919061547e565b604051602081830303815290604052905092915050565b606081611a24576040518060400160405280600681526020017f3131313131310000000000000000000000000000000000000000000000000000815250611a5b565b6040518060400160405280600681526020017f45454545454500000000000000000000000000000000000000000000000000008152505b611a648461019d565b6040516020016119cb9291906154e9565b6060611ab9838360286040518060400160405280600381526020017f3430300000000000000000000000000000000000000000000000000000000000815250611c07565b611afb848460306040518060400160405280600381526020017f3434300000000000000000000000000000000000000000000000000000000000815250611c07565b611b3d858560386040518060400160405280600381526020017f3438300000000000000000000000000000000000000000000000000000000000815250611c07565b611b7e8686604080518060400160405280600381526020017f3532300000000000000000000000000000000000000000000000000000000000815250611c07565b6119b7878760486040518060400160405280600381526020017f3536300000000000000000000000000000000000000000000000000000000000815250611c07565b6000611bf77f00000000000000000000000000000000000000000000000000000000000f424062ffffff60ff851687901c16612629565b8362ffffff161190509392505050565b606081611c15868686611bc0565b611c2e5760405180602001604052806000815250611c8a565b611c8a611c4f611c3f866003615652565b60ff1688901c62ffffff166120b0565b6040518060400160405280600381526020017f3130340000000000000000000000000000000000000000000000000000000000815250612221565b611c9f8787611c9a886001615433565b611bc0565b611cb85760405180602001604052806000815250611d1f565b611d1f611ce4611cc9876001615433565b611cd4906003615652565b60ff1689901c62ffffff166120b0565b6040518060400160405280600381526020017f3134340000000000000000000000000000000000000000000000000000000000815250612221565b611d2f8888611c9a896002615433565b611d485760405180602001604052806000815250611daf565b611daf611d74611d59886002615433565b611d64906003615652565b60ff168a901c62ffffff166120b0565b6040518060400160405280600381526020017f3138340000000000000000000000000000000000000000000000000000000000815250612221565b611dbf8989611c9a8a6003615433565b611dd85760405180602001604052806000815250611e3f565b611e3f611e04611de9896003615433565b611df4906003615652565b60ff168b901c62ffffff166120b0565b6040518060400160405280600381526020017f3232340000000000000000000000000000000000000000000000000000000000815250612221565b611e4f8a8a611c9a8b6004615433565b611e685760405180602001604052806000815250611ecf565b611ecf611e94611e798a6004615433565b611e84906003615652565b60ff168c901c62ffffff166120b0565b6040518060400160405280600381526020017f3236340000000000000000000000000000000000000000000000000000000000815250612221565b611edf8b8b611c9a8c6005615433565b611ef85760405180602001604052806000815250611f5f565b611f5f611f24611f098b6005615433565b611f14906003615652565b60ff168d901c62ffffff166120b0565b6040518060400160405280600381526020017f3330340000000000000000000000000000000000000000000000000000000000815250612221565b611f6f8c8c611c9a8d6006615433565b611f885760405180602001604052806000815250611fef565b611fef611fb4611f998c6006615433565b611fa4906003615652565b60ff168e901c62ffffff166120b0565b6040518060400160405280600381526020017f3334340000000000000000000000000000000000000000000000000000000000815250612221565b611fff8d8d611c9a8e6007615433565b612018576040518060200160405280600081525061207f565b61207f6120446120298d6007615433565b612034906003615652565b60ff168f901c62ffffff166120b0565b6040518060400160405280600381526020017f3338340000000000000000000000000000000000000000000000000000000000815250612221565b6040516020016120979998979695949392919061567b565b6040516020818303038152906040529050949350505050565b6060816000036120f357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561211d578061210781615397565b915061211690506010836153cf565b91506120f7565b60008167ffffffffffffffff81111561213857612138612303565b6040519080825280601f01601f191660200182016040528015612162576020820181803683370190505b509050815b8515611382576121786001826153e3565b905060006121876010886153cf565b6121929060106153f6565b61219c90886153e3565b6121a7906030615433565b905060398160ff1611156121c3576121c0600782615433565b90505b60008160f81b9050808484815181106121de576121de6125fa565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506122186010896153cf565b97505050612167565b60608183846040516020016119cb939291906157b4565b803562ffffff8116811461224b57600080fd5b919050565b60006020828403121561226257600080fd5b610fff82612238565b60005b8381101561228657818101518382015260200161226e565b50506000910152565b600081518084526122a781602086016020860161226b565b601f01601f19169290920160200192915050565b602081526000610fff602083018461228f565b6000806000606084860312156122e357600080fd5b83359250602084013591506122fa60408501612238565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235b5761235b612303565b604052919050565b600067ffffffffffffffff82111561237d5761237d612303565b50601f01601f191660200190565b60006020828403121561239d57600080fd5b813567ffffffffffffffff8111156123b457600080fd5b8201601f810184136123c557600080fd5b80356123d86123d382612363565b612332565b8181528560208385010111156123ed57600080fd5b81602084016020830137600091810160200191909152949350505050565b60006020828403121561241d57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610fff57600080fd5b6000806040838503121561245457600080fd5b8235915061246460208401612238565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff808416806124e1576124e161246d565b92169190910492915050565b600062ffffff808416806125035761250361246d565b92169190910692915050565b6000815161252181856020860161226b565b9290920192915050565b6000835161253d81846020880161226b565b7f2e00000000000000000000000000000000000000000000000000000000000000908301908152835161257781600184016020880161226b565b01600101949350505050565b60006020828403121561259557600080fd5b815167ffffffffffffffff8111156125ac57600080fd5b8201601f810184136125bd57600080fd5b80516125cb6123d382612363565b8181528560208385010111156125e057600080fd5b6125f182602083016020860161226b565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826126385761263861246d565b500690565b60608152600760608201527f746f6b656e496400000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b905082151560408301529392505050565b60608152600860608201527f6761735072696365000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b600181811c908216806126f057607f821691505b602082108103612729577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007f2532353232000000000000000000000000000000000000000000000000000000808352600560008554612764816126dc565b6001828116801561277c57600181146127b3576127e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416868a01528583151584028a010194506127e6565b8960005260208060002060005b858110156127db5781548c82018a01529084019082016127c0565b50505085838a010194505b50505092815201949350505050565b60608152600360608201527f7270630000000000000000000000000000000000000000000000000000000000608082015260a06020820152600061268460a083018561228f565b60008951602061284f8285838f0161226b565b8a51918401916128628184848f0161226b565b8a519201916128748184848e0161226b565b89519201916128868184848d0161226b565b88519201916128988184848c0161226b565b87519201916128aa8184848b0161226b565b86519201916128bc8184848a0161226b565b85519201916128ce818484890161226b565b919091019b9a5050505050505050505050565b600085516128f3818460208a0161226b565b855190830190612907818360208a0161226b565b855191019061291a81836020890161226b565b7f25323533437374796c6525323533452532353041253235323025323532302a2591019081527f323532302532353742253235304125323532302532353230253235323025323560208201527f32306d617267696e25323533412532353230302532353342253235304125323560408201527f323025323532302532353230253235323070616464696e67253235334125323560608201527f323030253235334225323530412532353230253235323025323537442532353060808201527f412532353230253235323063616e76617325323532302532353742253235304160a08201527f253235323025323532302532353230253235323077696474682532353341253260c08201527f353230313030253235323525323533422532353041253235323025323532302560e08201527f32353230253235323068656967687425323533412532353230313030253235326101008201527f35253235334225323530412532353230253235323025323537442532353041256101208201527f3235334325323532467374796c652532353345253235304125323533437363726101408201527f69707425323533452532353041253235323025323532302532353232757365256101608201527f323532307374726963742532353232253235334277696e646f772e6f6e6c6f616101808201527f64253235334428292532353344253235334525323537426c657425323532306d6101a08201527f2532353243612532353344646f63756d656e742e626f647925323532436325326101c08201527f3533446761735072696365253235324375253235334421312532353342636f6e6101e08201527f73742532353230472532353344742532353344253235334525323536302532356102008201527f33432532353346786d6c253235323076657273696f6e253235334425323532326102208201527f312e3025323532322532353230656e636f64696e6725323533442532353232556102408201527f54462d38253235323225323533462532353345253235304125323533437376676102608201527f253235323076657273696f6e25323533442532353232312e31253235323225326102808201527f35323076696577426f78253235334425323532323025323532303025323532306102a08201527f32342532353230323425323532322532353230786d6c6e7325323533442532356102c08201527f3232687474702532353341253235324625323532467777772e77332e6f7267256102e08201527f32353246323030302532353246737667253235323225323533452532353041256103008201527f3235334367253235323066696c6c2532353344253235323225323532342532356103208201527f37427425323537442532353232253235334525323530412532353343706174686103408201527f253235323064253235334425323532324d32322e32352532353230313263302d6103608201527f312e34332d2e38382d322e36372d322e31392d332e33342e34362d312e33392e6103808201527f322d322e392d2e38312d332e3931732d322e35322d312e32372d332e39312d2e6103a08201527f3831632d2e36362d312e33312d312e39312d322e31392d332e33342d322e31396103c08201527f732d322e36372e38382d332e33332532353230322e3139632d312e342d2e34366103e08201527f2d322e39312d2e322d332e39322e3831732d312e32362532353230322e35322d6104008201527f2e382532353230332e3931632d312e33312e36372d322e322532353230312e396104208201527f312d322e322532353230332e3334732e38392532353230322e363725323532306104408201527f322e322532353230332e3334632d2e34362532353230312e33392d2e323125326104608201527f353230322e392e382532353230332e393173322e35322532353230312e3236256104808201527f32353230332e39312e3831632e36372532353230312e33312532353230312e396104a08201527f312532353230322e31392532353230332e33342532353230322e313973322e366104c08201527f382d2e38382532353230332e33342d322e313963312e33392e343525323532306104e08201527f322e392e322532353230332e39312d2e383173312e32372d322e35322e38312d6105008201527f332e393163312e33312d2e36372532353230322e31392d312e393125323532306105208201527f322e31392d332e33347a6d2d31312e37312532353230342e324c362e382532356105408201527f323031322e34366c312e34312d312e34322532353230322e32362532353230326105608201527f2e32362532353230342e382d352e32332532353230312e34372532353230312e6105808201527f33362d362e322532353230362e37377a2532353232253235323066696c6c25326105a08201527f35334425323532322532353233316439626630253235323225323532462532356105c08201527f33452532353041253235334325323532466725323533452532353041253235336105e08201527f4325323532467376672532353345253235363025323532437a253235334474256106008201527f3235334425323533452532353742636f6e737425323532306f25323533446e656106208201527f77253235323054485245452e546578747572654c6f6164657228292e6c6f61646106408201527f282532353630646174612532353341696d6167652532353246737667253235326106608201527f42786d6c253235324325323532342532353742656e636f6465555249436f6d706106808201527f6f6e656e74287429253235374425323536302925323532436225323533446e656106a08201527f77253235323054485245452e4d65736842617369634d6174657269616c2825326106c08201527f3537427472616e73706172656e742532353341213025323532436f70616369746106e08201527f7925323533412e36352532353243636f6c6f72253235334131363737373134376107008201527f2532353243626c656e64696e67253235334154485245452e41646469746976656107208201527f426c656e64696e6725323532436d617025323533416f253235374429253235326107408201527f436525323533446e6577253235323054485245452e506c616e6547656f6d65746107608201527f72792831323825323532433132382925323532436425323533446e65772532356107808201527f323054485245452e4d657368286525323532436229253235334272657475726e6107a08201527f25323537427465787475726525323533416f25323532436d6174657269616c256107c08201527f3235334162253235324367656f6d6574727925323533416525323532436d65736107e08201527f68253235334164253235374425323537442532353243792532353344646f63756108008201527f6d656e742e637265617465456c656d656e74282532353232696e7075742532356108208201527f3232292532353342792e7479706525323533442532353232636865636b626f786108408201527f25323532322532353243792e6964253235334425323532326c697665436865636108608201527f6b626f7825323532322532353342636f6e73742532353230682532353344646f6108808201527f63756d656e742e637265617465456c656d656e742825323532326c6162656c256108a08201527f32353232292532353342682e68746d6c466f72253235334425323532326c69766108c08201527f65436865636b626f7825323532322532353243682e696e6e65725465787425326108e08201527f35334425323532324c69766525323532307570646174652532353232253235336109008201527f42636f6e73742532353230722532353344646f63756d656e742e6372656174656109208201527f456c656d656e742825323532327370616e2532353232292532353342722e73746109408201527f796c652e706f736974696f6e253235334425323532326162736f6c75746525326109608201527f3532322532353243722e7374796c652e626f74746f6d253235334425323532326109808201527f313025323532322532353243722e7374796c652e6c65667425323533442532356109a08201527f3232313025323532322532353243682e7374796c652e636f6c6f7225323533446109c08201527f2532353232776869746525323532322532353243682e7374796c652e6d6172676109e08201527f696e4c656674253235334425323532323130707825323532322532353243722e610a008201527f617070656e644368696c642879292532353243722e617070656e644368696c64610a208201527f2868292532353243612e617070656e644368696c642872292532353243792e61610a408201527f64644576656e744c697374656e65722825323532326368616e67652532353232610a608201527f253235324374253235334425323533452532353742752532353344742e746172610a808201527f6765742e636865636b656425323532437525323532362532353236284d253235610aa08201527f334430292532353744292532353342636f6e7374253235323066253235334464610ac08201527f6f63756d656e742e637265617465456c656d656e742825323532326469762532610ae08201527f353232292532353342662e7374796c6525323533442532353232706f73697469610b008201527f6f6e253235334125323532306162736f6c75746525323533422532353230746f610b208201527f7025323533412532353230313025323533422532353230726967687425323533610b408201527f412532353230313025323533422532353230636f6c6f72253235334125323532610b608201527f30776869746525323532322532353243662e696e6e6572546578742532353344610b808201527f2532353630476173253235323070726963652532353341253235323025323532610ba08201527f3425323537426761735072696365253235374425323532306777656925323536610bc08201527f302532353243612e617070656e644368696c642866292532353342636f6e7374610be08201527f25323532306c2532353344742532353344253235334528742125323533442532610c008201527f353344766f696425323532303025323532362532353236286d25323533447425610c208201527f3235323532313437343833363437292532353343253235334430253235323625610c408201527f32353236286d2532353242253235334432313437343833363436292532353243610c608201527f28286d253235334431363830372a6d253235323532313437343833363437292d610c808201527f31292532353246323134373438333634362925323533426c28746f6b656e4964610ca08201527f292532353342636f6e7374253235374277696474682532353341522532353243610cc08201527f68656967687425323533414525323537442532353344612e676574426f756e64610ce08201527f696e67436c69656e7452656374282925323533426c6574253235323054253235610d008201527f3344452532353246322532353243692532353344452a32253235324350253235610d208201527f3344302532353342636f6e737425323532307325323533446e65772532353230610d408201527f54485245452e506572737065637469766543616d657261283830253235324352610d608201527f2532353246452532353243312532353243336533292532353342732e706f7369610d808201527f74696f6e2e7a253235334431353030253235334266756e6374696f6e25323532610da08201527f30412874292532353742742e69735072696d6172792532353236253235323628610dc08201527f502532353344742e636c69656e74592d54292532353744636f6e737425323532610de08201527f306e25323533446e6577253235323054485245452e5363656e6525323533426e610e008201527f2e6261636b67726f756e6425323533446e6577253235323054485245452e436f610e208201527f6c6f722830292532353342636f6e737425323532304225323533446e65772532610e408201527f35323054485245452e48656d697370686572654c696768742831363737373134610e608201527f3725323532433532363336382532353243312925323533426e2e616464284229610e808201527f2532353342636f6e737425323532307725323533446e65772532353230544852610ea08201527f45452e506f696e744c6967687428313637373731343725323532433125323532610ec08201527f43316533253235324330292532353342772e706f736974696f6e2e7365742830610ee08201527f2532353243302532353243313530292532353243772e6c6f6f6b417428302532610f008201527f353243302532353243302925323532436e2e6164642877292532353342636f6e610f208201527f737425323532307025323533446e6577253235323054485245452e576562474c610f408201527f52656e6465726572282532353742616e7469616c696173253235334121302532610f608201527f353744292532353342702e736574506978656c526174696f2877696e646f772e610f808201527f646576696365506978656c526174696f292532353243702e73657453697a6528610fa08201527f52253235324345292532353342636f6e737425323532307825323533446e6577610fc08201527f253235323054485245452e43796c696e64657247656f6d657472792835302532610fe08201527f35324331303025323532436925323532433332253235324331253235324321306110008201527f292532353342782e7472616e736c6174652830253235324369253235324632256110208201527f3235324330292532353342636f6e737425323532304f25323533446e657725326110408201527f35323054485245452e4d65736850686f6e674d6174657269616c2825323537426110608201527f636f6c6f7225323533414d6174682e6365696c2831363737373231352a6c28296110808201527f29253235324373696465253235334154485245452e446f75626c6553696465256110a08201527f32353243666c617453686164696e6725323533412130253235374429253235326110c08201527f437625323533446e6577253235323054485245452e4d657368287825323532436110e08201527f4f292532353342762e706f736974696f6e2e73657428302532353243692532356111008201527f3246322532353243302925323532436e2e61646428762925323533426c6574256111208201527f32353230672532353344253235354225323535442532353342636f6e737425326111408201527f3532304825323533447a284728253235323225323532333164396266302532356111608201527f32322929253235334266756e6374696f6e25323532304328292532353742636f6111808201527f6e73742532353230742532353344446174652e6e6f77282925323532436f25326111a08201527f3533446e6577253235323054485245452e4d65736828482e67656f6d657472796111c08201527f2532353243482e6d6174657269616c2925323533426f2e64656c6179253235336111e08201527f444d6174682e666c6f6f72283565332a4d6174682e72616e646f6d28292925326112008201527f3532427425323532436f2e706f736974696f6e2e7365742831302d33302a4d616112208201527f74682e72616e646f6d28292532353243326535253235324331302d33302a4d616112408201527f74682e72616e646f6d2829292532353243672e70757368286f2925323532436e6112608201527f2e616464286f292532353744666f72286c6574253235323074253235334430256112808201527f32353342742532353343632532353342742532353242253235324229432829256112a08201527f32353342636f6e737425323532306a25323533442532353542253235354425326112c08201527f353243492532353344313025323532424d6174682e6365696c2831302a6c28296112e08201527f292532353243253235323425323533446e6577253235323054485245452e53706113008201527f6865726547656f6d6574727928322532353243382532353243382925323532436113208201527f6b25323533446e6577253235323054485245452e4d65736842617369634d61746113408201527f657269616c25323533426b2e636f6c6f722e73657428313637373732313529256113608201527f32353342666f72286c65742532353230742532353344302532353342742532356113808201527f33434925323533427425323532422532353242292532353742636f6e737425326113a08201527f3532306f25323533446e6577253235323054485245452e4d65736828253235326113c08201527f3425323532436b2925323533426f2e706f736974696f6e2e736574283165332d6113e08201527f3265332a6c282925323532433165332d3265332a6c282925323532433165332d6114008201527f3265332a6c28292925323532436a2e70757368286f2925323532436e2e6164646114208201527f286f29253235374466756e6374696f6e25323532305328292532353742636f6e6114408201527f73742532353742776964746825323533417425323532436865696768742532356114608201527f33416f25323537442532353344612e676574426f756e64696e67436c69656e746114808201527f52656374282925323533425425323533446f25323532463225323532436925326114a08201527f3533446f2a322532353243732e61737065637425323533447425323532466f256114c08201527f32353243732e75706461746550726f6a656374696f6e4d6174726978282925326114e08201527f353243702e73657453697a65287425323532436f292532353243762e706f73696115008201527f74696f6e2e7365742830253235324369253235324632253235324330292532356115208201527f3744612e617070656e644368696c6428702e646f6d456c656d656e74292532356115408201527f3243612e7374796c652e746f756368416374696f6e253235334425323532326e6115608201527f6f6e6525323532322532353243612e6164644576656e744c697374656e6572286115808201527f2532353232706f696e7465726d6f7665253235323225323532434129253235326115a08201527f4377696e646f772e6164644576656e744c697374656e657228253235323272656115c08201527f73697a65253235323225323532435329253235324353282925323533426c65746115e08201527f25323532304d2532353344323430253235334266756e6374696f6e25323532306116008201527f4c2829253235374269662872657175657374416e696d6174696f6e4672616d656116208201527f284c29253235324375253235323625323532364d2d2d253235334330253235326116408201527f362532353236284d2532353344323430253235324366657463682872706325326116608201527f35324325323537426d6574686f6425323533412532353232504f5354253235326116808201527f322532353243626f647925323533414a534f4e2e737472696e676966792825326116a08201527f3537426a736f6e72706325323533412532353232322e302532353232253235326116c08201527f436d6574686f64253235334125323532326574685f67617350726963652532356116e08201527f32322532353243706172616d73253235334125323535422532353544253235326117008201527f4369642532353341312532353744292532353744292e7468656e286173796e636117208201527f253235323065253235334425323533452532353742636f6e73742532353742726117408201527f6573756c742532353341642532353744253235334461776169742532353230656117608201527f2e6a736f6e28292532353342676173507269636525323533447061727365496e6117808201527f74286425323532433136292532353246316539253235374429292532353243676117a08201527f61735072696365212532353344253235334463292532353742696628676173506117c08201527f7269636525323533456329666f72286c657425323532306525323533443025326117e08201527f35334265253235334367617350726963652d63253235334265253235324225326118008201527f353242294328292532353342656c736525323537426c657425323532306525326118208201527f353344632d67617350726963652532353342666f7228636f6e737425323532306118408201527f6425323532306f6625323532306729696628642e646f6e6525323537432532356118608201527f374328642e646f6e65253235334421302532353243652d2d29253235324365256118808201527f3235334325323533443029627265616b253235374463253235334467617350726118a08201527f6963652532353243662e696e6e657254657874253235334425323536304761736118c08201527f25323532307072696365253235334125323532302532353234253235374267616118e08201527f735072696365253235374425323532306777656925323536302532353744732e6119008201527f706f736974696f6e2e79253235324225323533442e30352a283230302d502d736119208201527f2e706f736974696f6e2e792925323532436e2e726f746174696f6e2e792d25326119408201527f3533442e3030352532353243732e6c6f6f6b4174286e2e706f736974696f6e296119608201527f2532353243702e72656e646572286e253235324373292532353342636f6e73746119808201527f2532353230742532353344446174652e6e6f77282925323532436f25323533446119a08201527f2e3030312a7425323532436225323533444d6174682e73696e286f29253235336119c08201527f42666f7228636f6e737425323532306525323532306f662532353230672925326119e08201527f353742696628652e6c6f6f6b417428732e706f736974696f6e29253235324365611a008201527f2e64656c617929696628742532353345652e64656c617929652e64656c617925611a208201527f323533446e756c6c2532353243652e706f736974696f6e2e7925323533446925611a408201527f323532463225323532423530253235324232302a4d6174682e72616e646f6d28611a608201527f292532353342656c73652532353230636f6e74696e75652532353342652e7665611a808201527f6c6f636974792532353344652e76656c6f63697479253235374325323537436e611aa08201527f6577253235323054485245452e566563746f7233283025323532432d31253235611ac08201527f324330292532353243652e76656c6f636974792e792d25323533442e32363725611ae08201527f32353243652e706f736974696f6e2e61646428652e76656c6f63697479292532611b008201527f353243652e706f736974696f6e2e7925323533432d6925323532463225323532611b208201527f36253235323628652e626f756e6365436f756e742532353346652e626f756e63611b408201527f65436f756e74253235334333253235334628652e626f756e6365436f756e7425611b608201527f3235324225323532422532353243652e76656c6f636974792e7925323533442d611b808201527f652e76656c6f636974792e792a2e322532353243652e706f736974696f6e2e79611ba08201527f25323533442d69253235324632292532353341652e646f6e6525323533462867611bc08201527f2e73706c69636528672e696e6465784f66286529253235324331292532353243611be08201527f6e2e72656d6f766528652929253235334128652e706f736974696f6e2e736574611c008201527f2831302d32302a4d6174682e72616e646f6d2829253235324332653625323532611c208201527f4331302d32302a4d6174682e72616e646f6d2829292532353243652e626f756e611c408201527f6365436f756e742532353344302532353243652e76656c6f636974792e782532611c608201527f353344302532353243652e76656c6f636974792e7925323533442d3125323532611c808201527f43652e76656c6f636974792e7a2532353344302532353243652e64656c617925611ca08201527f323533444d6174682e666c6f6f72283565332a4d6174682e72616e646f6d2829611cc08201527f2925323532427429253235334128652e626f756e6365436f756e742532353344611ce08201527f312532353243652e76656c6f636974792e782532353344382d31362a4d617468611d008201527f2e72616e646f6d28292532353243652e76656c6f636974792e7a253235334438611d208201527f2d31362a4d6174682e72616e646f6d28292532353243652e76656c6f63697479611d408201527f2e7925323533442d652e76656c6f636974792e792a2e322532353243652e706f611d608201527f736974696f6e2e7925323533442d692532353246322929253235374425323537611d808201527f444c282925323537442532353342253235304125323530412532353343253235611da08201527f3246736372697074253235334500000000000000000000000000000000000000611dc0820152614d89611dcd82018561250f565b979650505050505050565b60008451614da681846020890161226b565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000009083019081528451614de081601a84016020890161226b565b8451910190614df681601a84016020880161226b565b01601a0195945050505050565b60008551614e15818460208a0161226b565b80830190507f25354225374225323274726169745f747970652532322533412532326761732581527f323061742532306d696e7425323225324325323276616c75652532322533410060208201528551614e7681603f840160208a0161226b565b7f25374425324325374225323274726169745f7479706525323225334125323264603f92909101918201527f61726b25323225324325323276616c7565253232253341253232000000000000605f8201528451614eda81607984016020890161226b565b7f25323225374425324325374225323274726169745f7479706525323225334125607992909101918201527f32326e756d6265722532306f66253230636865636b6d61726b7325323225324360998201527f25323276616c756525323225334100000000000000000000000000000000000060b9820152614f5e60c782018561250f565b7f25374425354425324300000000000000000000000000000000000000000000008152600901979650505050505050565b60008351614fa181846020880161226b565b7f4f6e636861696e253230476173253230436865636b25323025323300000000009083019081528351614fdb81601b84016020880161226b565b7f2532320000000000000000000000000000000000000000000000000000000000601b9290910191820152601e01949350505050565b6000875160206150248285838d0161226b565b8851918401916150378184848d0161226b565b88519201916150498184848c0161226b565b875192019161505b8184848b0161226b565b865192019161506d8184848a0161226b565b855192019161507f818484890161226b565b919091019998505050505050505050565b601f8211156150da57600081815260208120601f850160051c810160208610156150b75750805b601f850160051c820191505b818110156150d6578281556001016150c3565b5050505b505050565b815167ffffffffffffffff8111156150f9576150f9612303565b61510d8161510784546126dc565b84615090565b602080601f831160018114615160576000841561512a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556150d6565b600085815260208120601f198616915b8281101561518f57888601518255948401946001909101908401615170565b50858210156151cb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600062ffffff808316818516818304811182151516156151fd576151fd61249c565b02949350505050565b7f3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d22555481527f462d38223f3e3c73766720617269612d68696464656e3d22747275652220766560208201527f7273696f6e3d22312e31222076696577426f783d22302030203531322036383860408201527f2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f60608201527f737667223e3c726563742077696474683d223130302522206865696768743d2260808201527f31303025222066696c6c3d22230000000000000000000000000000000000000060a0820152600085516152fc8160ad850160208a0161226b565b7f22202f3e0000000000000000000000000000000000000000000000000000000060ad9184019182015285516153398160b1840160208a0161226b565b855191019061534f8160b184016020890161226b565b61535e60b1828401018661250f565b91505061538a817f3c2f7376673e00000000000000000000000000000000000000000000000000009052565b6006019695505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153c8576153c861249c565b5060010190565b6000826153de576153de61246d565b500490565b818103818111156111695761116961249c565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561542e5761542e61249c565b500290565b60ff81811683821601908111156111695761116961249c565b600060ff821660ff81036154625761546261249c565b60010192915050565b808201808211156111695761116961249c565b60008651615490818460208b0161226b565b8651908301906154a4818360208b0161226b565b86519101906154b7818360208a0161226b565b85519101906154ca81836020890161226b565b84519101906154dd81836020880161226b565b01979650505050505050565b7f3c7465787420783d223530252220746578742d616e63686f723d226d6964646c81527f6522207374796c653d2277686974652d73706163653a207072653b2066696c6c60208201527f3a2023000000000000000000000000000000000000000000000000000000000060408201526000835161556d81604385016020880161226b565b7f3b20666f6e742d66616d696c793a20417269616c2c2073616e732d73657269666043918401918201527f3b20666f6e742d73697a653a2033332e3370783b2220793d22333533223e4d6960638201527f6e74656420617420000000000000000000000000000000000000000000000000608382015283516155f681608b84016020880161226b565b7f2067776569000000000000000000000000000000000000000000000000000000608b92909101918201527f3c2f746578743e000000000000000000000000000000000000000000000000006090820152609701949350505050565b600060ff821660ff84168160ff04811182151516156156735761567361249c565b029392505050565b7f3c67207472616e73666f726d3d227472616e736c617465283020000000000000815260008a516156b381601a850160208f0161226b565b7f29223e0000000000000000000000000000000000000000000000000000000000601a918401918201528a516156f081601d840160208f0161226b565b8a5191019061570681601d840160208e0161226b565b895191019061571c81601d840160208d0161226b565b885191019061573281601d840160208c0161226b565b875191019061574881601d840160208b0161226b565b865191019061575e81601d840160208a0161226b565b615776615770601d838501018861250f565b8661250f565b9150506157a2817f3c2f673e000000000000000000000000000000000000000000000000000000009052565b6004019b9a5050505050505050505050565b7f3c67207472616e73666f726d3d227472616e736c6174652800000000000000008152600084516157ec81601885016020890161226b565b7f203029222066696c6c3d22230000000000000000000000000000000000000000601891840191820152845161582981602484016020890161226b565b7f223e3c7061746820643d224d32322e323520313263302d312e34332d2e38382d602492909101918201527f322e36372d322e31392d332e33342e34362d312e33392e322d322e392d2e383160448201527f2d332e3931732d322e35322d312e32372d332e39312d2e3831632d2e36362d3160648201527f2e33312d312e39312d322e31392d332e33342d322e3139732d322e36372e383860848201527f2d332e333320322e3139632d312e342d2e34362d322e39312d2e322d332e393260a48201527f2e3831732d312e323620322e35322d2e3820332e3931632d312e33312e36372d60c48201527f322e3220312e39312d322e3220332e3334732e383920322e363720322e32203360e48201527f2e3334632d2e343620312e33392d2e323120322e392e3820332e393173322e356101048201527f3220312e323620332e39312e3831632e363720312e333120312e393120322e316101248201527f3920332e333420322e313973322e36382d2e383820332e33342d322e313963316101448201527f2e33392e343520322e392e3220332e39312d2e383173312e32372d322e35322e6101648201527f38312d332e393163312e33312d2e363720322e31392d312e393120322e31392d6101848201527f332e33347a6d2d31312e373120342e324c362e382031322e34366c312e34312d6101a48201527f312e343220322e323620322e323620342e382d352e323320312e343720312e336101c48201527f362d362e3220362e37377a222066696c6c3d22230000000000000000000000006101e4820152615a7e6101f882018561250f565b7f222f3e3c2f673e000000000000000000000000000000000000000000000000008152600701969550505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122081caa71939f6f7d6eea5858e32ca4d3474f3e1008550f06ee6adf00759f7fc9464736f6c63430008100033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ec8ef4c339508224e063e43e30e2dcbe19d9c087000000000000000000000000a32bb79b33b29e483d0949c99ec0c439b29e2b330000000000000000000000000d104dea962b090bc46c67a12e800ff16eeffb750000000000000000000000001d11a1c75e439a50734aef3469aed9ca4ffe39fc0000000000000000000000006bab43d4f3587f9f3ca1152c63e52bf7f8de2dc100000000000000000000000057beae62670ff6ccf8311411a2a2aab453413987000000000000000000000000f3a95b30e1fc2edcea41ff93270249b6ab97973000000000000000000000000052a31d845f4bdc1d47ee21db7c25bde2423a91ae0000000000000000000000006cccc7ea426e14f1e07528296c7d226677fd2ff6000000000000000000000000c230862406bbe44f499943ae4e9e6317a95bc7ad

-----Decoded View---------------
Arg [0] : _compiler (address): 0xeC8EF4c339508224E063e43e30E2dCBe19D9c087
Arg [1] : chunk1 (address): 0xA32bb79b33B29e483d0949C99EC0C439b29e2B33
Arg [2] : chunk2 (address): 0x0d104Dea962b090bC46c67a12e800ff16eeffB75
Arg [3] : chunk3 (address): 0x1D11a1c75e439A50734AEF3469aed9ca4fFe39fc
Arg [4] : chunk4 (address): 0x6bAb43D4F3587f9f3ca1152C63E52BF7F8de2Dc1
Arg [5] : chunk5 (address): 0x57beAe62670Ff6cCf8311411a2A2aAb453413987
Arg [6] : chunk6 (address): 0xF3A95B30E1Fc2EdCea41fF93270249b6Ab979730
Arg [7] : chunk7 (address): 0x52a31D845f4bdC1D47Ee21dB7C25Bde2423A91Ae
Arg [8] : chunk8 (address): 0x6CcCc7eA426E14F1E07528296c7d226677fd2fF6
Arg [9] : chunk9 (address): 0xc230862406bBe44f499943Ae4E9E6317a95BC7Ad

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000ec8ef4c339508224e063e43e30e2dcbe19d9c087
Arg [1] : 000000000000000000000000a32bb79b33b29e483d0949c99ec0c439b29e2b33
Arg [2] : 0000000000000000000000000d104dea962b090bc46c67a12e800ff16eeffb75
Arg [3] : 0000000000000000000000001d11a1c75e439a50734aef3469aed9ca4ffe39fc
Arg [4] : 0000000000000000000000006bab43d4f3587f9f3ca1152c63e52bf7f8de2dc1
Arg [5] : 00000000000000000000000057beae62670ff6ccf8311411a2a2aab453413987
Arg [6] : 000000000000000000000000f3a95b30e1fc2edcea41ff93270249b6ab979730
Arg [7] : 00000000000000000000000052a31d845f4bdc1d47ee21db7c25bde2423a91ae
Arg [8] : 0000000000000000000000006cccc7ea426e14f1e07528296c7d226677fd2ff6
Arg [9] : 000000000000000000000000c230862406bbe44f499943ae4e9e6317a95bc7ad


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.