To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of surfboards and skateboards to be produced, formulating the objective function that represents the total profit, and establishing the constraints based on the availability of wood and paint.

Let's denote:
- \(x_1\) as the number of surfboards to be made,
- \(x_2\) as the number of skateboards to be made.

The objective function aims to maximize the total profit. Given that each surfboard yields a profit of $70 and each skateboard yields a profit of $45, the objective function can be written as:
\[ \text{Maximize: } 70x_1 + 45x_2 \]

The constraints are based on the availability of resources (wood and paint). Each surfboard requires 5 units of wood and 3 units of paint, while each skateboard requires 4 units of wood and 2 units of paint. With 700 units of wood and 320 units of paint available, the constraints can be formulated as follows:
1. Wood constraint: \(5x_1 + 4x_2 \leq 700\)
2. Paint constraint: \(3x_1 + 2x_2 \leq 320\)

Additionally, we have non-negativity constraints since the number of surfboards and skateboards cannot be negative:
- \(x_1 \geq 0\)
- \(x_2 \geq 0\)

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of surfboards'), ('x2', 'number of skateboards')],
    'objective_function': '70*x1 + 45*x2',
    'constraints': ['5*x1 + 4*x2 <= 700', '3*x1 + 2*x2 <= 320', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Surfboard_Skateboard_Optimization")

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="surfboards")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="skateboards")

# Set the objective function
m.setObjective(70*x1 + 45*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*x1 + 4*x2 <= 700, "wood_constraint")
m.addConstr(3*x1 + 2*x2 <= 320, "paint_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of surfboards: {x1.x}")
    print(f"Number of skateboards: {x2.x}")
    print(f"Maximum profit: ${70*x1.x + 45*x2.x:.2f}")
else:
    print("No optimal solution found.")
```