#include <cstdio>
#include <cassert>
#include <cstdint>
#include <vector>
#include <algorithm>
#include <string>
#include <stdexcept>

#define fprintf(...) void(0)

struct Tsurai: public std::out_of_range {
  Tsurai(int d): std::out_of_range(std::string("L: ")+std::to_string(d)) {}
};

void apply(int &lhs, char op, int rhs) {
  switch (op) {
  case '+':
    lhs += rhs;
    break;
  case '-':
    lhs -= rhs;
    break;
  case '*':
    lhs *= rhs;
    break;
  }
  if (!(0 <= lhs && lhs < 1024))
    throw Tsurai(__LINE__);
}

int parse_bin(const std::string &s, size_t &i) {
  int res=0;
  while (i < s.length() && isdigit(s[i])) {
    res = res*2+s[i]-'0';
    ++i;
    if (res >= 1024) throw Tsurai(__LINE__);
  }
  assert(res < 1024);
  return res;
}

std::pair<int, int> parse(
    const std::string &s, size_t &i, int &balance,
    const std::vector<std::string> &ops={"+-", "*", ""}, size_t prec=0) {

  // <calculates, num of terms/factors>
  fprintf(stderr, "C%zu\n", i);
  fprintf(stderr, "S: %s\n", s.c_str());
  if (prec == ops.size()) {
    if (s.at(i) == '(') {
      fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);
      ++i;
      ++balance;
      fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);
      if (s.at(i) == ')') throw Tsurai(__LINE__);
      size_t j=i;
      (void)parse_bin(s, j);
      if (s.at(j) == ')') throw Tsurai(__LINE__);

      fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);
      std::pair<int, int> res=parse(s, i, balance, ops, 0);
      fprintf(stderr, "# on line %d: %d\n", __LINE__, res.second);
      fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);
      if (s.at(i) != ')')
        throw Tsurai(__LINE__);
      ++i;
      --balance;
      if (balance < 0)
        throw Tsurai(__LINE__);
      fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);
      if (res.second <= 1)
        throw Tsurai(__LINE__);
      return {res.first, 1};
    }
    fprintf(stderr, "%d\n", __LINE__);
    if (isdigit(s.at(i))) {
      fprintf(stderr, "%d\n", __LINE__);
      return {parse_bin(s, i), 1};
    }
    throw Tsurai(__LINE__);
  }

  std::pair<int, int> lhs=parse(s, i, balance, ops, prec+1);
  fprintf(stderr, "\"%s\"[%zu] on line %d\n", s.c_str(), i, __LINE__);

  while (i < s.length()) {
    char op=s.at(i);
    if (op == ')') {
      break;
    }
    if (!(op == '+' || op == '-' || op == '*'))
      throw Tsurai(__LINE__);
    if (!std::count(ops[prec].begin(), ops[prec].end(), op))
      break;

    std::pair<int, int> rhs=parse(s, ++i, balance, ops, prec+1);
    apply(lhs.first, op, rhs.first);
    ++lhs.second;
    lhs.second += rhs.second;
    fprintf(stderr, "# on line %d: %d\n", __LINE__, lhs.second);
  }
  fprintf(stderr, "# on line %d: %d\n", __LINE__, lhs.second);
  return lhs;
}

int rec(std::string &s, std::vector<size_t> &dot) {
  if (dot.empty()) {
    try {
      size_t i=0;
      int b=0;
      int res=parse(s, i, b).first;
      if (i != s.length() || b < 0) return -1;
      return res;
    } catch (std::out_of_range x) {
      fprintf(stderr, "Tsurai on %s\n", x.what());
      return -1;
    }
  }

  size_t x=dot.back();
  dot.pop_back();
  int res=-1;
  for (char ch: {'0', '1', '+', '-', '*', '(', ')'}) {
    s[x] = ch;
    res = std::max(res, rec(s, dot));
  }
  s[x] = '.';
  dot.push_back(x);
  return res;
}

int main() {
  char buf[128];
  scanf("%s", buf);
  std::string s=buf;
  std::vector<size_t> dot;
  for (size_t i=0; i<s.length(); ++i) {
    if (s[i] == '.')
      dot.push_back(i);
  }

  printf("%d\n", rec(s, dot));
}



Measured memory_bytes: 3148