#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 scalar_i32;
  /* 0x0004 */ float scalar_f32;
  /* 0x0008 */ half scalar_f16;
  /* 0x000a */ tint_array<int8_t, 6> tint_pad;
};

struct S {
  /* 0x0000 */ float scalar_f32;
  /* 0x0004 */ int scalar_i32;
  /* 0x0008 */ uint scalar_u32;
  /* 0x000c */ half scalar_f16;
  /* 0x000e */ tint_array<int8_t, 2> tint_pad_1;
  /* 0x0010 */ float2 vec2_f32;
  /* 0x0018 */ int2 vec2_i32;
  /* 0x0020 */ uint2 vec2_u32;
  /* 0x0028 */ half2 vec2_f16;
  /* 0x002c */ tint_array<int8_t, 4> tint_pad_2;
  /* 0x0030 */ packed_float3 vec3_f32;
  /* 0x003c */ tint_array<int8_t, 4> tint_pad_3;
  /* 0x0040 */ packed_int3 vec3_i32;
  /* 0x004c */ tint_array<int8_t, 4> tint_pad_4;
  /* 0x0050 */ packed_uint3 vec3_u32;
  /* 0x005c */ tint_array<int8_t, 4> tint_pad_5;
  /* 0x0060 */ packed_half3 vec3_f16;
  /* 0x0066 */ tint_array<int8_t, 10> tint_pad_6;
  /* 0x0070 */ float4 vec4_f32;
  /* 0x0080 */ int4 vec4_i32;
  /* 0x0090 */ uint4 vec4_u32;
  /* 0x00a0 */ half4 vec4_f16;
  /* 0x00a8 */ float2x2 mat2x2_f32;
  /* 0x00b8 */ tint_array<int8_t, 8> tint_pad_7;
  /* 0x00c0 */ float2x3 mat2x3_f32;
  /* 0x00e0 */ float2x4 mat2x4_f32;
  /* 0x0100 */ float3x2 mat3x2_f32;
  /* 0x0118 */ tint_array<int8_t, 8> tint_pad_8;
  /* 0x0120 */ float3x3 mat3x3_f32;
  /* 0x0150 */ float3x4 mat3x4_f32;
  /* 0x0180 */ float4x2 mat4x2_f32;
  /* 0x01a0 */ float4x3 mat4x3_f32;
  /* 0x01e0 */ float4x4 mat4x4_f32;
  /* 0x0220 */ half2x2 mat2x2_f16;
  /* 0x0228 */ half2x3 mat2x3_f16;
  /* 0x0238 */ half2x4 mat2x4_f16;
  /* 0x0248 */ half3x2 mat3x2_f16;
  /* 0x0254 */ tint_array<int8_t, 4> tint_pad_9;
  /* 0x0258 */ half3x3 mat3x3_f16;
  /* 0x0270 */ half3x4 mat3x4_f16;
  /* 0x0288 */ half4x2 mat4x2_f16;
  /* 0x0298 */ half4x3 mat4x3_f16;
  /* 0x02b8 */ half4x4 mat4x4_f16;
  /* 0x02d8 */ tint_array<int8_t, 8> tint_pad_10;
  /* 0x02e0 */ tint_array<float3, 2> arr2_vec3_f32;
  /* 0x0300 */ tint_array<half4x2, 2> arr2_mat4x2_f16;
  /* 0x0320 */ Inner struct_inner;
  /* 0x0330 */ tint_array<Inner, 4> array_struct_inner;
};

kernel void tint_symbol(const constant S* tint_symbol_1 [[buffer(0)]]) {
  float const scalar_f32 = (*(tint_symbol_1)).scalar_f32;
  int const scalar_i32 = (*(tint_symbol_1)).scalar_i32;
  uint const scalar_u32 = (*(tint_symbol_1)).scalar_u32;
  half const scalar_f16 = (*(tint_symbol_1)).scalar_f16;
  float2 const vec2_f32 = (*(tint_symbol_1)).vec2_f32;
  int2 const vec2_i32 = (*(tint_symbol_1)).vec2_i32;
  uint2 const vec2_u32 = (*(tint_symbol_1)).vec2_u32;
  half2 const vec2_f16 = (*(tint_symbol_1)).vec2_f16;
  float3 const vec3_f32 = float3((*(tint_symbol_1)).vec3_f32);
  int3 const vec3_i32 = int3((*(tint_symbol_1)).vec3_i32);
  uint3 const vec3_u32 = uint3((*(tint_symbol_1)).vec3_u32);
  half3 const vec3_f16 = half3((*(tint_symbol_1)).vec3_f16);
  float4 const vec4_f32 = (*(tint_symbol_1)).vec4_f32;
  int4 const vec4_i32 = (*(tint_symbol_1)).vec4_i32;
  uint4 const vec4_u32 = (*(tint_symbol_1)).vec4_u32;
  half4 const vec4_f16 = (*(tint_symbol_1)).vec4_f16;
  float2x2 const mat2x2_f32 = (*(tint_symbol_1)).mat2x2_f32;
  float2x3 const mat2x3_f32 = (*(tint_symbol_1)).mat2x3_f32;
  float2x4 const mat2x4_f32 = (*(tint_symbol_1)).mat2x4_f32;
  float3x2 const mat3x2_f32 = (*(tint_symbol_1)).mat3x2_f32;
  float3x3 const mat3x3_f32 = (*(tint_symbol_1)).mat3x3_f32;
  float3x4 const mat3x4_f32 = (*(tint_symbol_1)).mat3x4_f32;
  float4x2 const mat4x2_f32 = (*(tint_symbol_1)).mat4x2_f32;
  float4x3 const mat4x3_f32 = (*(tint_symbol_1)).mat4x3_f32;
  float4x4 const mat4x4_f32 = (*(tint_symbol_1)).mat4x4_f32;
  half2x2 const mat2x2_f16 = (*(tint_symbol_1)).mat2x2_f16;
  half2x3 const mat2x3_f16 = (*(tint_symbol_1)).mat2x3_f16;
  half2x4 const mat2x4_f16 = (*(tint_symbol_1)).mat2x4_f16;
  half3x2 const mat3x2_f16 = (*(tint_symbol_1)).mat3x2_f16;
  half3x3 const mat3x3_f16 = (*(tint_symbol_1)).mat3x3_f16;
  half3x4 const mat3x4_f16 = (*(tint_symbol_1)).mat3x4_f16;
  half4x2 const mat4x2_f16 = (*(tint_symbol_1)).mat4x2_f16;
  half4x3 const mat4x3_f16 = (*(tint_symbol_1)).mat4x3_f16;
  half4x4 const mat4x4_f16 = (*(tint_symbol_1)).mat4x4_f16;
  tint_array<float3, 2> const arr2_vec3_f32 = (*(tint_symbol_1)).arr2_vec3_f32;
  tint_array<half4x2, 2> const arr2_mat4x2_f16 = (*(tint_symbol_1)).arr2_mat4x2_f16;
  Inner const struct_inner = (*(tint_symbol_1)).struct_inner;
  tint_array<Inner, 4> const array_struct_inner = (*(tint_symbol_1)).array_struct_inner;
  return;
}

