```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by John"),
    ("x2", "hours worked by Hank"),
    ("x3", "hours worked by Dale"),
    ("x4", "hours worked by Ringo"),
    ("x5", "hours worked by Bobby")
  ],
  "objective_function": "1.47 * x0 + 6.6 * x1 + 9.52 * x2 + 7.99 * x3 + 5.56 * x4 + 8.87 * x5",
  "constraints": [
    "23.35 * x0 + 0.72 * x1 + 3.99 * x2 + 10.49 * x3 + 7.84 * x4 + 9.36 * x5 <= 477",
    "3.99 * x2 + 7.84 * x4 >= 73",
    "23.35 * x0 + 7.84 * x4 >= 50",
    "3.99 * x2 + 10.49 * x3 >= 63",
    "23.35 * x0 + 9.36 * x5 >= 49",
    "23.35 * x0 + 0.72 * x1 + 3.99 * x2 >= 61",
    "0.72 * x1 + 3.99 * x2 + 9.36 * x5 >= 61",
    "23.35 * x0 + 3.99 * x2 + 7.84 * x4 >= 61",
    "23.35 * x0 + 0.72 * x1 + 10.49 * x3 >= 61",
    "0.72 * x1 + 10.49 * x3 + 7.84 * x4 >= 61",
    "23.35 * x0 + 10.49 * x3 + 9.36 * x5 >= 61",
    "23.35 * x0 + 3.99 * x2 + 10.49 * x3 >= 61",
    "0.72 * x1 + 3.99 * x2 + 7.84 * x4 >= 61",

    "0.72 * x1 + 9.36 * x5 <= 414",
    "3.99 * x2 + 7.84 * x4 <= 260",
    "23.35 * x0 + 0.72 * x1 <= 180",
    "3.99 * x2 + 10.49 * x3 <= 141",
    "0.72 * x1 + 10.49 * x3 <= 436",
    "7.84 * x4 + 9.36 * x5 <= 120",
    "10.49 * x3 + 7.84 * x4 <= 428",
    "23.35 * x0 + 3.99 * x2 <= 109",
    "0.72 * x1 + 3.99 * x2 + 9.36 * x5 <= 214",
    "23.35 * x0 + 0.72 * x1 + 7.84 * x4 <= 211",
    "0.72 * x1 + 10.49 * x3 + 9.36 * x5 <= 437",
    "0.72 * x1 + 7.84 * x4 + 9.36 * x5 <= 143",
    "23.35 * x0 + 3.99 * x2 + 7.84 * x4 <= 259",
    "23.35 * x0 + 3.99 * x2 + 10.49 * x3 <= 427",
    "0.72 * x1 + 3.99 * x2 + 10.49 * x3 <= 155",
    "23.35 * x0 + 0.72 * x1 + 3.99 * x2 <= 123",
    "0.72 * x1 + 10.49 * x3 + 7.84 * x4 <= 187",
    "10.49 * x3 + 7.84 * x4 + 9.36 * x5 <= 313",
    "23.35 * x0 + 0.72 * x1 + 3.99 * x2 + 10.49 * x3 + 7.84 * x4 + 9.36 * x5 <= 313"

  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("maximize_hours")

# Create variables
bill = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="bill")
john = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="john")
hank = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="hank")
dale = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="dale")
ringo = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="ringo")
bobby = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="bobby")


# Set objective
m.setObjective(1.47 * bill + 6.6 * john + 9.52 * hank + 7.99 * dale + 5.56 * ringo + 8.87 * bobby, gp.GRB.MAXIMIZE)

# Add constraints

m.addConstr(23.35 * bill + 0.72 * john + 3.99 * hank + 10.49 * dale + 7.84 * ringo + 9.36 * bobby <= 477)
m.addConstr(3.99 * hank + 7.84 * ringo >= 73)
m.addConstr(23.35 * bill + 7.84 * ringo >= 50)
m.addConstr(3.99 * hank + 10.49 * dale >= 63)
m.addConstr(23.35 * bill + 9.36 * bobby >= 49)
m.addConstr(23.35 * bill + 0.72 * john + 3.99 * hank >= 61)
m.addConstr(0.72 * john + 3.99 * hank + 9.36 * bobby >= 61)
m.addConstr(23.35 * bill + 3.99 * hank + 7.84 * ringo >= 61)
m.addConstr(23.35 * bill + 0.72 * john + 10.49 * dale >= 61)
m.addConstr(0.72 * john + 10.49 * dale + 7.84 * ringo >= 61)
m.addConstr(23.35 * bill + 10.49 * dale + 9.36 * bobby >= 61)
m.addConstr(23.35 * bill + 3.99 * hank + 10.49 * dale >= 61)
m.addConstr(0.72 * john + 3.99 * hank + 7.84 * ringo >= 61)


m.addConstr(0.72 * john + 9.36 * bobby <= 414)
m.addConstr(3.99 * hank + 7.84 * ringo <= 260)
m.addConstr(23.35 * bill + 0.72 * john <= 180)
m.addConstr(3.99 * hank + 10.49 * dale <= 141)
m.addConstr(0.72 * john + 10.49 * dale <= 436)
m.addConstr(7.84 * ringo + 9.36 * bobby <= 120)
m.addConstr(10.49 * dale + 7.84 * ringo <= 428)
m.addConstr(23.35 * bill + 3.99 * hank <= 109)
m.addConstr(0.72 * john + 3.99 * hank + 9.36 * bobby <= 214)
m.addConstr(23.35 * bill + 0.72 * john + 7.84 * ringo <= 211)
m.addConstr(0.72 * john + 10.49 * dale + 9.36 * bobby <= 437)
m.addConstr(0.72 * john + 7.84 * ringo + 9.36 * bobby <= 143)
m.addConstr(23.35 * bill + 3.99 * hank + 7.84 * ringo <= 259)
m.addConstr(23.35 * bill + 3.99 * hank + 10.49 * dale <= 427)
m.addConstr(0.72 * john + 3.99 * hank + 10.49 * dale <= 155)
m.addConstr(23.35 * bill + 0.72 * john + 3.99 * hank <= 123)
m.addConstr(0.72 * john + 10.49 * dale + 7.84 * ringo <= 187)
m.addConstr(10.49 * dale + 7.84 * ringo + 9.36 * bobby <= 313)
m.addConstr(23.35 * bill + 0.72 * john + 3.99 * hank + 10.49 * dale + 7.84 * ringo + 9.36 * bobby <= 313)



# Optimize model
m.optimize()

#print solution
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print("The problem is infeasible.")

```