public List<List<Integer>> subsets(int[] S) {
		
		if(S==null) return new ArrayList<List<Integer>>();
		int len = S.length;
		int total = 1<<len;
		Arrays.sort(S);
		List<List<Integer>> rt =  new ArrayList<List<Integer>>(total);
		HashMap<Integer, myvalue> hm =  new HashMap<Integer, Solution.myvalue>();
		for(int i=0;i<total;i++)
		{
			List<Integer> temp =  new ArrayList<Integer>();
			int t =i;
			int j=0;
			int ones =0;
			while(j<len)
			{
				if((t&1)>0)
				{
					temp.add(S[j]); ones++;
				}
				j++;
				t = t>>1;
			}
			myvalue m = hm.get(ones);
			if(m==null)
			{
				m = new myvalue();
				m.arrays.add(temp);
				hm.put(ones, m);
			}
			else hm.get(ones).arrays.add(temp);
		}
		for(int i=0;i<=len;i++)
		{
			for(List<Integer> l: hm.get(i).arrays)
				rt.add(l);
		}
		return rt;
		
	}