#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long double ld;
typedef long long ll;
const ll mod=1e9+7;
ll pot(ll x, ll p) {
if (p==0) return 1;
if (p%2==0) {
x=pot(x, p/2);
return (x*x)%mod;
}
return (x*pot(x, p-1))%mod;
}
ll inv(ll x) {
return pot(x, mod-2);
}
ll sumfreewhole(const string& s){
ll prod=1;
ll cn=0;
int cnl=0;
ll sum=0;
assert(s[0]!='*');
assert(s.back()!='*');
for (int i=0;i<(int)s.size();i++){
assert(s[i]!='+');
if (s[i]=='*'){
assert(cnl);
prod*=cn;
prod%=mod;
cn=0;
cnl=0;
} else {
ll t=s[i]-'0';
assert(t>=1&&t<=9);
cnl++;
cn*=10ll;
cn+=t;
cn%=mod;
sum+=prod*cn;
sum%=mod;
}
}
return (prod*cn)%mod;
}
ll prefixes(const string& s){
ll prod=1;
ll cn=0;
int cnl=0;
ll sum=0;
assert(s[0]!='*');
assert(s.back()!='*');
for (int i=0;i<(int)s.size();i++){
assert(s[i]!='+');
if (s[i]=='*'){
assert(cnl);
prod*=cn;
prod%=mod;
cn=0;
cnl=0;
} else {
ll t=s[i]-'0';
assert(t>=1&&t<=9);
cnl++;
cn*=10ll;
cn+=t;
cn%=mod;
sum+=prod*cn;
sum%=mod;
}
}
return sum;
}
ll suffixes(const string& s){
ll prod=1;
ll cn=0;
int cnl=0;
ll cnp=1;
ll sum=0;
assert(s[0]!='*');
assert(s.back()!='*');
for (int i=(int)s.size()-1;i>=0;i--){
assert(s[i]!='+');
if (s[i]=='*'){
assert(cnl);
prod*=cn;
prod%=mod;
cn=0;
cnl=0;
cnp=1;
} else {
ll t=s[i]-'0';
assert(t>=1&&t<=9);
cnl++;
cn+=cnp*t;
cn%=mod;
cnp*=10ll;
cnp%=mod;
sum+=prod*cn;
sum%=mod;
}
}
return sum;
}
ll tps[1010101];
ll solvein2(const string& s){
ll pfs=0;
int n=(int)s.size();
ll ans=0;
for (int i=0;i<n;i++){
//cout<<"pf "<<pfs<<endl;
assert(s[i]!='*');
assert(s[i]!='+');
ll t=s[i]-'0';
assert(t>=1&&t<=9);
ans+=(pfs*10ll)%mod;
ans%=mod;
ans+=t*((ll)i+1ll);
ans%=mod;
pfs*=10ll;
pfs+=t*(ll)(i+1);
pfs%=mod;
}
return ans;
}
ll solvein(const string& s){
int ps=0;
int n=(int)s.size();
for (int i=0;i<n;i++){
assert(s[i]!='+');
if (s[i]=='*'){
ps++;
}
}
ll ans=0;
string cur;
vector<string> ss;
for (int i=0;i<=n;i++){
if (i==n||s[i]=='*'){
ss.push_back(cur);
cur="";
} else {
cur+=s[i];
}
}
vector<ll> sufprod((int)ss.size()+1);
sufprod[0]=1;
for (int i=0;i<(int)ss.size();i++){
sufprod[i+1]=(sufprod[i]*sumfreewhole(ss[i]))%mod;
}
ll pfs=0;
for (int i=0;i<(int)ss.size();i++){
ll vw = sumfreewhole(ss[i]);
if (i>0){
pfs *= sumfreewhole(ss[i-1]);
pfs%=mod;
}
if (i>0){
pfs+=suffixes(ss[i-1]);
pfs%=mod;
}
// include prefix of this (including the whole) and non-zero before
ans += prefixes(ss[i])*pfs;
ans%=mod;
//cout<<ans<<endl;
//cout<<vw<<" "<<pfs<<" "<<prefixes(ss[i])<<endl;
//cout<<"aa "<<prefixes(ss[i])*pfs<<endl;
// inside this
ans += solvein2(ss[i]);
ans%=mod;
//cout<<ans<<endl;
//cout<<"bb "<<solvein2(ss[i])<<endl;
}
return ans;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
tps[0]=1;
for (ll i=1;i<=1000000;i++){
tps[i]=tps[i-1]*10ll;
tps[i]%=mod;
}
string s;
cin>>s;
if (s.back()=='*' || s.back()=='+'){
s.pop_back();
}
if (s.size()==0){
cout<<0<<endl;
return 0;
}
if (s[0]=='*' || s[0]=='+'){
s=s.substr(1);
}
if (s.size()==0){
cout<<0<<endl;
return 0;
}
int ps=0;
int n=(int)s.size();
for (int i=0;i<n;i++){
if (s[i]=='+' || s[i]=='*'){
ps++;
}
}
ll ans=0;
string cur;
int sps=0;
int spp=0;
for (int i=0;i<=n;i++){
if (i==n || s[i]=='+'){
assert(cur.size()>0);
ll wv=sumfreewhole(cur);
ll pc=i-(int)cur.size()+1-sps;
ll sc=n-i-ps+sps+spp+1;
ll sfs=suffixes(cur);
ll pfs=prefixes(cur);
//cout<<cur<<endl;
//cout<<wv<<" "<<pc<<" "<<sc<<endl;
//cout<<sfs<<" "<<pfs<<endl;
// choose this and non-zero stuff before and after
ans+=(((pc-1ll+mod)*(sc-1ll+mod))%mod)*wv;
ans%=mod;
//cout<<"a "<<ans<<endl;
// choose suffix of this and non-zero stuff from after
ans+=(sfs*(sc-1ll+mod))%mod;
ans%=mod;
//cout<<"b "<<ans<<endl;
// choose prefix of this and non-zero stuff before
ans+=(pfs*(pc-1ll+mod))%mod;
ans%=mod;
//cout<<"c "<<ans<<endl;
// choose inside this, including the full thing
ans+=solvein(cur);
ans%=mod;
//cout<<"d "<<solvein(cur)<<endl;
sps++;
sps+=spp;
spp=0;
cur="";
} else {
cur+=s[i];
if (s[i]=='*'){
spp++;
}
}
}
cout<<ans<<endl;
}