#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct Inner {
  /* 0x0000 */ int x;
  /* 0x0004 */ tint_array<int8_t, 12> tint_pad;
};

struct S {
  /* 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 */ tint_array<int8_t, 8> tint_pad_1;
  /* 0x0080 */ Inner k;
  /* 0x0090 */ tint_array<Inner, 4> l;
};

kernel void tint_symbol(const constant S* tint_symbol_1 [[buffer(0)]]) {
  int3 const a = int3((*(tint_symbol_1)).a);
  int const b = (*(tint_symbol_1)).b;
  uint3 const c = uint3((*(tint_symbol_1)).c);
  uint const d = (*(tint_symbol_1)).d;
  float3 const e = float3((*(tint_symbol_1)).e);
  float const f = (*(tint_symbol_1)).f;
  int2 const g = (*(tint_symbol_1)).g;
  int2 const h = (*(tint_symbol_1)).h;
  float2x3 const i = (*(tint_symbol_1)).i;
  float3x2 const j = (*(tint_symbol_1)).j;
  Inner const k = (*(tint_symbol_1)).k;
  tint_array<Inner, 4> const l = (*(tint_symbol_1)).l;
  return;
}

