code: func (a *IPRangeAllocator) Allocate() net.IP {
  	a.mutex.Lock()
  	defer a.mutex.Unlock()
  
  	// ensure we have some IPs first
  	if a.remaining <= 0 {
  		return nil
  	}
  
  	// get a random number within the size to start with
  	idx := rand.Int63n(a.size)
  
  	// find the next available index after the random number that is available
  	idx = a.findNextAvailbleIndex(idx)
  
  	// if idx is now -1, then it couldn't find one, which is very unlikely,
  	// however if that is, treat it as no more remaining and ensure remaining is
  	// now 0
  	if idx == -1 {
  		a.remaining = 0
  		return nil
  	}
  
  	// reserve the idx, get the IP bytes
  	a.reserved[idx] = true
  	a.remaining--
  	newBig := big.NewInt(0).Add(a.startBig, big.NewInt(idx))
  
  	return a.bigIntToIP(newBig)
  }
docs: // Allocate can be used to allocate a new IP address within the provided
  // range. It will ensure that it is unique. If the allocator has no additional
  // IP addresses available, then it will return nil.