contract ERC721FullBatchMint is TradeableERC721Token {
  string private _baseTokenURI;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory baseURI
  ) TradeableERC721Token(_name, _symbol) public {
    _baseTokenURI = Strings.strConcat(baseURI, Strings.fromAddress(address(this)), "/");
  }

  function baseTokenURI() public view returns (string memory) {
    return _baseTokenURI;
  }

  function setBaseTokenURI(string memory uri) public onlyMultiOwners {
    _baseTokenURI = uri;
  }

  /* mint multiple tokens at a time */
  function batchMint(address[] calldata receivers, uint256[] calldata tokenIds) external onlyMultiOwners {
    require(receivers.length == tokenIds.length, "length mismatch");
    for (uint256 i = 0; i < receivers.length; i++) {
        address to = receivers[i];
        uint256 newTokenId = tokenIds[i];
        _mint(to, newTokenId);
    }
  }
}
function batchMint(address[] calldata receivers, uint256[] calldata tokenIds) external onlyMultiOwners {
  require(receivers.length == tokenIds.length, "length mismatch");
  for (uint256 i = 0; i < receivers.length; i++) {
      address to = receivers[i];
      uint256 newTokenId = tokenIds[i];
      _mint(to, newTokenId);
  }
}

/* mint multiple tokens at a time */