#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_private_vars_struct {
  uint3 gl_GlobalInvocationID;
};

struct ResultMatrix {
  /* 0x0000 */ tint_array<float, 1> numbers;
};

struct FirstMatrix {
  tint_array<float, 1> numbers;
};

struct SecondMatrix {
  tint_array<float, 1> numbers;
};

struct Uniforms {
  float tint_symbol;
  int sizeA;
  int sizeB;
};

float binaryOperation_f1_f1_(thread float* const a, thread float* const b) {
  float x_26 = 0.0f;
  float const x_13 = *(b);
  if ((x_13 == 0.0f)) {
    return 1.0f;
  }
  float const x_21 = *(b);
  if (!((rint((x_21 - (2.0f * floor((x_21 / 2.0f))))) == 1.0f))) {
    float const x_29 = *(a);
    float const x_31 = *(b);
    x_26 = pow(fabs(x_29), x_31);
  } else {
    float const x_34 = *(a);
    float const x_36 = *(a);
    float const x_38 = *(b);
    x_26 = (sign(x_34) * pow(fabs(x_36), x_38));
  }
  float const x_41 = x_26;
  return x_41;
}

void main_1(thread tint_private_vars_struct* const tint_private_vars, device ResultMatrix* const tint_symbol_2) {
  int index = 0;
  int a_1 = 0;
  float param = 0.0f;
  float param_1 = 0.0f;
  uint const x_54 = (*(tint_private_vars)).gl_GlobalInvocationID[0];
  index = as_type<int>(x_54);
  a_1 = -10;
  int const x_63 = index;
  param = -4.0f;
  param_1 = -3.0f;
  float const x_68 = binaryOperation_f1_f1_(&(param), &(param_1));
  (*(tint_symbol_2)).numbers[x_63] = x_68;
  return;
}

void tint_symbol_1_inner(uint3 gl_GlobalInvocationID_param, thread tint_private_vars_struct* const tint_private_vars, device ResultMatrix* const tint_symbol_3) {
  (*(tint_private_vars)).gl_GlobalInvocationID = gl_GlobalInvocationID_param;
  main_1(tint_private_vars, tint_symbol_3);
}

kernel void tint_symbol_1(device ResultMatrix* tint_symbol_4 [[buffer(0)]], uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  tint_symbol_1_inner(gl_GlobalInvocationID_param, &(tint_private_vars), tint_symbol_4);
  return;
}

