#include <bits/stdc++.h>   #pragma GCC optimize( Ofast,no-stack-protector )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx )   #pragma GCC target( avx,tune=native )   using namespace std;   class CodeHash {    public:     string precise(double number, int prec) {       stringstream ss;       ss << fixed << setprecision(prec) << number;       return ss.str();     }   };   class ScanReader {    private:     FILE *stream;     char buffer[1 << 11];     bool is_digit[1 << 8];     int index, total;     int scan() {       if (index >= total) {         index = 0;         total = fread(buffer, 1, 1 << 11, stream);         if (total <= 0) return -1;       }       return buffer[index++];     }     bool iswhitespace(int n) {       if (n ==     || n ==   n  || n ==   t  || n ==   r  || n == -1) return true;       return false;     }       public:     ScanReader(FILE *stream) {       this->stream = stream;       index = total = 0;       for (int i = 0; i < 1 << 8; i++) is_digit[i] = isdigit(i);     }     int scanInt() {       int integer = 0, temp = scan();       while (iswhitespace(temp)) temp = scan();       int neg = 1;       if (temp ==  - ) neg *= -1, temp = scan();       while (!iswhitespace(temp))         if (is_digit[temp]) integer *= 10, integer += (temp -  0 ), temp = scan();       return neg * integer;     }     long long scanLong() {       long long integer = 0;       int temp = scan();       while (iswhitespace(temp)) temp = scan();       int neg = 1;       if (temp ==  - ) neg *= -1, temp = scan();       while (!iswhitespace(temp))         if (is_digit[temp]) integer *= 10, integer += (temp -  0 ), temp = scan();       return neg * integer;     }     string scanString() {       string ss =   ;       int temp = scan();       while (iswhitespace(temp)) temp = scan();       while (!iswhitespace(temp)) ss += temp, temp = scan();       return ss;     }     double scanDouble() {       int c = scan();       while (iswhitespace(c)) c = scan();       int sgn = 1;       if (c ==  - ) sgn = -1, c = scan();       double res = 0;       while (!iswhitespace(c) && c !=  . ) {         if (c ==  e  || c ==  E ) return res * pow(10, scanInt());         res *= 10;         res += c -  0 ;         c = scan();       }       if (c ==  . ) {         c = scan();         double m = 1;         while (!iswhitespace(c)) {           if (c ==  e  || c ==  E ) {             return res * pow(10, scanInt());           }           m /= 10;           res += (c -  0 ) * m;           c = scan();         }       }       return res * sgn;     }   };   class PrintWriter {    private:     FILE *stream;     static const int BUFFER_SIZE = (1 << 11) - 1;     static const int MAX_OUT_SIZE = 23;     int size;     char buffer[BUFFER_SIZE];     void write(long long v) {       if (v < 0) buffer[size++] =  - , v *= -1;       if (v < 10)         buffer[size++] = v + 48;       else {         write(v / 10);         buffer[size++] = v % 10 + 48;       }     }       public:     PrintWriter(FILE *stream) {       this->size = 0;       this->stream = stream;     }     void close() {       if (size) fwrite(buffer, 1, size, stream);     }     void println(long long s) {       if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {         fwrite(buffer, 1, size, stream);         size = 0;       }       write(s);       buffer[size++] =   n ;     }     void print(long long s) {       if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {         fwrite(buffer, 1, size, stream);         size = 0;       }       write(s);       buffer[size++] =    ;     }     void println(string s) {       if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {         fwrite(buffer, 1, size, stream);         size = 0;       }       for (int i = 0; i < s.length(); i++) {         buffer[size++] = s[i];         if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {           fwrite(buffer, 1, size, stream);           size = 0;         }       }       buffer[size++] =   n ;     }     void print(string s) {       if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {         fwrite(buffer, 1, size, stream);         size = 0;       }       for (int i = 0; i < s.length(); i++) {         buffer[size++] = s[i];         if ((size ^ BUFFER_SIZE) < MAX_OUT_SIZE) {           fwrite(buffer, 1, size, stream);           size = 0;         }       }       buffer[size++] =    ;     }   };   FILE *fi = stdin;   FILE *fo = stdout;   ScanReader *in = new ScanReader(fi);   PrintWriter *out = new PrintWriter(fo);   CodeHash *ch = new CodeHash();   int main() {     multiset<int> mt;     multiset<int> mt1;     multiset<int> mt2;     int n = in->scanInt();     long long ans = 1;     long long mod = 1000000007;     while (n--) {       string s = in->scanString();       int tt = in->scanInt();       if (s.length() == 3) {         if (!mt.empty() && *mt.begin() < tt)           mt.insert(tt);         else if (!mt1.empty() && *mt1.rbegin() > tt)           mt1.insert(tt);         else           mt2.insert(tt);       } else {         if ((!mt.empty() && *mt.begin() < tt) ||             (!mt1.empty() && *mt1.rbegin() > tt)) {           out->println(0);           out->close();           return 0;         }         if ((!mt.empty() && *mt.begin() == tt)) mt.erase(mt.begin());         if ((!mt1.empty() && *mt1.rbegin() == tt)) mt1.erase(--mt1.end());         while (!mt2.empty()) {           int tl = *mt2.begin();           mt2.erase(mt2.begin());           if (tl < tt) {             mt1.insert(tl);           } else if (tl > tt) {             mt.insert(tl);           } else {             ans = (ans * 2) % mod;           }         }       }     }     out->println((ans * (mt2.size() + 1)) % mod);     out->close();     return 0;   }