#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 {
  float scalar_f32;
  int scalar_i32;
  uint scalar_u32;
  float2 vec2_f32;
  int2 vec2_i32;
  uint2 vec2_u32;
  float3 vec3_f32;
  int3 vec3_i32;
  uint3 vec3_u32;
  float4 vec4_f32;
  int4 vec4_i32;
  uint4 vec4_u32;
  float2x2 mat2x2_f32;
  float2x3 mat2x3_f32;
  float2x4 mat2x4_f32;
  float3x2 mat3x2_f32;
  float3x3 mat3x3_f32;
  float3x4 mat3x4_f32;
  float4x2 mat4x2_f32;
  float4x3 mat4x3_f32;
  float4x4 mat4x4_f32;
  tint_array<float3, 2> arr2_vec3_f32;
};
struct S {
  tint_array<Inner, 1> arr;
};
struct tint_module_vars_struct {
  const device S* sb;
  device int* s;
};

int tint_f32_to_i32(float value) {
  return select(2147483647, select((-2147483647 - 1), int(value), (value >= -2147483648.0f)), (value <= 2147483520.0f));
}
void tint_symbol_inner(uint idx, tint_module_vars_struct tint_module_vars) {
  float const scalar_f32 = (*tint_module_vars.sb).arr[idx].scalar_f32;
  int const scalar_i32 = (*tint_module_vars.sb).arr[idx].scalar_i32;
  uint const scalar_u32 = (*tint_module_vars.sb).arr[idx].scalar_u32;
  float2 const vec2_f32 = (*tint_module_vars.sb).arr[idx].vec2_f32;
  int2 const vec2_i32 = (*tint_module_vars.sb).arr[idx].vec2_i32;
  uint2 const vec2_u32 = (*tint_module_vars.sb).arr[idx].vec2_u32;
  float3 const vec3_f32 = (*tint_module_vars.sb).arr[idx].vec3_f32;
  int3 const vec3_i32 = (*tint_module_vars.sb).arr[idx].vec3_i32;
  uint3 const vec3_u32 = (*tint_module_vars.sb).arr[idx].vec3_u32;
  float4 const vec4_f32 = (*tint_module_vars.sb).arr[idx].vec4_f32;
  int4 const vec4_i32 = (*tint_module_vars.sb).arr[idx].vec4_i32;
  uint4 const vec4_u32 = (*tint_module_vars.sb).arr[idx].vec4_u32;
  float2x2 const mat2x2_f32 = (*tint_module_vars.sb).arr[idx].mat2x2_f32;
  float2x3 const mat2x3_f32 = (*tint_module_vars.sb).arr[idx].mat2x3_f32;
  float2x4 const mat2x4_f32 = (*tint_module_vars.sb).arr[idx].mat2x4_f32;
  float3x2 const mat3x2_f32 = (*tint_module_vars.sb).arr[idx].mat3x2_f32;
  float3x3 const mat3x3_f32 = (*tint_module_vars.sb).arr[idx].mat3x3_f32;
  float3x4 const mat3x4_f32 = (*tint_module_vars.sb).arr[idx].mat3x4_f32;
  float4x2 const mat4x2_f32 = (*tint_module_vars.sb).arr[idx].mat4x2_f32;
  float4x3 const mat4x3_f32 = (*tint_module_vars.sb).arr[idx].mat4x3_f32;
  float4x4 const mat4x4_f32 = (*tint_module_vars.sb).arr[idx].mat4x4_f32;
  tint_array<float3, 2> const arr2_vec3_f32 = (*tint_module_vars.sb).arr[idx].arr2_vec3_f32;
  int const v = (tint_f32_to_i32(scalar_f32) + scalar_i32);
  int const v_1 = (v + int(scalar_u32));
  int const v_2 = ((v_1 + tint_f32_to_i32(vec2_f32[0u])) + vec2_i32[0u]);
  int const v_3 = (v_2 + int(vec2_u32[0u]));
  int const v_4 = ((v_3 + tint_f32_to_i32(vec3_f32[1u])) + vec3_i32[1u]);
  int const v_5 = (v_4 + int(vec3_u32[1u]));
  int const v_6 = ((v_5 + tint_f32_to_i32(vec4_f32[2u])) + vec4_i32[2u]);
  int const v_7 = (v_6 + int(vec4_u32[2u]));
  int const v_8 = (v_7 + tint_f32_to_i32(mat2x2_f32[0][0u]));
  int const v_9 = (v_8 + tint_f32_to_i32(mat2x3_f32[0][0u]));
  int const v_10 = (v_9 + tint_f32_to_i32(mat2x4_f32[0][0u]));
  int const v_11 = (v_10 + tint_f32_to_i32(mat3x2_f32[0][0u]));
  int const v_12 = (v_11 + tint_f32_to_i32(mat3x3_f32[0][0u]));
  int const v_13 = (v_12 + tint_f32_to_i32(mat3x4_f32[0][0u]));
  int const v_14 = (v_13 + tint_f32_to_i32(mat4x2_f32[0][0u]));
  int const v_15 = (v_14 + tint_f32_to_i32(mat4x3_f32[0][0u]));
  int const v_16 = (v_15 + tint_f32_to_i32(mat4x4_f32[0][0u]));
  (*tint_module_vars.s) = (v_16 + tint_f32_to_i32(arr2_vec3_f32[0][0u]));
}
kernel void tint_symbol(uint idx [[thread_index_in_threadgroup]], const device S* sb [[buffer(1)]], device int* s [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.sb=sb, .s=s};
  tint_symbol_inner(idx, tint_module_vars);
}
