// File: j-faria[P]kima/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h
// Function: Eigen::internal::triangular_solve_matrix<double, long, 2, 2, false, 1, 0, 1>::run(long, long, double const*, long, double*, long, long, Eigen::internal::level3_blocking<double, double>&)
EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor,OtherInnerStride>::run(
    Index size, Index otherSize,
    const Scalar* _tri, Index triStride,
    Scalar* _other, Index otherIncr, Index otherStride,
    level3_blocking<Scalar,Scalar>& blocking)
  {
    Index rows = otherSize;
    typedef typename NumTraits<Scalar>::Real RealScalar;

    typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> LhsMapper;
    typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> RhsMapper;
    LhsMapper lhs(_other, otherStride, otherIncr);
    RhsMapper rhs(_tri, triStride);

    typedef gebp_traits<Scalar,Scalar> Traits;
    enum {
      RhsStorageOrder   = TriStorageOrder,
      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
      IsLower = (Mode&Lower) == Lower
    };

    Index kc = blocking.kc();                   // cache block size along the K direction
    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction

    std::size_t sizeA = kc*mc;
    std::size_t sizeB = kc*size;

    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());

    conj_if<Conjugate> conj;
    gebp_kernel<Scalar, Scalar, Index, LhsMapper, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder,false,true> pack_rhs_panel;
    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, ColMajor, false, true> pack_lhs_panel;

    for(Index k2=IsLower ? size : 0;
        IsLower ? k2>0 : k2<size;
        IsLower ? k2-=kc : k2+=kc)
    {
      const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);
      Index actual_k2 = IsLower ? k2-actual_kc : k2 ;

      Index startPanel = IsLower ? 0 : k2+actual_kc;
      Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
      Scalar* geb = blockB+actual_kc*actual_kc;

      if (rs>0) pack_rhs(geb, rhs.getSubMapper(actual_k2,startPanel), actual_kc, rs);

      // triangular packing (we only pack the panels off the diagonal,
      // neglecting the blocks overlapping the diagonal
      {
        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
        {
          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
          Index actual_j2 = actual_k2 + j2;
          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;

          if (panelLength>0)
          pack_rhs_panel(blockB+j2*actual_kc,
                         rhs.getSubMapper(actual_k2+panelOffset, actual_j2),
                         panelLength, actualPanelWidth,
                         actual_kc, panelOffset);
        }
      }

      for(Index i2=0; i2<rows; i2+=mc)
      {
        const Index actual_mc = (std::min)(mc,rows-i2);

        // triangular solver kernel
        {
          // for each small block of the diagonal (=> vertical panels of rhs)
          for (Index j2 = IsLower
                      ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)
                                                                  : Index(SmallPanelWidth)))
                      : 0;
               IsLower ? j2>=0 : j2<actual_kc;
               IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)
          {
            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
            Index absolute_j2 = actual_k2 + j2;
            Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
            Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;

            // GEBP
            if(panelLength>0)
            {
              gebp_kernel(lhs.getSubMapper(i2,absolute_j2),
                          blockA, blockB+j2*actual_kc,
                          actual_mc, panelLength, actualPanelWidth,
                          Scalar(-1),
                          actual_kc, actual_kc, // strides
                          panelOffset, panelOffset); // offsets
            }

            // unblocked triangular solve
            for (Index k=0; k<actualPanelWidth; ++k)
            {
              Index j = IsLower ? absolute_j2+actualPanelWidth-k-1 : absolute_j2+k;

              typename LhsMapper::LinearMapper r = lhs.getLinearMapper(i2,j);
              for (Index k3=0; k3<k; ++k3)
              {
                Scalar b = conj(rhs(IsLower ? j+1+k3 : absolute_j2+k3,j));
                typename LhsMapper::LinearMapper a = lhs.getLinearMapper(i2,IsLower ? j+1+k3 : absolute_j2+k3);
                for (Index i=0; i<actual_mc; ++i)
                  r(i) -= a(i) * b;
              }
              if((Mode & UnitDiag)==0)
              {
                Scalar inv_rjj = RealScalar(1)/conj(rhs(j,j));
                for (Index i=0; i<actual_mc; ++i)
                  r(i) *= inv_rjj;
              }
            }

            // pack the just computed part of lhs to A
            pack_lhs_panel(blockA, lhs.getSubMapper(i2,absolute_j2),
                           actualPanelWidth, actual_mc,
                           actual_kc, j2);
          }
        }

        if (rs>0)
          gebp_kernel(lhs.getSubMapper(i2, startPanel), blockA, geb,
                      actual_mc, actual_kc, rs, Scalar(-1),
                      -1, -1, 0, 0);
      }
    }
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x6b0, %rsp            # imm = 0x6B0
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x380(%rbp)
movq %rsi, -0x388(%rbp)
movq %rdx, -0x390(%rbp)
movq %rcx, -0x398(%rbp)
movq %r8, -0x3a0(%rbp)
movq %r9, -0x3a8(%rbp)
movq -0x388(%rbp), %rax
movq %rax, -0x3b0(%rbp)
movq -0x3a0(%rbp), %rdx
movq 0x10(%rbp), %rcx
movq -0x3a8(%rbp), %rax
leaq -0x3c0(%rbp), %rsi
movq %rsi, -0x2e8(%rbp)
movq %rdx, -0x2f0(%rbp)
movq %rcx, -0x2f8(%rbp)
movq %rax, -0x300(%rbp)
movq -0x2e8(%rbp), %rax
movq -0x2f0(%rbp), %rcx
movq %rcx, (%rax)
movq -0x2f8(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x300(%rbp)
je 0x3fd95
leaq 0x7aec6(%rip), %rdi     # 0xbac43
leaq 0x7aec7(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7c924(%rip), %rcx     # 0xbc6b4
callq 0x6340
movq -0x390(%rbp), %rcx
movq -0x398(%rbp), %rax
leaq -0x3d0(%rbp), %rdx
movq %rdx, -0x358(%rbp)
movq %rcx, -0x360(%rbp)
movq %rax, -0x368(%rbp)
movq -0x358(%rbp), %rdx
movq -0x360(%rbp), %rcx
movq -0x368(%rbp), %rax
movq %rdx, -0x308(%rbp)
movq %rcx, -0x310(%rbp)
movq %rax, -0x318(%rbp)
movq $0x1, -0x320(%rbp)
movq -0x308(%rbp), %rax
movq -0x310(%rbp), %rcx
movq %rcx, (%rax)
movq -0x318(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x320(%rbp)
je 0x3fe39
leaq 0x7ae22(%rip), %rdi     # 0xbac43
leaq 0x7ae23(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7aef4(%rip), %rcx     # 0xbad28
callq 0x6340
movq 0x18(%rbp), %rdi
callq 0x42550
movq %rax, -0x3d8(%rbp)
movq 0x18(%rbp), %rdi
callq 0x42570
movq %rax, -0x3e8(%rbp)
leaq -0x3b0(%rbp), %rdi
leaq -0x3e8(%rbp), %rsi
callq 0x7cf0
movq (%rax), %rax
movq %rax, -0x3e0(%rbp)
movq -0x3d8(%rbp), %rax
imulq -0x3e0(%rbp), %rax
movq %rax, -0x3f0(%rbp)
movq -0x3d8(%rbp), %rax
imulq -0x380(%rbp), %rax
movq %rax, -0x3f8(%rbp)
movq -0x3f0(%rbp), %rax
movq %rax, -0x370(%rbp)
movabsq $0x1fffffffffffffff, %rax # imm = 0x1FFFFFFFFFFFFFFF
cmpq %rax, -0x370(%rbp)
jbe 0x3fec8
callq 0x2f5b0
movq 0x18(%rbp), %rdi
callq 0x42590
cmpq $0x0, %rax
je 0x3fee9
movq 0x18(%rbp), %rdi
callq 0x42590
movq %rax, -0x5b0(%rbp)
jmp 0x3ff52
movq -0x3f0(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
ja 0x3ff2d
movq -0x3f0(%rbp), %rax
leaq 0x1e(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
addq $0x10, %rax
subq $0x1, %rax
andq $-0x10, %rax
movq %rax, -0x5b8(%rbp)
jmp 0x3ff44
movq -0x3f0(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2f650
movq %rax, -0x5b8(%rbp)
movq -0x5b8(%rbp), %rax
movq %rax, -0x5b0(%rbp)
movq -0x5b0(%rbp), %rax
movq %rax, -0x400(%rbp)
movq 0x18(%rbp), %rdi
callq 0x42590
cmpq $0x0, %rax
jne 0x3ff7f
movq -0x400(%rbp), %rax
movq %rax, -0x5c0(%rbp)
jmp 0x3ff8a
xorl %eax, %eax
movq %rax, -0x5c0(%rbp)
jmp 0x3ff8a
movq -0x5c0(%rbp), %rsi
movq -0x3f0(%rbp), %rdx
movq -0x3f0(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
seta %al
movzbl %al, %ecx
andl $0x1, %ecx
leaq -0x418(%rbp), %rdi
callq 0x425b0
movq -0x3f8(%rbp), %rax
movq %rax, -0x378(%rbp)
movabsq $0x1fffffffffffffff, %rax # imm = 0x1FFFFFFFFFFFFFFF
cmpq %rax, -0x378(%rbp)
jbe 0x3ffe8
callq 0x2f5b0
jmp 0x3ffe6
jmp 0x3ffe8
jmp 0x3ffea
movq 0x18(%rbp), %rdi
callq 0x42600
movq %rax, -0x5c8(%rbp)
jmp 0x3fffc
movq -0x5c8(%rbp), %rax
cmpq $0x0, %rax
je 0x4002b
movq 0x18(%rbp), %rdi
callq 0x42600
movq %rax, -0x5d0(%rbp)
jmp 0x4001b
movq -0x5d0(%rbp), %rax
movq %rax, -0x5d8(%rbp)
jmp 0x400a6
movq -0x3f8(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
ja 0x4006f
movq -0x3f8(%rbp), %rax
leaq 0x1e(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
addq $0x10, %rax
subq $0x1, %rax
andq $-0x10, %rax
movq %rax, -0x5e0(%rbp)
jmp 0x40098
movq -0x3f8(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2f650
movq %rax, -0x5e8(%rbp)
jmp 0x40088
movq -0x5e8(%rbp), %rax
movq %rax, -0x5e0(%rbp)
jmp 0x40098
movq -0x5e0(%rbp), %rax
movq %rax, -0x5d8(%rbp)
movq -0x5d8(%rbp), %rax
movq %rax, -0x430(%rbp)
movq 0x18(%rbp), %rdi
callq 0x42600
movq %rax, -0x5f0(%rbp)
jmp 0x400c6
movq -0x5f0(%rbp), %rax
cmpq $0x0, %rax
jne 0x400e3
movq -0x430(%rbp), %rax
movq %rax, -0x5f8(%rbp)
jmp 0x400ee
xorl %eax, %eax
movq %rax, -0x5f8(%rbp)
jmp 0x400ee
movq -0x5f8(%rbp), %rsi
movq -0x3f8(%rbp), %rdx
movq %rdx, %rax
shlq $0x3, %rax
subq $0x20001, %rax          # imm = 0x20001
setae %al
movzbl %al, %ecx
leaq -0x448(%rbp), %rdi
callq 0x425b0
jmp 0x4011d
movq $0x0, -0x458(%rbp)
movq -0x458(%rbp), %rax
cmpq -0x380(%rbp), %rax
jge 0x410c6
movq -0x380(%rbp), %rax
subq -0x458(%rbp), %rax
movq %rax, -0x468(%rbp)
leaq -0x468(%rbp), %rdi
leaq -0x3d8(%rbp), %rsi
callq 0x7cf0
movq (%rax), %rax
movq %rax, -0x460(%rbp)
movq -0x458(%rbp), %rax
movq %rax, -0x470(%rbp)
movq -0x458(%rbp), %rax
addq -0x460(%rbp), %rax
movq %rax, -0x478(%rbp)
movq -0x380(%rbp), %rax
subq -0x470(%rbp), %rax
subq -0x460(%rbp), %rax
movq %rax, -0x480(%rbp)
movq -0x430(%rbp), %rax
movq -0x460(%rbp), %rcx
imulq -0x460(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x488(%rbp)
cmpq $0x0, -0x480(%rbp)
jle 0x403b7
movq -0x488(%rbp), %rax
movq %rax, -0x600(%rbp)
movq -0x470(%rbp), %rcx
movq -0x478(%rbp), %rax
leaq -0x3d0(%rbp), %rdx
movq %rdx, -0x258(%rbp)
movq %rcx, -0x260(%rbp)
movq %rax, -0x268(%rbp)
movq -0x258(%rbp), %rax
movq -0x260(%rbp), %rdx
movq -0x268(%rbp), %rcx
movq %rax, -0x218(%rbp)
movq %rdx, -0x220(%rbp)
movq %rcx, -0x228(%rbp)
movq -0x218(%rbp), %rdi
movq (%rdi), %rcx
movq -0x228(%rbp), %rdx
movq -0x220(%rbp), %rsi
imulq 0x8(%rdi), %rsi
addq %rsi, %rdx
shlq $0x3, %rdx
addq %rdx, %rcx
movq 0x8(%rax), %rax
leaq -0x250(%rbp), %rdx
movq %rdx, -0x230(%rbp)
movq %rcx, -0x238(%rbp)
movq %rax, -0x240(%rbp)
movq -0x230(%rbp), %rdx
movq -0x238(%rbp), %rcx
movq -0x240(%rbp), %rax
movq %rdx, -0x1f8(%rbp)
movq %rcx, -0x200(%rbp)
movq %rax, -0x208(%rbp)
movq $0x1, -0x210(%rbp)
movq -0x1f8(%rbp), %rax
movq -0x200(%rbp), %rcx
movq %rcx, (%rax)
movq -0x208(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x210(%rbp)
je 0x40302
leaq 0x7a959(%rip), %rdi     # 0xbac43
leaq 0x7a95a(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7aa2b(%rip), %rcx     # 0xbad28
callq 0x6340
movq -0x250(%rbp), %rax
movq %rax, -0x610(%rbp)
movq -0x248(%rbp), %rax
movq %rax, -0x608(%rbp)
movq -0x600(%rbp), %rsi
movq -0x608(%rbp), %rax
movq -0x610(%rbp), %rcx
movq %rcx, -0x498(%rbp)
movq %rax, -0x490(%rbp)
movq -0x460(%rbp), %rcx
movq -0x480(%rbp), %r8
subq $0x10, %rsp
movq %rsp, %rax
movq $0x0, (%rax)
xorl %eax, %eax
movl %eax, %r9d
leaq -0x44b(%rbp), %rdi
leaq -0x498(%rbp), %rdx
callq 0x42620
addq $0x10, %rsp
jmp 0x4037b
jmp 0x403b7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x420(%rbp)
movl %eax, -0x424(%rbp)
jmp 0x410e3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x420(%rbp)
movl %eax, -0x424(%rbp)
leaq -0x448(%rbp), %rdi
callq 0x467f0
jmp 0x410e3
movq $0x0, -0x4a0(%rbp)
movq -0x4a0(%rbp), %rax
cmpq -0x460(%rbp), %rax
jge 0x40628
movq -0x460(%rbp), %rax
subq -0x4a0(%rbp), %rax
movq %rax, -0x4b0(%rbp)
movq $0x4, -0x4b8(%rbp)
leaq -0x4b0(%rbp), %rdi
leaq -0x4b8(%rbp), %rsi
callq 0x7cf0
movq (%rax), %rax
movq %rax, -0x4a8(%rbp)
movq -0x470(%rbp), %rax
addq -0x4a0(%rbp), %rax
movq %rax, -0x4c0(%rbp)
movq $0x0, -0x4c8(%rbp)
movq -0x4a0(%rbp), %rax
movq %rax, -0x4d0(%rbp)
cmpq $0x0, -0x4d0(%rbp)
jle 0x4060f
movq -0x430(%rbp), %rax
movq -0x4a0(%rbp), %rcx
imulq -0x460(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x618(%rbp)
movq -0x470(%rbp), %rcx
addq -0x4c8(%rbp), %rcx
movq -0x4c0(%rbp), %rax
leaq -0x3d0(%rbp), %rdx
movq %rdx, -0x2d0(%rbp)
movq %rcx, -0x2d8(%rbp)
movq %rax, -0x2e0(%rbp)
movq -0x2d0(%rbp), %rax
movq -0x2d8(%rbp), %rdx
movq -0x2e0(%rbp), %rcx
movq %rax, -0x290(%rbp)
movq %rdx, -0x298(%rbp)
movq %rcx, -0x2a0(%rbp)
movq -0x290(%rbp), %rdi
movq (%rdi), %rcx
movq -0x2a0(%rbp), %rdx
movq -0x298(%rbp), %rsi
imulq 0x8(%rdi), %rsi
addq %rsi, %rdx
shlq $0x3, %rdx
addq %rdx, %rcx
movq 0x8(%rax), %rax
leaq -0x2c8(%rbp), %rdx
movq %rdx, -0x2a8(%rbp)
movq %rcx, -0x2b0(%rbp)
movq %rax, -0x2b8(%rbp)
movq -0x2a8(%rbp), %rdx
movq -0x2b0(%rbp), %rcx
movq -0x2b8(%rbp), %rax
movq %rdx, -0x270(%rbp)
movq %rcx, -0x278(%rbp)
movq %rax, -0x280(%rbp)
movq $0x1, -0x288(%rbp)
movq -0x270(%rbp), %rax
movq -0x278(%rbp), %rcx
movq %rcx, (%rax)
movq -0x280(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x288(%rbp)
je 0x4058f
leaq 0x7a6cc(%rip), %rdi     # 0xbac43
leaq 0x7a6cd(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7a79e(%rip), %rcx     # 0xbad28
callq 0x6340
movq -0x2c8(%rbp), %rax
movq %rax, -0x628(%rbp)
movq -0x2c0(%rbp), %rax
movq %rax, -0x620(%rbp)
movq -0x618(%rbp), %rsi
movq -0x620(%rbp), %rax
movq -0x628(%rbp), %rcx
movq %rcx, -0x4e0(%rbp)
movq %rax, -0x4d8(%rbp)
movq -0x4d0(%rbp), %rcx
movq -0x4a8(%rbp), %r8
movq -0x460(%rbp), %r9
movq -0x4c8(%rbp), %rdx
subq $0x10, %rsp
movq %rsp, %rax
movq %rdx, (%rax)
leaq -0x44c(%rbp), %rdi
leaq -0x4e0(%rbp), %rdx
callq 0x42a50
addq $0x10, %rsp
jmp 0x4060d
jmp 0x4060f
jmp 0x40611
movq -0x4a0(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x4a0(%rbp)
jmp 0x403c2
movq $0x0, -0x4e8(%rbp)
movq -0x4e8(%rbp), %rax
cmpq -0x3b0(%rbp), %rax
jge 0x410aa
movq -0x3b0(%rbp), %rax
subq -0x4e8(%rbp), %rax
movq %rax, -0x4f8(%rbp)
leaq -0x3e0(%rbp), %rdi
leaq -0x4f8(%rbp), %rsi
callq 0x7cf0
movq (%rax), %rax
movq %rax, -0x4f0(%rbp)
movq $0x0, -0x500(%rbp)
movq -0x500(%rbp), %rax
cmpq -0x460(%rbp), %rax
jge 0x40eff
movq -0x460(%rbp), %rax
subq -0x500(%rbp), %rax
movq %rax, -0x510(%rbp)
movq $0x4, -0x518(%rbp)
leaq -0x510(%rbp), %rdi
leaq -0x518(%rbp), %rsi
callq 0x7cf0
movq (%rax), %rax
movq %rax, -0x508(%rbp)
movq -0x470(%rbp), %rax
addq -0x500(%rbp), %rax
movq %rax, -0x520(%rbp)
movq $0x0, -0x528(%rbp)
movq -0x500(%rbp), %rax
movq %rax, -0x530(%rbp)
cmpq $0x0, -0x530(%rbp)
jle 0x4089f
movq -0x4e8(%rbp), %rcx
movq -0x520(%rbp), %rax
leaq -0x3c0(%rbp), %rdx
movq %rdx, -0x150(%rbp)
movq %rcx, -0x158(%rbp)
movq %rax, -0x160(%rbp)
movq -0x150(%rbp), %rax
movq -0x158(%rbp), %rdx
movq -0x160(%rbp), %rcx
movq %rax, -0x68(%rbp)
movq %rdx, -0x70(%rbp)
movq %rcx, -0x78(%rbp)
movq -0x68(%rbp), %rdi
movq (%rdi), %rcx
movq -0x70(%rbp), %rdx
movq -0x78(%rbp), %rsi
imulq 0x8(%rdi), %rsi
addq %rsi, %rdx
shlq $0x3, %rdx
addq %rdx, %rcx
movq 0x8(%rax), %rax
leaq -0x148(%rbp), %rdx
movq %rdx, -0x120(%rbp)
movq %rcx, -0x128(%rbp)
movq %rax, -0x130(%rbp)
movq $0x1, -0x138(%rbp)
movq -0x120(%rbp), %rax
movq -0x128(%rbp), %rcx
movq %rcx, (%rax)
movq -0x130(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x138(%rbp)
je 0x407ea
leaq 0x7a471(%rip), %rdi     # 0xbac43
leaq 0x7a472(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7becf(%rip), %rcx     # 0xbc6b4
callq 0x6340
movq -0x148(%rbp), %rax
movq %rax, -0x638(%rbp)
movq -0x140(%rbp), %rax
movq %rax, -0x630(%rbp)
movq -0x630(%rbp), %rax
movq -0x638(%rbp), %rcx
movq %rcx, -0x540(%rbp)
movq %rax, -0x538(%rbp)
movq -0x400(%rbp), %rdx
movq -0x430(%rbp), %rax
movq -0x500(%rbp), %rcx
movq -0x460(%rbp), %rdi
imulq %rdi, %rcx
leaq (%rax,%rcx,8), %rcx
movq -0x4f0(%rbp), %r8
movq -0x530(%rbp), %r9
movq -0x508(%rbp), %rsi
movq -0x528(%rbp), %r10
subq $0x30, %rsp
movq %rsp, %rax
movq %r10, 0x20(%rax)
movq %r10, 0x18(%rax)
movq %rdi, 0x10(%rax)
movq %rdi, 0x8(%rax)
movq %rsi, (%rax)
leaq -0x44a(%rbp), %rdi
leaq -0x540(%rbp), %rsi
movsd 0x76e06(%rip), %xmm0    # 0xb7698
callq 0x42ef0
addq $0x30, %rsp
jmp 0x4089d
jmp 0x4089f
movq $0x0, -0x548(%rbp)
movq -0x548(%rbp), %rax
cmpq -0x508(%rbp), %rax
jge 0x40d81
movq -0x520(%rbp), %rax
addq -0x548(%rbp), %rax
movq %rax, -0x550(%rbp)
movq -0x4e8(%rbp), %rcx
movq -0x550(%rbp), %rax
leaq -0x3c0(%rbp), %rdx
movq %rdx, -0xe8(%rbp)
movq %rcx, -0xf0(%rbp)
movq %rax, -0xf8(%rbp)
movq -0xe8(%rbp), %rdx
movq -0xf0(%rbp), %rcx
movq -0xf8(%rbp), %rax
movq %rdx, -0x98(%rbp)
movq %rcx, -0xa0(%rbp)
movq %rax, -0xa8(%rbp)
movq -0x98(%rbp), %rsi
movq (%rsi), %rax
movq -0xa0(%rbp), %rcx
movq -0xa8(%rbp), %rdx
imulq 0x8(%rsi), %rdx
addq %rdx, %rcx
shlq $0x3, %rcx
addq %rcx, %rax
leaq -0xe0(%rbp), %rcx
movq %rcx, -0x20(%rbp)
movq %rax, -0x28(%rbp)
movq $0x1, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq -0x28(%rbp), %rcx
movq %rcx, (%rax)
cmpq $0x1, -0x30(%rbp)
je 0x40996
leaq 0x7a2c5(%rip), %rdi     # 0xbac43
leaq 0x7a2c6(%rip), %rsi     # 0xbac4b
movl $0xa9, %edx
leaq 0x7c1cb(%rip), %rcx     # 0xbcb5c
callq 0x6340
movq -0xe0(%rbp), %rax
movq %rax, -0x640(%rbp)
movq -0x640(%rbp), %rax
movq %rax, -0x558(%rbp)
movq $0x0, -0x560(%rbp)
movq -0x560(%rbp), %rax
cmpq -0x548(%rbp), %rax
jge 0x40c5a
movq -0x520(%rbp), %rcx
movq -0x560(%rbp), %rax
addq %rax, %rcx
movq -0x550(%rbp), %rax
leaq -0x3d0(%rbp), %rdx
movq %rdx, -0x328(%rbp)
movq %rcx, -0x330(%rbp)
movq %rax, -0x338(%rbp)
movq -0x328(%rbp), %rsi
movq -0x338(%rbp), %rcx
movq -0x330(%rbp), %rdx
movq (%rsi), %rax
movq 0x8(%rsi), %rsi
imulq %rsi, %rdx
addq %rdx, %rcx
leaq (%rax,%rcx,8), %rsi
leaq -0x449(%rbp), %rdi
callq 0x46140
movq %rax, -0x648(%rbp)
jmp 0x40a41
movq -0x648(%rbp), %rax
movsd (%rax), %xmm0
movsd %xmm0, -0x568(%rbp)
movq -0x4e8(%rbp), %rcx
movq -0x520(%rbp), %rax
addq -0x560(%rbp), %rax
leaq -0x3c0(%rbp), %rdx
movq %rdx, -0x108(%rbp)
movq %rcx, -0x110(%rbp)
movq %rax, -0x118(%rbp)
movq -0x108(%rbp), %rdx
movq -0x110(%rbp), %rcx
movq -0x118(%rbp), %rax
movq %rdx, -0x80(%rbp)
movq %rcx, -0x88(%rbp)
movq %rax, -0x90(%rbp)
movq -0x80(%rbp), %rsi
movq (%rsi), %rax
movq -0x88(%rbp), %rcx
movq -0x90(%rbp), %rdx
imulq 0x8(%rsi), %rdx
addq %rdx, %rcx
shlq $0x3, %rcx
addq %rcx, %rax
leaq -0x100(%rbp), %rcx
movq %rcx, -0x8(%rbp)
movq %rax, -0x10(%rbp)
movq $0x1, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq -0x10(%rbp), %rcx
movq %rcx, (%rax)
cmpq $0x1, -0x18(%rbp)
je 0x40b18
leaq 0x7a143(%rip), %rdi     # 0xbac43
leaq 0x7a144(%rip), %rsi     # 0xbac4b
movl $0xa9, %edx
leaq 0x7c049(%rip), %rcx     # 0xbcb5c
callq 0x6340
movq -0x100(%rbp), %rax
movq %rax, -0x650(%rbp)
movq -0x650(%rbp), %rax
movq %rax, -0x570(%rbp)
movq $0x0, -0x578(%rbp)
movq -0x578(%rbp), %rax
cmpq -0x4f0(%rbp), %rax
jge 0x40c41
movq -0x578(%rbp), %rax
leaq -0x570(%rbp), %rcx
movq %rcx, -0xb0(%rbp)
movq %rax, -0xb8(%rbp)
movq -0xb0(%rbp), %rax
movq (%rax), %rax
movq -0xb8(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x658(%rbp)
movq -0x658(%rbp), %rax
movsd (%rax), %xmm0
movsd %xmm0, -0x670(%rbp)
movsd -0x568(%rbp), %xmm0
movsd %xmm0, -0x668(%rbp)
movq -0x578(%rbp), %rax
leaq -0x558(%rbp), %rcx
movq %rcx, -0xc0(%rbp)
movq %rax, -0xc8(%rbp)
movq -0xc0(%rbp), %rax
movq (%rax), %rax
movq -0xc8(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x660(%rbp)
movq -0x660(%rbp), %rax
movsd -0x668(%rbp), %xmm2
movsd -0x670(%rbp), %xmm0
movsd (%rax), %xmm1
movq %xmm0, %rcx
movabsq $-0x8000000000000000, %rdx # imm = 0x8000000000000000
xorq %rdx, %rcx
movq %rcx, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movq -0x578(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x578(%rbp)
jmp 0x40b3f
jmp 0x40c43
movq -0x560(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x560(%rbp)
jmp 0x409bd
movq -0x550(%rbp), %rax
leaq -0x3d0(%rbp), %rcx
movq %rcx, -0x340(%rbp)
movq %rax, -0x348(%rbp)
movq %rax, -0x350(%rbp)
movq -0x340(%rbp), %rsi
movq -0x350(%rbp), %rcx
movq -0x348(%rbp), %rdx
movq (%rsi), %rax
movq 0x8(%rsi), %rsi
imulq %rsi, %rdx
addq %rdx, %rcx
leaq (%rax,%rcx,8), %rsi
leaq -0x449(%rbp), %rdi
callq 0x46140
movq %rax, -0x678(%rbp)
jmp 0x40cb9
movq -0x678(%rbp), %rax
movsd 0x76368(%rip), %xmm0    # 0xb7030
divsd (%rax), %xmm0
movsd %xmm0, -0x580(%rbp)
movq $0x0, -0x588(%rbp)
movq -0x588(%rbp), %rax
cmpq -0x4f0(%rbp), %rax
jge 0x40d68
movsd -0x580(%rbp), %xmm0
movsd %xmm0, -0x688(%rbp)
movq -0x588(%rbp), %rax
leaq -0x558(%rbp), %rcx
movq %rcx, -0xd0(%rbp)
movq %rax, -0xd8(%rbp)
movq -0xd0(%rbp), %rax
movq (%rax), %rax
movq -0xd8(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x680(%rbp)
movq -0x680(%rbp), %rax
movsd -0x688(%rbp), %xmm0
mulsd (%rax), %xmm0
movsd %xmm0, (%rax)
movq -0x588(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x588(%rbp)
jmp 0x40cdf
jmp 0x40d6a
movq -0x548(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x548(%rbp)
jmp 0x408aa
movq -0x400(%rbp), %rax
movq %rax, -0x690(%rbp)
movq -0x4e8(%rbp), %rcx
movq -0x520(%rbp), %rax
leaq -0x3c0(%rbp), %rdx
movq %rdx, -0x198(%rbp)
movq %rcx, -0x1a0(%rbp)
movq %rax, -0x1a8(%rbp)
movq -0x198(%rbp), %rax
movq -0x1a0(%rbp), %rdx
movq -0x1a8(%rbp), %rcx
movq %rax, -0x50(%rbp)
movq %rdx, -0x58(%rbp)
movq %rcx, -0x60(%rbp)
movq -0x50(%rbp), %rdi
movq (%rdi), %rcx
movq -0x58(%rbp), %rdx
movq -0x60(%rbp), %rsi
imulq 0x8(%rdi), %rsi
addq %rsi, %rdx
shlq $0x3, %rdx
addq %rdx, %rcx
movq 0x8(%rax), %rax
leaq -0x190(%rbp), %rdx
movq %rdx, -0x168(%rbp)
movq %rcx, -0x170(%rbp)
movq %rax, -0x178(%rbp)
movq $0x1, -0x180(%rbp)
movq -0x168(%rbp), %rax
movq -0x170(%rbp), %rcx
movq %rcx, (%rax)
movq -0x178(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x180(%rbp)
je 0x40e68
leaq 0x79df3(%rip), %rdi     # 0xbac43
leaq 0x79df4(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7b851(%rip), %rcx     # 0xbc6b4
callq 0x6340
movq -0x190(%rbp), %rax
movq %rax, -0x6a0(%rbp)
movq -0x188(%rbp), %rax
movq %rax, -0x698(%rbp)
movq -0x690(%rbp), %rsi
movq -0x698(%rbp), %rax
movq -0x6a0(%rbp), %rcx
movq %rcx, -0x598(%rbp)
movq %rax, -0x590(%rbp)
movq -0x508(%rbp), %rcx
movq -0x4f0(%rbp), %r8
movq -0x460(%rbp), %r9
movq -0x500(%rbp), %rdx
subq $0x10, %rsp
movq %rsp, %rax
movq %rdx, (%rax)
leaq -0x44d(%rbp), %rdi
leaq -0x598(%rbp), %rdx
callq 0x46160
addq $0x10, %rsp
jmp 0x40ee6
jmp 0x40ee8
movq -0x500(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x500(%rbp)
jmp 0x40684
cmpq $0x0, -0x480(%rbp)
jle 0x4108e
movq -0x4e8(%rbp), %rcx
movq -0x478(%rbp), %rax
leaq -0x3c0(%rbp), %rdx
movq %rdx, -0x1e0(%rbp)
movq %rcx, -0x1e8(%rbp)
movq %rax, -0x1f0(%rbp)
movq -0x1e0(%rbp), %rax
movq -0x1e8(%rbp), %rdx
movq -0x1f0(%rbp), %rcx
movq %rax, -0x38(%rbp)
movq %rdx, -0x40(%rbp)
movq %rcx, -0x48(%rbp)
movq -0x38(%rbp), %rdi
movq (%rdi), %rcx
movq -0x40(%rbp), %rdx
movq -0x48(%rbp), %rsi
imulq 0x8(%rdi), %rsi
addq %rsi, %rdx
shlq $0x3, %rdx
addq %rdx, %rcx
movq 0x8(%rax), %rax
leaq -0x1d8(%rbp), %rdx
movq %rdx, -0x1b0(%rbp)
movq %rcx, -0x1b8(%rbp)
movq %rax, -0x1c0(%rbp)
movq $0x1, -0x1c8(%rbp)
movq -0x1b0(%rbp), %rax
movq -0x1b8(%rbp), %rcx
movq %rcx, (%rax)
movq -0x1c0(%rbp), %rcx
movq %rcx, 0x8(%rax)
cmpq $0x1, -0x1c8(%rbp)
je 0x40fe6
leaq 0x79c75(%rip), %rdi     # 0xbac43
leaq 0x79c76(%rip), %rsi     # 0xbac4b
movl $0xd1, %edx
leaq 0x7b6d3(%rip), %rcx     # 0xbc6b4
callq 0x6340
movq -0x1d8(%rbp), %rax
movq %rax, -0x6b0(%rbp)
movq -0x1d0(%rbp), %rax
movq %rax, -0x6a8(%rbp)
movq -0x6a8(%rbp), %rax
movq -0x6b0(%rbp), %rcx
movq %rcx, -0x5a8(%rbp)
movq %rax, -0x5a0(%rbp)
movq -0x400(%rbp), %rdx
movq -0x488(%rbp), %rcx
movq -0x4f0(%rbp), %r8
movq -0x460(%rbp), %r9
movq -0x480(%rbp), %rsi
subq $0x30, %rsp
movq %rsp, %rax
movq %rsi, (%rax)
movq $0x0, 0x20(%rax)
movq $0x0, 0x18(%rax)
movq $-0x1, 0x10(%rax)
movq $-0x1, 0x8(%rax)
leaq -0x44a(%rbp), %rdi
leaq -0x5a8(%rbp), %rsi
movsd 0x76617(%rip), %xmm0    # 0xb7698
callq 0x42ef0
addq $0x30, %rsp
jmp 0x4108c
jmp 0x4108e
jmp 0x41090
movq -0x3e0(%rbp), %rax
addq -0x4e8(%rbp), %rax
movq %rax, -0x4e8(%rbp)
jmp 0x40633
jmp 0x410ac
movq -0x3d8(%rbp), %rax
addq -0x458(%rbp), %rax
movq %rax, -0x458(%rbp)
jmp 0x40128
leaq -0x448(%rbp), %rdi
callq 0x467f0
leaq -0x418(%rbp), %rdi
callq 0x467f0
movq %rbp, %rsp
popq %rbp
retq
leaq -0x418(%rbp), %rdi
callq 0x467f0
movq -0x420(%rbp), %rdi
callq 0x6830
nopl (%rax,%rax)