#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 tint_symbol {
  float4 value [[position]];
};

float4 vtx_main_inner(uint VertexIndex) {
  tint_array<float2, 3> const tint_symbol_2 = tint_array<float2, 3>{float2(0.0f, 0.5f), float2(-0.5f), float2(0.5f, -0.5f)};
  return float4(tint_symbol_2[VertexIndex], 0.0f, 1.0f);
}

vertex tint_symbol vtx_main(uint VertexIndex [[vertex_id]]) {
  float4 const inner_result = vtx_main_inner(VertexIndex);
  tint_symbol wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

struct tint_symbol_1 {
  float4 value [[color(0)]];
};

float4 frag_main_inner() {
  return float4(1.0f, 0.0f, 0.0f, 1.0f);
}

fragment tint_symbol_1 frag_main() {
  float4 const inner_result_1 = frag_main_inner();
  tint_symbol_1 wrapper_result_1 = {};
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}

