// File: ef-gy[P]libefgy/include/ef.gy/big-integers.h
// Function: efgy::math::numeric::bigIntegers<long long, unsigned long long, unsigned int, 32u>::operator<<(unsigned int const&) const
bigIntegers operator<<(const cellType &b) const {
    if (cell.size() == 0) {
      return *this;
    }

    if ((cell.size() * cellBitCount + b) <= longBitCount) {
      return bigIntegers((*this).toInteger() << b, false);
    }

    cellType pushCells = 0;
    cellType q = b;

    while (q > cellBitCount) {
      pushCells++;
      q -= cellBitCount;
    }

    if ((pushCells == 0) && (q > 0)) {
      const cellType negQ = (cellBitCount - q);
      const cellType mask = ((1 << q) - 1) << negQ;

      if ((cell[(cell.size() - 1)] & mask) == 0) {
        /* no additional cells needed */
        bigIntegers r = *this;
        cellType overflow = 0;

        for (cellType i = 0; i < cell.size(); i++) {
          cellType newContent = (cell[i] << q) | overflow;
          overflow = (cell[i] & mask) >> negQ;
          r.cell[i] = newContent;
        }

        return r;
      }
    }

    bigIntegers r;

    r.cell.resize(cell.size() + pushCells + 1);

    for (cellType i = 0; i < r.cell.size(); i++) {
      if (i < pushCells) {
        r.cell[i] = 0;
      } else if (i == (r.cell.size() - 1)) {
        cellType j = i - 1;

        r.cell[i] = ((Tu(cell[(j - pushCells)])) << q) >> cellBitCount;
      } else if (i > pushCells) {
        cellType j = i - 1;

        r.cell[i] = (((Tu(cell[(j - pushCells)])) |
                      (Tu(cell[(i - pushCells)]) << cellBitCount))
                     << q) >>
                    cellBitCount;
      } else {
        r.cell[i] = Tu(cell[(i - pushCells)]) << q;
      }
    }

    r.shrink();

    return r;
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x70(%rbp)
movq %rdi, %rax
movq %rax, -0x68(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x60(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
cmpq $0x0, %rax
jne 0x3d4bb
movq -0x60(%rbp), %rsi
movq -0x70(%rbp), %rdi
callq 0x3e3b0
jmp 0x3d882
movq -0x60(%rbp), %rdi
addq $0x8, %rdi
callq 0x3c9c0
shlq $0x5, %rax
movq -0x18(%rbp), %rcx
movl (%rcx), %ecx
addq %rcx, %rax
cmpq $0x40, %rax
ja 0x3d502
movq -0x60(%rbp), %rdi
callq 0x3d1f0
movq -0x70(%rbp), %rdi
movq %rax, %rsi
movq -0x18(%rbp), %rax
movl (%rax), %eax
movl %eax, %ecx
shlq %cl, %rsi
xorl %edx, %edx
callq 0x3d290
jmp 0x3d882
movl $0x0, -0x1c(%rbp)
movq -0x18(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x20(%rbp)
cmpl $0x20, -0x20(%rbp)
jbe 0x3d52c
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
movl -0x20(%rbp), %eax
subl $0x20, %eax
movl %eax, -0x20(%rbp)
jmp 0x3d512
cmpl $0x0, -0x1c(%rbp)
jne 0x3d65e
cmpl $0x0, -0x20(%rbp)
jbe 0x3d65e
movq -0x60(%rbp), %rdi
movl $0x20, %eax
subl -0x20(%rbp), %eax
movl %eax, -0x24(%rbp)
movl -0x20(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
subl $0x1, %eax
movl -0x24(%rbp), %ecx
shll %cl, %eax
movl %eax, -0x28(%rbp)
movq %rdi, %rax
addq $0x8, %rax
movq %rax, -0x78(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
movq -0x78(%rbp), %rdi
movq %rax, %rsi
subq $0x1, %rsi
callq 0x3d8a0
movl (%rax), %eax
andl -0x28(%rbp), %eax
cmpl $0x0, %eax
jne 0x3d65c
movq -0x60(%rbp), %rsi
movq -0x70(%rbp), %rdi
movb $0x0, -0x29(%rbp)
callq 0x3e3b0
movl $0x0, -0x30(%rbp)
movl $0x0, -0x34(%rbp)
movq -0x60(%rbp), %rdi
movl -0x34(%rbp), %eax
movq %rax, -0x80(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
movq %rax, %rcx
movq -0x80(%rbp), %rax
cmpq %rcx, %rax
jae 0x3d644
movq -0x60(%rbp), %rdi
addq $0x8, %rdi
movl -0x34(%rbp), %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x60(%rbp), %rdi
movl (%rax), %eax
movl -0x20(%rbp), %ecx
shll %cl, %eax
orl -0x30(%rbp), %eax
movl %eax, -0x38(%rbp)
addq $0x8, %rdi
movl -0x34(%rbp), %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x70(%rbp), %rdi
movl (%rax), %eax
andl -0x28(%rbp), %eax
movl -0x24(%rbp), %ecx
shrl %cl, %eax
movl %eax, -0x30(%rbp)
movl -0x38(%rbp), %eax
movl %eax, -0x84(%rbp)
addq $0x8, %rdi
movl -0x34(%rbp), %eax
movl %eax, %esi
callq 0x3c3f0
movl -0x84(%rbp), %ecx
movl %ecx, (%rax)
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x3d5b5
movb $0x1, -0x29(%rbp)
testb $0x1, -0x29(%rbp)
jne 0x3d657
movq -0x70(%rbp), %rdi
callq 0x10260
jmp 0x3d882
jmp 0x3d65e
movq -0x70(%rbp), %rdi
movb $0x0, -0x39(%rbp)
callq 0x3e410
movq -0x70(%rbp), %rax
movq -0x60(%rbp), %rdi
addq $0x8, %rax
movq %rax, -0x90(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
movq -0x90(%rbp), %rdi
movl -0x1c(%rbp), %ecx
leaq 0x1(%rax,%rcx), %rsi
callq 0x3c360
jmp 0x3d69d
movl $0x0, -0x50(%rbp)
movq -0x70(%rbp), %rdi
movl -0x50(%rbp), %eax
movq %rax, -0x98(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
movq %rax, %rcx
movq -0x98(%rbp), %rax
cmpq %rcx, %rax
jae 0x3d862
movl -0x50(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jae 0x3d70d
movq -0x70(%rbp), %rdi
addq $0x8, %rdi
movl -0x50(%rbp), %eax
movl %eax, %esi
callq 0x3c3f0
movl $0x0, (%rax)
jmp 0x3d852
movq -0x70(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
callq 0x10260
jmp 0x3d88f
movq -0x70(%rbp), %rdi
movl -0x50(%rbp), %eax
movq %rax, -0xa0(%rbp)
addq $0x8, %rdi
callq 0x3c9c0
movq %rax, %rcx
movq -0xa0(%rbp), %rax
subq $0x1, %rcx
cmpq %rcx, %rax
jne 0x3d788
movq -0x60(%rbp), %rdi
movl -0x50(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x54(%rbp)
addq $0x8, %rdi
movl -0x54(%rbp), %eax
subl -0x1c(%rbp), %eax
movl %eax, %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x70(%rbp), %rdi
movl (%rax), %eax
movl -0x20(%rbp), %ecx
shlq %cl, %rax
shrq $0x20, %rax
movl %eax, -0xa4(%rbp)
addq $0x8, %rdi
movl -0x50(%rbp), %eax
movl %eax, %esi
callq 0x3c3f0
movl -0xa4(%rbp), %ecx
movl %ecx, (%rax)
jmp 0x3d850
movl -0x50(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jbe 0x3d80f
movq -0x60(%rbp), %rdi
movl -0x50(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x58(%rbp)
addq $0x8, %rdi
movl -0x58(%rbp), %eax
subl -0x1c(%rbp), %eax
movl %eax, %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x60(%rbp), %rdi
movl (%rax), %eax
movq %rax, -0xb0(%rbp)
addq $0x8, %rdi
movl -0x50(%rbp), %eax
subl -0x1c(%rbp), %eax
movl %eax, %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x70(%rbp), %rdi
movq %rax, %rcx
movq -0xb0(%rbp), %rax
movl (%rcx), %ecx
shlq $0x20, %rcx
orq %rcx, %rax
movl -0x20(%rbp), %ecx
shlq %cl, %rax
shrq $0x20, %rax
movl %eax, -0xa8(%rbp)
addq $0x8, %rdi
movl -0x50(%rbp), %eax
movl %eax, %esi
callq 0x3c3f0
movl -0xa8(%rbp), %ecx
movl %ecx, (%rax)
jmp 0x3d84e
movq -0x60(%rbp), %rdi
addq $0x8, %rdi
movl -0x50(%rbp), %eax
subl -0x1c(%rbp), %eax
movl %eax, %eax
movl %eax, %esi
callq 0x3d8a0
movq -0x70(%rbp), %rdi
movl (%rax), %eax
movl -0x20(%rbp), %ecx
shlq %cl, %rax
movl %eax, -0xb4(%rbp)
addq $0x8, %rdi
movl -0x50(%rbp), %eax
movl %eax, %esi
callq 0x3c3f0
movl -0xb4(%rbp), %ecx
movl %ecx, (%rax)
jmp 0x3d850
jmp 0x3d852
jmp 0x3d854
movl -0x50(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x50(%rbp)
jmp 0x3d6a4
movq -0x70(%rbp), %rdi
callq 0x3e480
jmp 0x3d86d
movb $0x1, -0x39(%rbp)
testb $0x1, -0x39(%rbp)
jne 0x3d880
movq -0x70(%rbp), %rdi
callq 0x10260
jmp 0x3d882
movq -0x68(%rbp), %rax
addq $0xc0, %rsp
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x55e0
nopl (%rax,%rax)