//
// fragment_main
//
#include <metal_stdlib>

using namespace metal;
int2 tint_clamp(int2 e, int2 low, int2 high) {
  return min(max(e, low), high);
}

int tint_clamp_1(int e, int low, int high) {
  return min(max(e, low), high);
}

uint4 textureLoad_127e12(texture2d_array<uint, access::read> tint_symbol) {
  uint4 res = tint_symbol.read(uint2(tint_clamp(int2(1), int2(0), int2((uint2(tint_symbol.get_width(), tint_symbol.get_height()) - uint2(1u))))), tint_clamp_1(1, 0, int((tint_symbol.get_array_size() - 1u))));
  return res;
}

struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};

fragment void fragment_main(device uint4* tint_symbol_1 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_127e12(tint_symbol_2);
  return;
}

//
// compute_main
//
#include <metal_stdlib>

using namespace metal;
int2 tint_clamp(int2 e, int2 low, int2 high) {
  return min(max(e, low), high);
}

int tint_clamp_1(int e, int low, int high) {
  return min(max(e, low), high);
}

uint4 textureLoad_127e12(texture2d_array<uint, access::read> tint_symbol) {
  uint4 res = tint_symbol.read(uint2(tint_clamp(int2(1), int2(0), int2((uint2(tint_symbol.get_width(), tint_symbol.get_height()) - uint2(1u))))), tint_clamp_1(1, 0, int((tint_symbol.get_array_size() - 1u))));
  return res;
}

struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};

kernel void compute_main(device uint4* tint_symbol_1 [[buffer(0)]], texture2d_array<uint, access::read> tint_symbol_2 [[texture(0)]]) {
  *(tint_symbol_1) = textureLoad_127e12(tint_symbol_2);
  return;
}

//
// vertex_main
//
#include <metal_stdlib>

using namespace metal;
int2 tint_clamp(int2 e, int2 low, int2 high) {
  return min(max(e, low), high);
}

int tint_clamp_1(int e, int low, int high) {
  return min(max(e, low), high);
}

uint4 textureLoad_127e12(texture2d_array<uint, access::read> tint_symbol_1) {
  uint4 res = tint_symbol_1.read(uint2(tint_clamp(int2(1), int2(0), int2((uint2(tint_symbol_1.get_width(), tint_symbol_1.get_height()) - uint2(1u))))), tint_clamp_1(1, 0, int((tint_symbol_1.get_array_size() - 1u))));
  return res;
}

struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};

struct tint_symbol {
  uint4 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner(texture2d_array<uint, access::read> tint_symbol_2) {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = textureLoad_127e12(tint_symbol_2);
  return out;
}

vertex tint_symbol vertex_main(texture2d_array<uint, access::read> tint_symbol_3 [[texture(0)]]) {
  VertexOutput const inner_result = vertex_main_inner(tint_symbol_3);
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

