## Symbolic Representation

The problem can be represented symbolically as follows:

Let's denote:
- $x_1$ as the number of social media adverts
- $x_2$ as the number of magazine covers

The objective is to maximize exposure, which is given by $100000x_1 + 54000x_2$.

The constraints are:
- Budget constraint: $3000x_1 + 6000x_2 \leq 500000$
- Social media posts constraint: $10 \leq x_1 \leq 20$
- Magazine covers constraint: $x_2 \geq 24$
- Non-negativity constraint: $x_1, x_2 \geq 0$ and $x_1, x_2$ are integers.

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'social media adverts'), ('x2', 'magazine covers')],
    'objective_function': '100000*x1 + 54000*x2',
    'constraints': [
        '3000*x1 + 6000*x2 <= 500000',
        '10 <= x1 <= 20',
        'x2 >= 24',
        'x1, x2 >= 0 and x1, x2 are integers'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

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

# Define variables
x1 = model.addVar(lb=10, ub=20, vtype=gp.GRB.INTEGER, name="social_media_adverts")
x2 = model.addVar(lb=24, vtype=gp.GRB.INTEGER, name="magazine_covers")

# Objective function: maximize exposure
model.setObjective(100000*x1 + 54000*x2, gp.GRB.MAXIMIZE)

# Budget constraint
model.addConstr(3000*x1 + 6000*x2 <= 500000, name="budget_constraint")

# Solve the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Number of social media adverts: {x1.varValue}")
    print(f"Number of magazine covers: {x2.varValue}")
    print(f"Maximum exposure: {model.objVal}")
else:
    print("The model is infeasible or unbounded.")
```