code: func (e *engineImpl) genTopicAndSubNames(c context.Context, manager, publisher string) (topic string, sub string) {
  	// Avoid accidental override of the topic when running on dev server.
  	prefix := "scheduler"
  	if info.IsDevAppServer(c) {
  		prefix = "dev-scheduler"
  	}
  
  	// Each publisher gets its own topic (and subscription), so it's clearer from
  	// logs and PubSub console who's calling what. PubSub topics can't have "@" in
  	// them, so replace "@" with "~". URL encoding could have been used too, but
  	// Cloud Console confuses %40 with its own URL encoding and doesn't display
  	// all pages correctly.
  	id := fmt.Sprintf("%s.%s.%s",
  		prefix,
  		manager,
  		strings.Replace(publisher, "@", "~", -1))
  
  	appID := info.AppID(c)
  	topic = fmt.Sprintf("projects/%s/topics/%s", appID, id)
  	sub = fmt.Sprintf("projects/%s/subscriptions/%s", appID, id)
  	return
  }
docs: // genTopicAndSubNames derives PubSub topic and subscription names to use for
  // notifications from given publisher.