 So, that gets us halfway there. The other quantity we have to be able to calculate is our weight gradient. Our weight gradient is especially important because it is what tells us what direction and how much to adjust each of the weights, each of the values in our kernel to get a better result, to decrease the loss, to climb down the loss gradient. So again, by the chain rule, the weight gradient is equal to the output gradient times the partial derivative of the output with respect to each of the weights. And we can expand that as we did before to be explicit about treating each individual weight separately. And we can expand it to the next step to be explicit about treating each individual output separately. And then at this point, we can do the same process we did before. We can take the full expression for our convolution and we can expand it out. This is the exact same equation we had before. And this time, we can take the partial derivative of each of the weights with respect to each of the outputs, y sub j. And when we do this, we see symmetrically the results then become various values of the input, x sub j minus p, x sub j minus p plus 1. And we can do the same trick where we rearrange those and condense those. And when we do, we get a similar representation. The partial derivative of our outputs with respect to each of our weights is equal to the input at index j minus k. And we can substitute that in to our expanded chain rule. And then we get our weight gradient for each weight is equal to the sum of our output gradient for each output element times this input values, x sub j minus k. And for completion and symmetry, again we can take that x sub k minus j and flip it about the zero index. So now we can represent it as x sub k minus j. Everything else stays the same. But now it's the summation of our output gradient times this flipped array and it is in exactly the right form to be represented again as a convolution. So it becomes the weight gradient is the output gradient convolved with the input values first reversed left to right. This expression I think is probably easier to implement in code with the explicit indexes that just suggest an iteration and a summation. But for mathematical concision, it's tough to beat the convolution operator.