docs: def _read_holidays(self, filename):
  		"""
  		Read holidays from an iCalendar-format file.
  		"""
  		cal = Calendar.from_ical(open(filename, 'rb').read())
  		holidays = []
  
  		for component in cal.walk('VEVENT'):
  			start = component.decoded('DTSTART')
  			try:
  				end = component.decoded('DTEND')
  			except KeyError:
  				# RFC allows DTEND to be missing
  				if isinstance(start, datetime):
  					# For DATETIME instances, the event ends immediately.
  					end = start
  				elif isinstance(start, date):
  					# For DATE instances, the event ends tomorrow
  					end = start + timedelta(days=1)
  				else:
  					raise KeyError, 'DTEND is missing and DTSTART is not of DATE or DATETIME type'
  
  			if isinstance(start, date) and not isinstance(start, datetime):
  				assert (isinstance(end, date) and not isinstance(end, datetime)), \
  					'DTSTART is of DATE type but DTEND is not of DATE type (got %r instead)' % type(end)
  				# All-day event, set times to midnight local time
  				start = datetime.combine(start, time.min)
  				end = datetime.combine(end, time.min)
  
  			# check for TZ data
  			if start.tzinfo is None or end.tzinfo is None:
  				# One of them is missing tzinfo, replace both with this office's
  				# local time.  Assume standard time if ambiguous.
  				start = self.tz.localize(start, is_dst=False)
  				end = self.tz.localize(end, is_dst=False)
  
  			yield (start, end)