亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? apa.cpp

?? PS2游戲硬盤直灌(HDL)的Windows下VC的源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	  apa_partition_t *prev = table->parts + (i > 0 ? i - 1 : table->part_count - 1);
	  apa_partition_t *curr = table->parts + i;
	  apa_partition_t *next = table->parts + (i + 1 < table->part_count ? i + 1 : 0);
	  /* no need to be endian-aware, since both have same endianess */
	  if (curr->header.prev != prev->header.start)
	    {
	      curr->modified = 1;
	      curr->header.prev = prev->header.start;
	    }
	  if (curr->header.next != next->header.start)
	    {
	      curr->modified = 1;
	      curr->header.next = next->header.start;
	    }
	  if (curr->modified)
	    set_u32 (&curr->header.checksum, apa_partition_checksum (&curr->header));
	}
    }
}


/**************************************************************/
int
apa_allocate_space (apa_partition_table_t *table,
		    const char *partition_name,
		    u_int32_t size_in_mb,
		    u_int32_t *new_partition_start,
		    int decreasing_size)
{
  int result = RET_OK;
  char *map = table->chunks_map;
  u_int32_t i;
  int found;

  /* check whether that partition name is not already used */
  found = 0;
  for (i=0; i<table->part_count; ++i)
    if (get_u16 (&table->parts [i].header.flags) == 0 &&
	get_u32 (&table->parts [i].header.main) == 0)
      if (caseless_compare (partition_name, table->parts [i].header.id))
	{
	  found = 1;
	  break;
	}
  if (found)
    return (RET_PART_EXISTS);

  if (table->free_chunks * 128 >= size_in_mb)
    {
      u_int32_t max_part_size_in_entries = table->total_chunks < 32 ? 1 : table->total_chunks / 32;
      u_int32_t max_part_size_in_mb = max_part_size_in_entries * 128;
      u_int32_t estimated_entries = (size_in_mb + 127) / 128 + 1;
      u_int32_t partitions_used = 0;
      ps2_partition_run_t *partitions = (ps2_partition_run_t *)
	osal_alloc (estimated_entries * sizeof (ps2_partition_run_t));
      if (partitions != NULL)
	{
	  /* use the most straight forward approach possible:
	     fill from the first gap onwards */
	  u_int32_t mb_remaining = size_in_mb;
	  u_int32_t allocated_mb, overhead_mb;
	  for (i=0; i<estimated_entries; ++i)
	    { /* initialize */
	      partitions [i].sector = 0;
	      partitions [i].size_in_mb = 0;
	    }
	  for (i=0; mb_remaining>0 && i<table->total_chunks; ++i)
	    if (map [i] == MAP_AVAIL)
	      {
		partitions [partitions_used].sector = i * ((128 _MB) / 512);
		partitions [partitions_used].size_in_mb = 128;
		map [i] = MAP_ALLOC; /* "allocate" chunk */
		++(partitions_used);
		mb_remaining = (mb_remaining > 128 ? mb_remaining - 128 : 0);
	      }

	  optimize_partitions (partitions, &partitions_used, max_part_size_in_mb);

	  /* calculate overhead (4M for main + 1M for each sub)
	     and allocate additional 128 M partition if necessary */
	  allocated_mb = 0; overhead_mb = 3;
	  for (i=0; i<partitions_used; ++i)
	    {
	      allocated_mb += partitions [i].size_in_mb;
	      ++overhead_mb;
	    }
	  if (allocated_mb < size_in_mb + overhead_mb)
	    { /* add one more partition or return RET_NO_SPACE */
	      int free_entry_found = 0; /* if free entry not found return RET_NO_SPACE */
	      for (i=0; i<table->total_chunks; ++i)
		if (map [i] == MAP_AVAIL)
		  {
		    partitions [partitions_used].sector = i * ((128 _MB) / 512);
		    partitions [partitions_used].size_in_mb = 128;
		    ++partitions_used;
		    optimize_partitions (partitions, &partitions_used, max_part_size_in_mb);

		    free_entry_found = 1;
		    break;
		  }
	      result = free_entry_found ? RET_OK : RET_NO_SPACE;
	    }
	  else
	    result = RET_OK;

	  if (result == RET_OK)
	    { /* create new partitions in the partition table */
	      ps2_partition_header_t part;
	      u_int32_t last_partition_start =
		table->part_count > 0 ?
		get_u32 (&table->parts [table->part_count - 1].header.start) : 0;

	      if (decreasing_size)
		sort_partitions (partitions, partitions_used);

	      /* current last partition would be remapped by normalize */
	      setup_main_part (&part, partition_name, partitions, partitions_used,
			       last_partition_start);
	      result = apa_part_add (table, &part, 0, 1);
	      for (i=1; result == RET_OK && i<partitions_used; ++i)
		{
		  setup_sub_part (&part, i, partitions, partitions_used);
		  result = apa_part_add (table, &part, 0, 1);
		}
	      if (result == RET_OK)
		{
		  normalize_linked_list (table);
		  *new_partition_start = partitions [0].sector;
		}
	    }
	  osal_free (partitions);
	}
      else
	result = RET_NO_MEM; /* out-of-memory */
    }
  else
    result = RET_NO_SPACE; /* not enough free space */

  return (result);
}


/**************************************************************/
int
apa_delete_partition (apa_partition_table_t *table,
		      const char *partition_name)
{
  u_int32_t partition_index;
  int result = apa_find_partition (table, partition_name, &partition_index);
  if (result == RET_OK)
    {
      u_int32_t i, count = 1;
      u_int32_t pending_deletes [PS2_PART_MAXSUB]; /* starting sectors of parts pending delete */
      const ps2_partition_header_t *part = &table->parts [partition_index].header;

      if (get_u16 (&part->type) == 1)
	return (RET_NOT_ALLOWED); /* deletion of system partitions is not allowed */

      /* preserve a list of partitions to be deleted */
      pending_deletes [0] = get_u32 (&part->start);
      for (i=0; i<get_u32 (&part->nsub); ++i)
	pending_deletes [count++] = get_u32 (&part->subs [i].start);

      /* remove partitions from the double-linked list */
      i = 0;
      while (i < table->part_count)
	{
	  u_int32_t j;
	  int found = 0;
	  for (j=0; j<count; ++j)
	    if (get_u32 (&table->parts [i].header.start) == pending_deletes [j])
	      {
		found = 1;
		break;
	      }
	  if (found)
	    { /* remove this partition */
	      u_int32_t part_no = get_u32 (&table->parts [i].header.start) / 262144; /* 262144 sectors == 128M */
	      u_int32_t num_parts = get_u32 (&table->parts [i].header.length) / 262144;

	      memmove (table->parts + i, table->parts + i + 1,
		       sizeof (apa_partition_t) * (table->part_count - i - 1));
	      --table->part_count;

	      /* "free" num_parts starting at part_no */
	      while (num_parts)
		{
		  table->chunks_map [part_no] = MAP_AVAIL;
		  ++part_no;
		  --num_parts;
		  --table->allocated_chunks;
		  ++table->free_chunks;
		}
	    }
	  else
	    ++i;
	}

      normalize_linked_list (table);
    }
  return (result);
}


/**************************************************************/
int
apa_commit (const char *path,
	    const apa_partition_table_t *table)
{
  int result = apa_check (table);
  if (result == RET_OK)
    {
      hio_t *hio;
      result = hio_probe (path, &hio);
      if (result == OSAL_OK)
	{
	  result = apa_commit_ex (hio, table);
	  result = hio->close (hio) == OSAL_OK ? result : OSAL_ERR;
	}
    }
  return (result);
}


/**************************************************************/
int
apa_commit_ex (hio_t *hio,
	       const apa_partition_table_t *table)
{
  int result = apa_check (table);
  if (result == RET_OK)
    {
      u_int32_t i;
      for (i=0; result == RET_OK && i<table->part_count; ++i)
	{
	  if (table->parts [i].modified)
	    {
	      u_int32_t bytes;
	      const ps2_partition_header_t *part = &table->parts [i].header;
	      result = hio->write (hio, get_u32 (&part->start),
				   sizeof (*part) / 512, part, &bytes);
	      if (result == OSAL_OK)
		result = bytes == sizeof (ps2_partition_header_t) ? OSAL_OK : RET_ERR;
	    }
	}
    }
  return (result);
}


/**************************************************************/
#define ADD_PROBLEM(buff,size,problem,len) \
  if ((len) < (size))			   \
    {					   \
      memcpy (buff, problem, len);	   \
      (size) -= (len);			   \
      (buff) += (len);			   \
       *(buff) = '\0';			   \
    }

static int
apa_list_problems (const apa_partition_table_t *table,
		   char *buffer,
		   size_t buffer_size)
{ /* NOTE: keep in sync with apa_check */
  u_int32_t i, j, k;
  char tmp [1024];
  size_t len;

  const u_int32_t total_sectors = table->device_size_in_mb * 1024 * 2;

  *buffer = '\0';
  for (i=0; i<table->part_count; ++i)
    {
      const ps2_partition_header_t *part = &table->parts [i].header;
      u_int32_t checksum = apa_partition_checksum (part);
      if (get_u32 (&part->checksum) != checksum)
	{
	  len = sprintf (tmp, "%06lx00: bad checksum: 0x%08lx instead of 0x%08lx;\n",
			 (unsigned long) (get_u32 (&part->start) >> 8),
			 (unsigned long) get_u32 (&part->checksum),
			 (unsigned long) checksum);
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
	}

      if (get_u32 (&part->start) < total_sectors &&
	  get_u32 (&part->start) + get_u32 (&part->length) <= total_sectors)
	;
      else
	{
#if defined (LIMIT_HDD_TO_128GB)
	  len = sprintf (tmp, "%06lx00 +%06lx00: across 128GB mark;\n",
			 (unsigned long) (get_u32 (&part->start) >> 8),
			 (unsigned long) (get_u32 (&part->length) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
#else
	  len = sprintf (tmp, "%06lx00 +%06lx00: outside HDD data area;\n",
			 (unsigned long) (get_u32 (&part->start) >> 8),
			 (unsigned long) (get_u32 (&part->length) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
#endif
	}

      if ((get_u32 (&part->length) % ((128 _MB) / 512)) != 0)
	{
	  len = sprintf (tmp, "%06lx00: size %06lx00 not multiple to 128MB;\n",
			 (unsigned long) (get_u32 (&part->start) >> 8),
			 (unsigned long) (get_u32 (&part->length) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
	}

      if ((get_u32 (&part->start) % get_u32 (&part->length)) != 0)
	{
	  len = sprintf (tmp, "%06lx00: start not multiple to size %06lx00;\n",
			 (unsigned long) (get_u32 (&part->start) >> 8),
			 (unsigned long) (get_u32 (&part->length) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
	}

      if (get_u32 (&part->main) == 0 &&
	  get_u16 (&part->flags) == 0 &&
	  get_u32 (&part->start) != 0)
	{ /* check sub-partitions */
	  u_int32_t count = 0;
	  for (j=0; j<table->part_count; ++j)
	    {
	      const ps2_partition_header_t *part2 = &table->parts [j].header;
	      if (get_u32 (&part2->main) == get_u32 (&part->start))
		{ /* sub-partition of current main partition */
		  int found;
		  if (get_u16 (&part2->flags) != PS2_PART_FLAG_SUB)
		    {
		      len = sprintf (tmp, "%06lx00: mismatching sub-partition flag;\n",
				     (unsigned long) (get_u32 (&part2->start) >> 8));
		      ADD_PROBLEM (buffer, buffer_size, tmp, len);
		    }

		  found = 0;
		  for (k=0; k<get_u32 (&part->nsub); ++k)
		    if (get_u32 (&part->subs [k].start) == get_u32 (&part2->start))
		      { /* in list */
			if (get_u32 (&part->subs [k].length) != get_u32 (&part2->length))
			  {
			    len = sprintf (tmp, "%06lx00: mismatching sub-partition size: %06lx00 != %06lx00;\n",
					   (unsigned long) (get_u32 (&part2->start) >> 8),
					   (unsigned long) (get_u32 (&part2->length) >> 8),
					   (unsigned long) (get_u32 (&part->subs [k].length) >> 8));
			    ADD_PROBLEM (buffer, buffer_size, tmp, len);
			  }
			found = 1;
			break;
		      }
		  if (!found)
		    {
		      len = sprintf (tmp, "%06lx00: not a sub-partition of %06lx00;\n",
				     (unsigned long) (get_u32 (&part2->start) >> 8),
				     (unsigned long) (get_u32 (&part->start) >> 8));
		      ADD_PROBLEM (buffer, buffer_size, tmp, len);
		    }

		  ++count;
		}
	    }
	  if (count != get_u32 (&part->nsub))
	    {
	      len = sprintf (tmp, "%06lx00: only %u sub-partitions found of %u;\n",
			     (unsigned long) (get_u32 (&part->start) >> 8),
			     (unsigned int) count, (unsigned int) get_u32 (&part->nsub));
	      ADD_PROBLEM (buffer, buffer_size, tmp, len);
	    }
	}
    }

  /* verify double-linked list */
  for (i=0; i<table->part_count; ++i)
    {
      apa_partition_t *prev = table->parts + (i > 0 ? i - 1 : table->part_count - 1);
      apa_partition_t *curr = table->parts + i;
      apa_partition_t *next = table->parts + (i + 1 < table->part_count ? i + 1 : 0);
      if (get_u32 (&curr->header.prev) != get_u32 (&prev->header.start))
	{
	  len = sprintf (tmp, "%06lx00: %06lx00 is previous, not %06lx00;\n",
			 (unsigned long) (get_u32 (&curr->header.start) >> 8),
			 (unsigned long) (get_u32 (&prev->header.start) >> 8),
			 (unsigned long) (get_u32 (&curr->header.prev) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
	}
      if (get_u32 (&curr->header.next) != get_u32 (&next->header.start))
	{
	  len = sprintf (tmp, "%06lx00: %06lx00 is next, not %06lx00;\n",
			 (unsigned long) (get_u32 (&curr->header.start) >> 8),
			 (unsigned long) (get_u32 (&next->header.start) >> 8),
			 (unsigned long) (get_u32 (&curr->header.next) >> 8));
	  ADD_PROBLEM (buffer, buffer_size, tmp, len);
	}
	return (RET_BAD_APA); /* bad links */
    }

  return (RET_OK);
}


/**************************************************************/
static int
apa_check (const apa_partition_table_t *table)
{ /* NOTE: keep in sync with apa_list_problems */
  u_int32_t i, j, k;

  const u_int32_t total_sectors = table->device_size_in_mb * 1024 * 2;

  for (i=0; i<table->part_count; ++i)
    {
      const ps2_partition_header_t *part = &table->parts [i].header;
      if (get_u32 (&part->checksum) != apa_partition_checksum (part))
	return (RET_BAD_APA); /* bad checksum */

      if (get_u32 (&part->start) < total_sectors &&
	  get_u32 (&part->start) + get_u32 (&part->length) <= total_sectors)
	;
      else
	{
#if defined (LIMIT_HDD_TO_128GB)
	  return (RET_CROSS_128GB); /* data behind 128GB mark */
#else
	  return (RET_BAD_APA); /* data behind end-of-HDD */
#endif
	}

      if ((get_u32 (&part->length) % ((128 _MB) / 512)) != 0)
	return (RET_BAD_APA); /* partition size not multiple to 128MB */

      if ((get_u32 (&part->start) % get_u32 (&part->length)) != 0)
	return (RET_BAD_APA); /* partition start not multiple on partition size */

      if (get_u32 (&part->main) == 0 &&
	  get_u16 (&part->flags) == 0 &&
	  get_u32 (&part->start) != 0)
	{ /* check sub-partitions */
	  u_int32_t count = 0;
	  for (j=0; j<table->part_count; ++j)
	    {
	      const ps2_partition_header_t *part2 = &table->parts [j].header;
	      if (get_u32 (&part2->main) == get_u32 (&part->start))
		{ /* sub-partition of current main partition */
		  int found;
		  if (get_u16 (&part2->flags) != PS2_PART_FLAG_SUB)
		    return (RET_BAD_APA);

		  found = 0;
		  for (k=0; k<get_u32 (&part->nsub); ++k)
		    if (get_u32 (&part->subs [k].start) == get_u32 (&part2->start))
		      { /* in list */
			if (get_u32 (&part->subs [k].length) != get_u32 (&part2->length))
			  return (RET_BAD_APA);
			found = 1;
			break;
		      }
		  if (!found)
		    return (RET_BAD_APA); /* not found in the list */

		  ++count;
		}
	    }
	  if (count != get_u32 (&part->nsub))
	    return (RET_BAD_APA); /* wrong number of sub-partitions */
	}
    }

  /* verify double-linked list */
  for (i=0; i<table->part_count; ++i)
    {
      apa_partition_t *prev = table->parts + (i > 0 ? i - 1 : table->part_count - 1);
      apa_partition_t *curr = table->parts + i;
      apa_partition_t *next = table->parts + (i + 1 < table->part_count ? i + 1 : 0);
      if (get_u32 (&curr->header.prev) != get_u32 (&prev->header.start) ||
	  get_u32 (&curr->header.next) != get_u32 (&next->header.start))
	return (RET_BAD_APA); /* bad links */
    }

  return (RET_OK);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人看片黄a免费看在线| 美女视频一区二区三区| 色噜噜狠狠成人中文综合| 日韩一区在线看| 色网站国产精品| 午夜精品福利一区二区蜜股av| 欧美视频日韩视频| 麻豆成人免费电影| 久久久久久久综合| 成人av资源在线观看| 一区二区三区四区乱视频| 欧美日韩一卡二卡三卡| 青娱乐精品在线视频| 久久精品人人做人人综合| 99精品热视频| 亚洲成人动漫在线免费观看| 精品国产乱码久久久久久浪潮 | 色噜噜狠狠色综合中国| 亚洲香蕉伊在人在线观| 制服丝袜av成人在线看| 国产一区在线观看麻豆| 亚洲色图一区二区| 欧美另类久久久品| 国产精品888| 午夜一区二区三区视频| xvideos.蜜桃一区二区| 91久久线看在观草草青青| 日本麻豆一区二区三区视频| 国产精品欧美精品| 91精品国产乱| av电影在线观看一区| 亚洲国产一区二区在线播放| 久久亚洲一区二区三区明星换脸| 99re亚洲国产精品| 麻豆国产精品一区二区三区| 亚洲免费在线观看视频| 久久久亚洲欧洲日产国码αv| 91碰在线视频| 国产一区二区成人久久免费影院 | 粉嫩在线一区二区三区视频| 亚洲综合免费观看高清在线观看| 久久久青草青青国产亚洲免观| 在线中文字幕一区二区| 国产91精品欧美| 蜜桃av一区二区三区| 亚洲视频综合在线| 久久精品免费在线观看| 日韩一区二区三区电影在线观看 | 欧美日韩精品一区二区在线播放| 国产精品1区2区3区| 午夜欧美2019年伦理| 国产精品国产三级国产aⅴ入口| 欧美一级高清大全免费观看| 在线免费观看一区| 99国内精品久久| 国产精品综合在线视频| 免费成人在线播放| 五月天亚洲精品| 一区二区成人在线| 国产精品短视频| 欧美国产日韩亚洲一区| 精品国产乱码久久久久久闺蜜| 欧美亚洲愉拍一区二区| 99re亚洲国产精品| k8久久久一区二区三区 | 国产一区二区影院| 美女网站一区二区| 麻豆成人91精品二区三区| 亚洲成av人在线观看| 一区二区免费看| 亚洲免费观看高清完整版在线观看熊| 国产日韩欧美激情| 精品国产伦一区二区三区免费| 91精品久久久久久久久99蜜臂| 欧美日韩三级一区| 欧美喷水一区二区| 欧美年轻男男videosbes| 欧美亚洲国产一区二区三区va | 国产婷婷精品av在线| 精品国产免费久久| 国产欧美日韩三级| 中文字幕日韩一区| 一区二区在线免费| 香蕉影视欧美成人| 婷婷开心激情综合| 六月丁香综合在线视频| 经典三级在线一区| 国产91精品在线观看| 99久久久精品免费观看国产蜜| 99精品视频在线免费观看| 91蝌蚪porny| 欧美顶级少妇做爰| 欧美mv日韩mv国产网站app| 337p日本欧洲亚洲大胆精品| 欧美激情一二三区| 亚洲综合无码一区二区| 午夜精品福利一区二区三区av| 蜜臀av一区二区在线观看| 国产在线视频一区二区三区| 国产91丝袜在线播放| 日本高清成人免费播放| 在线播放一区二区三区| 欧美精品一区视频| 一区二区三区.www| 美国毛片一区二区| av综合在线播放| 欧美日韩久久久一区| 精品日韩一区二区三区免费视频| 国产午夜亚洲精品理论片色戒| 亚洲人成7777| 免费在线视频一区| 不卡视频在线观看| 91精品国产欧美日韩| 中文一区一区三区高中清不卡| 亚洲精品视频在线观看免费| 老司机精品视频导航| 成人久久18免费网站麻豆| 在线亚洲人成电影网站色www| 日韩免费电影一区| 综合自拍亚洲综合图不卡区| 日韩高清一区二区| av亚洲精华国产精华| 日韩小视频在线观看专区| 中文字幕巨乱亚洲| 日本一不卡视频| 95精品视频在线| 精品剧情在线观看| 亚洲电影视频在线| 成人黄色av网站在线| 日韩精品中文字幕在线一区| 亚洲精品成人少妇| 国产精品一二三区在线| 7777精品伊人久久久大香线蕉超级流畅 | 日韩中文字幕一区二区三区| 国产精品资源在线| 欧美一区二区不卡视频| 亚洲精品少妇30p| 福利一区二区在线| 日韩美女视频一区二区在线观看| 亚洲欧美视频一区| 成人黄色一级视频| 久久久久久99精品| 精品一区二区三区在线观看国产| 91行情网站电视在线观看高清版| 国产欧美视频在线观看| 九九**精品视频免费播放| 欧美卡1卡2卡| 亚洲一区二区三区视频在线播放| www.亚洲色图.com| 中文字幕 久热精品 视频在线| 激情亚洲综合在线| 日韩一区二区精品葵司在线| 亚洲一区二区四区蜜桃| 色天天综合色天天久久| 综合久久给合久久狠狠狠97色 | wwwwww.欧美系列| 免费日韩伦理电影| 欧美日韩高清一区二区| 亚洲国产视频一区二区| 91福利区一区二区三区| 亚洲免费观看高清完整版在线观看| 99视频精品免费视频| 国产欧美一区二区精品忘忧草| 国产高清精品久久久久| 国产欧美1区2区3区| 极品销魂美女一区二区三区| 日韩欧美黄色影院| 国模一区二区三区白浆| 国产日产欧产精品推荐色| 国产91精品入口| 国产精品久久久久久一区二区三区 | 91蜜桃婷婷狠狠久久综合9色| 国产精品久久久久国产精品日日| 成人av电影在线播放| 成人免费在线观看入口| 91丝袜美腿高跟国产极品老师| 中文字幕中文字幕一区二区| 99国产精品一区| 亚洲精品高清在线观看| 欧美男人的天堂一二区| 美女一区二区三区| 久久精品一区二区三区不卡| 成人免费高清在线观看| 亚洲精品高清视频在线观看| 欧美日韩视频在线第一区| 蜜桃视频一区二区| 亚洲国产精品精华液ab| 91在线丨porny丨国产| 亚洲丶国产丶欧美一区二区三区| 欧美丰满美乳xxx高潮www| 国产在线播放一区二区三区| 国产日本欧美一区二区| 色又黄又爽网站www久久| 日韩av高清在线观看| 久久亚洲综合色| 一道本成人在线| 免费国产亚洲视频| 中文字幕中文字幕在线一区 | 欧美一区二区三区视频在线观看| 久久精品免费观看|