#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdio>
#include <functional>
#include <numeric>
#include <unordered_map>
#include <unordered_set>
using namespace std;
// #define int long long
#define DEBUG(x) cout << '>' << #x << ':' << x << endl;
#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
const int INF = (((1<<30)-1)<<1)+1;
const int nINF = 1<<31;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<char, int> pci;

/////////////////////////////////////////////////////////////////////
const int HALF = 500000004, M = 1e9+7;
int add(int a, int b) {return (a+b)%M;}
int sub(int a, int b) {return (a+M-b)%M;}
int mult(int a, int b) {return ((ll)a*b)%M;}
int fastPowMod(int base, int power) {
    int res = 1;
    while(power) {
        if(power & 1) res = mult(res, base);
        base = mult(base, base);
        power >>= 1;
    }
    return res;
}
int inv(int x) {return fastPowMod(x, M-2);}
int frac(int a, int b) {return mult(a, inv(b));}


int lo = 0, hi = 1, n, wchoose = 1, bchoose = 1;

vector<int> solve(int b, int w) {
	vector<int> res;
	if(b == 0 || w == 0) {
    	REP(i, n) res.push_back(b == 0 ? 0 : 1);
    	return res;
    }
    if(b == 1) {
    	REP(i, n) {
    		hi = mult(hi, HALF);
    		res.push_back(hi);
    	}
    	return res;
    }
    res.push_back(HALF);
    FOR(i, 0, n-3) {
    	if(i < w) {
    		hi = mult(hi, HALF);
    	} else {
    		int k = i-w;
    		wchoose = mult(wchoose, frac(w+k, 1+k));
    		hi = add(hi, mult(HALF, mult(wchoose, fastPowMod(HALF, i))));
    	}
    	if(i == b-1) {
    		lo = fastPowMod(HALF, i+1);
    	} else if(i >= b) {
    		int k = i-b;
    		bchoose = mult(bchoose, frac(b+k, 1+k));
    		lo = add(lo, mult(HALF, mult(bchoose, fastPowMod(HALF, i))));
    	}
    	if(i < w-1) {
	    	res.push_back(mult(HALF, sub(1, lo)));
    	} else {
    		int left = sub(1, add(lo, hi));
    		res.push_back(add(mult(HALF, left), hi));
    	}
    }
    int left = sub(1, add(lo, hi));
    lo = add(lo, mult(HALF, left));
    hi = add(hi, mult(HALF, left));
    res.push_back(hi);
    return res;
}

signed main() {
    ios::sync_with_stdio(false);
    //cout << fixed << setprecision(7);
    int b, w;
    cin >> b >> w;
    n = b+w;
    vector<int> ans;
    if(w < b) ans = solve(b, w);
    else {
    	ans = solve(w, b);
    	for(int& x : ans) x = sub(1, x);
    }
    for(int x : ans) cout << x << endl;
    

    return 0;
}

// Easy things to check:
// - LONG LONGS (WA)
// - const int N is correct (WA, RTE)
// - .size()-k underflow (WA, RTE, TLE)
// - small n edge cases (WA)

// Rare mistakes made in the past:
// - division by 0 (WA)
// - integer division (WA)
// - setprecision (WA)
// - INF not big enough using ll (WA)
// - setting max to 0 instead of -INF/min to 0 instead of INF (WA)
// - outputting debug (WA)
// - allocating too much memory (locRTE, MLE)
// - stack size (locRTE)
// - round announcements (WA)
// - multiset::erase (WA)



Measured memory_bytes: 3060