#include <cstdio>#include <vector>#include <algorithm>#include <cassert>#include <cstdlib>#include <cstring>#include <iostream>#define int long long using namespace std;inline int gi(){ char tmp=getchar();int ans=0; while(!isdigit(tmp)) tmp=getchar(); while(isdigit(tmp)){ ans = ans * 10 + tmp - '0'; tmp = getchar(); } return ans;}const int N = 1e6;const int Mod = 1e9 + 7 ;struct Edg{ int v,nxt;}Edge[N<<1];int Head[N],cnt;inline void Add(int u,int v){ Edge[++cnt].v=v;Edge[cnt].nxt=Head[u];Head[u]=cnt;}int F[N],G[N];vector<int> V[N],Pre[N],Suf[N];void Dfs1(int pos,int fa){ F[pos]=1; for(int i = Head[pos];i;i=Edge[i].nxt){ int arr = Edge[i].v; if(arr == fa) continue; Dfs1(arr,pos); Pre[pos].push_back(F[arr]+1); Suf[pos].push_back(F[arr]+1); V[pos].push_back(arr); F[pos] *= (F[arr] + 1); F[pos] %= Mod; } if(V[pos].size() == 0) return ; for(int i=0;i<V[pos].size();++i){ int arr = V[pos][i]; Pre[pos][i] = F[arr] + 1; if(i!=0) Pre[pos][i] = Pre[pos][i-1] * Pre[pos][i] % Mod; } for(int i=V[pos].size()-1;~i;--i){ int arr = V[pos][i]; Suf[pos][i] = F[arr] + 1; if(i != V[pos].size()-1) Suf[pos][i] = Suf[pos][i+1] * Suf[pos][i] % Mod; }}void Dfs2(int pos,int fa){ if(V[pos].size() == 0) return ; for(int i = 0;i < V[pos].size();++i){ int arr = V[pos][i]; int q,p; if(i==0) p = 1; else p = Pre[pos][i-1]; if(i == V[pos].size()-1) q = 1; else q = Suf[pos][i+1]; G[arr] = (G[pos] * q%Mod * p%Mod +1) %Mod; Dfs2(arr,pos); }}signed main(){#ifdef TSUKIAKIOI freopen("data.in","r",stdin);#endif int n=gi(); for(int i=2;i<=n;++i){ int v = gi(); Add(v,i);Add(i,v); } Dfs1(1,0); G[1]=1; Dfs2(1,0); for(int i=1;i<=n;++i) printf("%lld ",F[i]*G[i]%Mod); return 0;}