#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

struct tint_array_wrapper {
  /* 0x0000 */ int4 arr[4];
};
struct Inner {
  /* 0x0000 */ packed_int3 a;
  /* 0x000c */ int b;
  /* 0x0010 */ packed_uint3 c;
  /* 0x001c */ uint d;
  /* 0x0020 */ packed_float3 e;
  /* 0x002c */ float f;
  /* 0x0030 */ int2 g;
  /* 0x0038 */ int2 h;
  /* 0x0040 */ float2x3 i;
  /* 0x0060 */ float3x2 j;
  /* 0x0078 */ int8_t tint_pad[8];
  /* 0x0080 */ tint_array_wrapper k;
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ Inner arr[8];
};
struct S {
  /* 0x0000 */ tint_array_wrapper_1 arr;
};

void tint_symbol_inner(uint idx, const constant S* const tint_symbol_1) {
  int3 const a = (*(tint_symbol_1)).arr.arr[idx].a;
  int const b = (*(tint_symbol_1)).arr.arr[idx].b;
  uint3 const c = (*(tint_symbol_1)).arr.arr[idx].c;
  uint const d = (*(tint_symbol_1)).arr.arr[idx].d;
  float3 const e = (*(tint_symbol_1)).arr.arr[idx].e;
  float const f = (*(tint_symbol_1)).arr.arr[idx].f;
  int2 const g = (*(tint_symbol_1)).arr.arr[idx].g;
  int2 const h = (*(tint_symbol_1)).arr.arr[idx].h;
  float2x3 const i = (*(tint_symbol_1)).arr.arr[idx].i;
  float3x2 const j = (*(tint_symbol_1)).arr.arr[idx].j;
  tint_array_wrapper const k = (*(tint_symbol_1)).arr.arr[idx].k;
}

kernel void tint_symbol(const constant S* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
  tint_symbol_inner(idx, tint_symbol_2);
  return;
}

