code: func (q *queue) ScheduleSkeleton(from uint64, skeleton []*types.Header) {
  	q.lock.Lock()
  	defer q.lock.Unlock()
  
  	// No skeleton retrieval can be in progress, fail hard if so (huge implementation bug)
  	if q.headerResults != nil {
  		panic("skeleton assembly already in progress")
  	}
  	// Schedule all the header retrieval tasks for the skeleton assembly
  	q.headerTaskPool = make(map[uint64]*types.Header)
  	q.headerTaskQueue = prque.New(nil)
  	q.headerPeerMiss = make(map[string]map[uint64]struct{}) // Reset availability to correct invalid chains
  	q.headerResults = make([]*types.Header, len(skeleton)*MaxHeaderFetch)
  	q.headerProced = 0
  	q.headerOffset = from
  	q.headerContCh = make(chan bool, 1)
  
  	for i, header := range skeleton {
  		index := from + uint64(i*MaxHeaderFetch)
  
  		q.headerTaskPool[index] = header
  		q.headerTaskQueue.Push(index, -int64(index))
  	}
  }
docs: // ScheduleSkeleton adds a batch of header retrieval tasks to the queue to fill
  // up an already retrieved header skeleton.