lt 1 год назад
Родитель
Сommit
23a868c12b

+ 72 - 2
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config.go

@@ -638,6 +638,10 @@ var HardMissionTaskList = map[uint32]*HardMissionTaskData{}
 var HardMissionTaskIdList []uint32
 var HardMissionTaskIdList []uint32
 var HardGroupMissionTaskList = map[uint32]*HardMissionTaskData{}
 var HardGroupMissionTaskList = map[uint32]*HardMissionTaskData{}
 var HardGroupMissionTaskIdList []uint32
 var HardGroupMissionTaskIdList []uint32
+var Hard2MissionTaskList = map[uint32]*HardMissionTaskData{}
+var Hard2MissionTaskIdList []uint32
+var Hard2GroupMissionTaskList = map[uint32]*HardMissionTaskData{}
+var Hard2GroupMissionTaskIdList []uint32
 var ConvertMainTaskOriginalList = map[uint32]uint32{} //[taskid,originaltask]
 var ConvertMainTaskOriginalList = map[uint32]uint32{} //[taskid,originaltask]
 var ConvertDailyTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
 var ConvertDailyTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
 var ConvertWeekTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
 var ConvertWeekTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
@@ -650,8 +654,10 @@ const (
 	TASK_TYPE_TODAY  = 4
 	TASK_TYPE_TODAY  = 4
 	TASK_TYPE_GROWUP = 5
 	TASK_TYPE_GROWUP = 5
 
 
-	TASK_TYPE_HARD       = 6
-	TASK_TYPE_HARD_GROUP = 7
+	TASK_TYPE_HARD        = 6
+	TASK_TYPE_HARD_GROUP  = 7
+	TASK_TYPE_HARD2       = 8
+	TASK_TYPE_HARD2_GROUP = 9
 )
 )
 
 
 func convertTaskCfg() {
 func convertTaskCfg() {
@@ -781,6 +787,70 @@ func convertTaskCfg() {
 	sort.Slice(HardGroupMissionTaskIdList, func(i, j int) bool {
 	sort.Slice(HardGroupMissionTaskIdList, func(i, j int) bool {
 		return HardGroupMissionTaskIdList[i] < HardGroupMissionTaskIdList[j]
 		return HardGroupMissionTaskIdList[i] < HardGroupMissionTaskIdList[j]
 	})
 	})
+
+	for _, data := range serverproto.Hard2MissionCfgLoader {
+		convertData := &HardMissionTaskData{
+			TaskId:      uint32(data.MissionID),
+			TaskType:    TASK_TYPE_HARD2,
+			GroupTaskId: uint32(data.GroupID),
+			Condition:   map[int32][]int32{},
+		}
+
+		//任务条件
+		for index, _ := range data.MissionCondition {
+			valueList := strings.Split(data.MissionCondition[index], ":")
+			if len(valueList) >= 2 {
+				taskType, _ := Str2Num(valueList[0])
+				convertData.Condition[int32(taskType)] = append(convertData.Condition[int32(taskType)], int32(taskType))
+				for i := 1; i < len(valueList); i++ {
+					taskValue, _ := Str2Num(valueList[i])
+					convertData.Condition[int32(taskType)] = append(convertData.Condition[int32(taskType)], int32(taskValue))
+				}
+			}
+		}
+
+		//任务奖励
+		for index, _ := range data.Reward {
+			key, value := Str2Res(data.Reward[index])
+			convertData.TaskReward = append(convertData.TaskReward, &serverproto.KeyValueType{
+				Key:   key,
+				Value: value,
+			})
+		}
+
+		for index, _ := range data.GroupReward {
+			key2, value2 := Str2Res(data.GroupReward[index])
+			convertData.GroupTaskReward = append(convertData.GroupTaskReward, &serverproto.KeyValueType{
+				Key:   key2,
+				Value: value2,
+			})
+		}
+		if convertData.TaskType == TASK_TYPE_HARD2 {
+			Hard2MissionTaskIdList = append(Hard2MissionTaskIdList, convertData.TaskId)
+			Hard2MissionTaskList[convertData.TaskId] = convertData
+		}
+		//util.InfoF("groupaward:%v", data.GroupReward)
+		if len(data.GroupReward) > 0 && data.GroupReward[0] != "" {
+			data2 := &HardMissionTaskData{
+				TaskId:          convertData.TaskId,
+				TaskType:        TASK_TYPE_HARD2_GROUP,
+				GroupTaskId:     convertData.GroupTaskId,
+				Condition:       convertData.Condition,
+				TaskReward:      convertData.TaskReward,
+				GroupTaskReward: convertData.GroupTaskReward,
+			}
+			//convertData.TaskId = uint32(data.GroupID)
+			Hard2GroupMissionTaskIdList = append(Hard2GroupMissionTaskIdList, convertData.GroupTaskId)
+			Hard2GroupMissionTaskList[convertData.GroupTaskId] = data2
+			//util.InfoF("groupaward:%v len:%v", convertData, len(data.GroupReward))
+		}
+	}
+	sort.Slice(Hard2MissionTaskIdList, func(i, j int) bool {
+		return Hard2MissionTaskIdList[i] < Hard2MissionTaskIdList[j]
+	})
+	sort.Slice(Hard2GroupMissionTaskIdList, func(i, j int) bool {
+		return Hard2GroupMissionTaskIdList[i] < Hard2GroupMissionTaskIdList[j]
+	})
 	//util.InfoF("len taskId:%v,len task group:%v", len(HardMissionTaskIdList), len(HardGroupMissionTaskIdList))
 	//util.InfoF("len taskId:%v,len task group:%v", len(HardMissionTaskIdList), len(HardGroupMissionTaskIdList))
 	//util.InfoF("task group:%v", HardGroupMissionTaskIdList)
 	//util.InfoF("task group:%v", HardGroupMissionTaskIdList)
 	for _, data := range serverproto.LineMissionCfgLoader {
 	for _, data := range serverproto.LineMissionCfgLoader {

+ 1 - 1
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config_global.go

@@ -720,7 +720,7 @@ func convertGlobalCfg() {
 	}
 	}
 
 
 	GlobalGuildKickMemberCount = getGlobalCfgValI(serverproto.GlobalType_Global_Guild_Kick_Max_Count)
 	GlobalGuildKickMemberCount = getGlobalCfgValI(serverproto.GlobalType_Global_Guild_Kick_Max_Count)
-
+	// 0 ,299 ,19999 ,59999
 	GlobalTotalRechargeList = []*serverproto.KeyValueType{}
 	GlobalTotalRechargeList = []*serverproto.KeyValueType{}
 	tmpStrList = strings.Split(getGlobalCfgValS(serverproto.GlobalType_Global_TotalRecharge_List), ";")
 	tmpStrList = strings.Split(getGlobalCfgValS(serverproto.GlobalType_Global_TotalRecharge_List), ";")
 	for idx := 0; idx < len(tmpStrList); idx++ {
 	for idx := 0; idx < len(tmpStrList); idx++ {

+ 2 - 0
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/orm_common.go

@@ -37,6 +37,8 @@ const (
 	MapRankPrefix = "rank:map"
 	MapRankPrefix = "rank:map"
 	//困难地图通关进度排名
 	//困难地图通关进度排名
 	MapHardRankPrefix = "rank_hard:map"
 	MapHardRankPrefix = "rank_hard:map"
+	//噩梦地图通关进度排名
+	MapHard2RankPrefix = "rank_hard2:map"
 	//历史最大战力
 	//历史最大战力
 	MaxFightPowerRankPrefix = "rank:fight"
 	MaxFightPowerRankPrefix = "rank:fight"
 
 

+ 6 - 6
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role.go

@@ -55,8 +55,8 @@ type RoleOuter interface {
 	GetClientParam() *NeteaseLogCommonInfo
 	GetClientParam() *NeteaseLogCommonInfo
 	SetClientIP(ip string)
 	SetClientIP(ip string)
 	GetClientIP() string
 	GetClientIP() string
-	GetHardFight() bool
-	SetHardFight(b bool)
+	GetHardFight() int
+	SetHardFight(b int)
 	SetYuanRankScore()
 	SetYuanRankScore()
 }
 }
 
 
@@ -498,7 +498,7 @@ type Role struct {
 	reLogin      bool                                //是否是重新登陆
 	reLogin      bool                                //是否是重新登陆
 	isLoad       bool                                //是否已经加载过
 	isLoad       bool                                //是否已经加载过
 	activeCode   string                              //激活码
 	activeCode   string                              //激活码
-	isHardFight  bool                                //是否是困难模式
+	isHardFight  int                                 //是否是困难模式 //0普通.1困难,2噩梦
 
 
 	base            *RoleBase    //角色基础信息
 	base            *RoleBase    //角色基础信息
 	roleHero        *RoleHero    //伙伴信息
 	roleHero        *RoleHero    //伙伴信息
@@ -672,7 +672,7 @@ func (this *Role) GetOpenId() string {
 	return this.openId
 	return this.openId
 }
 }
 
 
-func (this *Role) GetHardFight() bool {
+func (this *Role) GetHardFight() int {
 	return this.isHardFight
 	return this.isHardFight
 }
 }
 func (this *Role) SetSelectZone(selectZone int32) {
 func (this *Role) SetSelectZone(selectZone int32) {
@@ -689,7 +689,7 @@ func (this *Role) SetPlatform(platform string) {
 	this.platform = platform
 	this.platform = platform
 }
 }
 
 
-func (this *Role) SetHardFight(b bool) {
+func (this *Role) SetHardFight(b int) {
 	this.isHardFight = b
 	this.isHardFight = b
 }
 }
 func (this *Role) SetYuanRankScore() {
 func (this *Role) SetYuanRankScore() {
@@ -811,7 +811,7 @@ func (this *Role) SetSelectUUid(id uint64) {
 func (this *Role) SetReLogin(re bool) {
 func (this *Role) SetReLogin(re bool) {
 	this.reLogin = re
 	this.reLogin = re
 	if re {
 	if re {
-		this.isHardFight = false
+		this.isHardFight = 0
 	}
 	}
 }
 }
 func (this *Role) GetRoleBase() *RoleBase {
 func (this *Role) GetRoleBase() *RoleBase {

+ 139 - 15
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role_battle.go

@@ -249,6 +249,8 @@ type RoleBattle struct {
 	mapId          uint32
 	mapId          uint32
 	mapLevelHard   uint32 //困难模式
 	mapLevelHard   uint32 //困难模式
 	mapIdHard      uint32 //困难模式
 	mapIdHard      uint32 //困难模式
+	mapLevelHard2  uint32 //噩梦模式
+	mapIdHard2     uint32 //噩梦模式
 	mapRewardCount uint32 //累计的挑战boss成功次数
 	mapRewardCount uint32 //累计的挑战boss成功次数
 	mapRewardId    uint32
 	mapRewardId    uint32
 	mapRewardLevel uint32
 	mapRewardLevel uint32
@@ -262,6 +264,9 @@ type RoleBattle struct {
 	selfHardRank             uint32
 	selfHardRank             uint32
 	totalHardRanks           uint32
 	totalHardRanks           uint32
 	topHardRankList          []*serverproto.RankPlayerInfo
 	topHardRankList          []*serverproto.RankPlayerInfo
+	selfHard2Rank            uint32
+	totalHard2Ranks          uint32
+	topHard2RankList         []*serverproto.RankPlayerInfo
 	getRankTimeStamp         int64
 	getRankTimeStamp         int64
 	mapLevelChallengeNumList []*serverproto.KeyValueType
 	mapLevelChallengeNumList []*serverproto.KeyValueType
 
 
@@ -326,6 +331,8 @@ func (this *RoleBattle) Load(msg interface{}) bool {
 		this.mapId = proRole.RoleBattle.MapId
 		this.mapId = proRole.RoleBattle.MapId
 		this.mapLevelHard = proRole.RoleBattle.MapLevelHard
 		this.mapLevelHard = proRole.RoleBattle.MapLevelHard
 		this.mapIdHard = proRole.RoleBattle.MapIdHard
 		this.mapIdHard = proRole.RoleBattle.MapIdHard
+		this.mapLevelHard2 = proRole.RoleBattle.MapLevelHard2
+		this.mapIdHard2 = proRole.RoleBattle.MapIdHard2
 		//累计的挑战boss成功次数
 		//累计的挑战boss成功次数
 		this.mapRewardCount = proRole.RoleBattle.RewardMapCount
 		this.mapRewardCount = proRole.RoleBattle.RewardMapCount
 		this.mapRewardId = proRole.RoleBattle.RewardMapId
 		this.mapRewardId = proRole.RoleBattle.RewardMapId
@@ -350,6 +357,11 @@ func (this *RoleBattle) Load(msg interface{}) bool {
 			this.mapIdHard = 1
 			this.mapIdHard = 1
 			this.SetDirty(true)
 			this.SetDirty(true)
 		}
 		}
+		if this.mapLevelHard2 == 0 || this.mapIdHard2 == 0 {
+			this.mapLevelHard2 = 1
+			this.mapIdHard2 = 1
+			this.SetDirty(true)
+		}
 		//if this.mapRewardIdHard == 0 || this.mapRewardLevelHard == 0 {
 		//if this.mapRewardIdHard == 0 || this.mapRewardLevelHard == 0 {
 		//	this.mapRewardIdHard = 1
 		//	this.mapRewardIdHard = 1
 		//	this.mapRewardLevelHard = 1
 		//	this.mapRewardLevelHard = 1
@@ -488,7 +500,9 @@ func (this *RoleBattle) Save() {
 			LastRecordBattleAcceTime: this.lastRecordBattleAcceTime,
 			LastRecordBattleAcceTime: this.lastRecordBattleAcceTime,
 			BattleAcceDuration:       this.battleAcceDuration,
 			BattleAcceDuration:       this.battleAcceDuration,
 			MapIdHard:                this.mapIdHard,
 			MapIdHard:                this.mapIdHard,
+			MapIdHard2:               this.mapIdHard2,
 			MapLevelHard:             this.mapLevelHard,
 			MapLevelHard:             this.mapLevelHard,
+			MapLevelHard2:            this.mapLevelHard2,
 			//todo...
 			//todo...
 			//MapChallengeNumList: this.mapLevelChallengeNumList, 数据太大后续做优化处理
 			//MapChallengeNumList: this.mapLevelChallengeNumList, 数据太大后续做优化处理
 		},
 		},
@@ -635,10 +649,14 @@ func (this *RoleBattle) changeBattleDataNtf() {
 		QuickBattle:    this.quickBattle,
 		QuickBattle:    this.quickBattle,
 		RewardMapCount: this.getMapRewardShowCount(),
 		RewardMapCount: this.getMapRewardShowCount(),
 	}
 	}
-	if this.role.GetHardFight() {
+	if this.role.GetHardFight() == 1 {
 		ntfMsg.MapId = this.mapIdHard
 		ntfMsg.MapId = this.mapIdHard
 		ntfMsg.MapLevel = this.mapLevelHard
 		ntfMsg.MapLevel = this.mapLevelHard
 	}
 	}
+	if this.role.GetHardFight() == 2 {
+		ntfMsg.MapId = this.mapIdHard2
+		ntfMsg.MapLevel = this.mapLevelHard2
+	}
 	this.role.ReplayGate(ntfMsg, true)
 	this.role.ReplayGate(ntfMsg, true)
 }
 }
 
 
@@ -651,11 +669,18 @@ func (this *RoleBattle) changeQuickBattleNtf(errorCode int32, itemList []*server
 }
 }
 
 
 func (this *RoleBattle) SetMapRank(selfRank, totalRanks uint32, topRankList []*serverproto.RankPlayerInfo, addSystemMsg bool) {
 func (this *RoleBattle) SetMapRank(selfRank, totalRanks uint32, topRankList []*serverproto.RankPlayerInfo, addSystemMsg bool) {
-	if this.role.isHardFight {
+	if this.role.isHardFight == 1 {
 		this.selfHardRank = selfRank
 		this.selfHardRank = selfRank
 		this.totalHardRanks = totalRanks
 		this.totalHardRanks = totalRanks
 		this.topHardRankList = topRankList
 		this.topHardRankList = topRankList
 
 
+		//刚打完战斗时,会回调并设置,这边需要重新设置时间
+		this.getRankTimeStamp = util.GetTimeSeconds()
+	} else if this.role.isHardFight == 2 {
+		this.selfHard2Rank = selfRank
+		this.totalHard2Ranks = totalRanks
+		this.topHard2RankList = topRankList
+
 		//刚打完战斗时,会回调并设置,这边需要重新设置时间
 		//刚打完战斗时,会回调并设置,这边需要重新设置时间
 		this.getRankTimeStamp = util.GetTimeSeconds()
 		this.getRankTimeStamp = util.GetTimeSeconds()
 	} else {
 	} else {
@@ -694,6 +719,13 @@ func (this *RoleBattle) GetPassHardBattleIdNum(passBattleId int32) int32 {
 	return 0
 	return 0
 }
 }
 
 
+func (this *RoleBattle) GetPassHardBattle2IdNum(passBattleId int32) int32 {
+	if this.getLevelId(this.mapIdHard2, this.mapLevelHard2) > passBattleId {
+		return 1
+	}
+	return 0
+}
+
 func (this *RoleBattle) SetIncomeTime(incomeTime uint64) {
 func (this *RoleBattle) SetIncomeTime(incomeTime uint64) {
 	this.incomeTime = incomeTime
 	this.incomeTime = incomeTime
 	this.SetDirty(true)
 	this.SetDirty(true)
@@ -781,7 +813,7 @@ func (this *RoleBattle) addHardMapRank(rewardCount uint32, oldMapId, oldMapLevel
 	dbMsg := &serverproto.SSMapLevelChangeReq{
 	dbMsg := &serverproto.SSMapLevelChangeReq{
 		NewMapLevelId: uint32(NewMapLevelId),
 		NewMapLevelId: uint32(NewMapLevelId),
 		PassTime:      uint64(util.GetTimeMilliseconds()),
 		PassTime:      uint64(util.GetTimeMilliseconds()),
-		IsHard:        true,
+		IsHard:        1,
 	}
 	}
 
 
 	dbMsg.RecordInfo = &serverproto.BattleRecordInfo{
 	dbMsg.RecordInfo = &serverproto.BattleRecordInfo{
@@ -818,6 +850,50 @@ func (this *RoleBattle) addHardMapRank(rewardCount uint32, oldMapId, oldMapLevel
 	this.role.GetRoleBase().SetFightPower(0)
 	this.role.GetRoleBase().SetFightPower(0)
 }
 }
 
 
+// 噩梦模式
+func (this *RoleBattle) addHard2MapRank(rewardCount uint32, oldMapId, oldMapLevel uint32, passTime uint32, recordTimeStamp uint64) {
+	NewMapLevelId := this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
+	oldMapLevelId := this.getLevelId(oldMapId, oldMapLevel)
+	dbMsg := &serverproto.SSMapLevelChangeReq{
+		NewMapLevelId: uint32(NewMapLevelId),
+		PassTime:      uint64(util.GetTimeMilliseconds()),
+		IsHard:        2,
+	}
+
+	dbMsg.RecordInfo = &serverproto.BattleRecordInfo{
+		Uid:            this.role.GetUUid(),
+		BattleRecordId: model.GenerateUid(),
+		NickName:       this.role.GetNickName(),
+		ImgId:          this.role.GetImageId(),
+		Gender:         this.role.GetRoleBase().GetRoleSex(),
+		Level:          this.role.GetRoleLevel(),
+		ConfigId:       this.role.GetRoleBase().RoleData().HeroData.ConfigId,
+		FightPower:     int32(this.role.roleBattleAttr.curTotalFightPower),
+		//FightPower:     int32(this.role.GetRoleFightPower().TotalFightPower),
+		RecordTime:  recordTimeStamp,
+		BattleTime:  passTime,
+		MapLevelId:  oldMapLevelId,
+		HeadFrameId: this.role.GetRoleBase().RoleData().HeadFrameId,
+	}
+	oldLevelCfgData, ok := serverproto.LevelCfgLoader[oldMapLevelId]
+	if ok {
+		dbMsg.RecordInfo.BattleVersion = oldLevelCfgData.Version
+	}
+
+	this.role.SendRank(dbMsg)
+
+	//this.addMapRewardCount(rewardCount)
+
+	//任务处理
+	//TaskMagCheck(this.role, serverproto.TaskType_Level_Battle_Count, 0)
+	//TaskMagCheck(this.role, serverproto.TaskType_Battle_Boss_Reward_Count, 1)
+	TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle2_Count, 0)
+
+	this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
+
+	this.role.GetRoleBase().SetFightPower(0)
+}
+
 // 收益
 // 收益
 func (this *RoleBattle) Income() serverproto.ErrorCode {
 func (this *RoleBattle) Income() serverproto.ErrorCode {
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
@@ -1129,8 +1205,10 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	//}
 	//}
 	isHard := this.role.isHardFight
 	isHard := this.role.isHardFight
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
-	if isHard {
+	if isHard == 1 {
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
+	} else if isHard == 2 {
+		levelId = this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
 	}
 	}
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	if !ok {
 	if !ok {
@@ -1145,10 +1223,12 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	nowTime := util.GetTimeMilliseconds()
 	nowTime := util.GetTimeMilliseconds()
 	oldMapId := this.mapId
 	oldMapId := this.mapId
 	oldMapLevel := this.mapLevel
 	oldMapLevel := this.mapLevel
-	oldHardMapId := this.mapId
-	oldHardMapLevel := this.mapLevel
+	oldHardMapId := this.mapIdHard
+	oldHardMapLevel := this.mapLevelHard
+	oldHard2MapId := this.mapIdHard2
+	oldHard2MapLevel := this.mapLevelHard2
 	var addItemList = map[int32]int32{}
 	var addItemList = map[int32]int32{}
-	if isHard {
+	if isHard == 1 {
 		hardLevelCfgData, ok2 := serverproto.HardLevelCfgLoader[levelId]
 		hardLevelCfgData, ok2 := serverproto.HardLevelCfgLoader[levelId]
 		if !ok2 {
 		if !ok2 {
 			return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_DATA_NOT_FOUND
 			return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_DATA_NOT_FOUND
@@ -1175,6 +1255,29 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 		//for idx := 0; idx < len(dropId); idx++ {
 		//for idx := 0; idx < len(dropId); idx++ {
 		//	this.DropProcess(addItemList, dropId[idx])
 		//	this.DropProcess(addItemList, dropId[idx])
 		//}
 		//}
+	} else if isHard == 2 {
+		hardLevelCfgData, ok2 := serverproto.Hard2LevelCfgLoader[levelId]
+		if !ok2 {
+			return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_DATA_NOT_FOUND
+		}
+		//baseExp
+		addItemList[int32(serverproto.ResType_Res_RoleBaseExp)] = hardLevelCfgData.BaseExp
+		//伙伴经验
+		addItemList[int32(serverproto.ResType_Res_HeroBaseExp)] = hardLevelCfgData.Parter
+		//jobExp
+		addItemList[int32(serverproto.ResType_Res_RoleJobExp)] = hardLevelCfgData.JobExp
+		//rmb
+		addItemList[int32(serverproto.ResType_Res_Rmb)] = hardLevelCfgData.Gold
+		//通关免费充值额度
+		addItemList[int32(serverproto.ResType_Res_CreditRecharge)] = hardLevelCfgData.FreeInvest
+		//cash//做活动时间判定,活动时间内才给
+		if !this.role.FuncDisable() {
+			if ok := CheckHDItemAdd(int32(serverproto.ResType_Res_CashTicket), this.role); ok && (hardLevelCfgData.Cash != 0) {
+				addItemList[int32(serverproto.ResType_Res_CashTicket)] = hardLevelCfgData.Cash
+			}
+		}
+		//coin
+		addItemList[int32(serverproto.ResType_Res_Coin)] = hardLevelCfgData.Zeny
 	} else {
 	} else {
 		//baseExp
 		//baseExp
 		addItemList[int32(serverproto.ResType_Res_RoleBaseExp)] = levelCfgData.BaseExp
 		addItemList[int32(serverproto.ResType_Res_RoleBaseExp)] = levelCfgData.BaseExp
@@ -1213,19 +1316,27 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	_, ok1 := serverproto.LevelCfgLoader[levelId+1]
 	_, ok1 := serverproto.LevelCfgLoader[levelId+1]
 	if !ok1 {
 	if !ok1 {
 		nextLevelId := this.getLevelId(this.mapId+1, 1)
 		nextLevelId := this.getLevelId(this.mapId+1, 1)
-		if isHard {
+		if isHard == 1 {
 			nextLevelId = this.getLevelId(this.mapIdHard+1, 1)
 			nextLevelId = this.getLevelId(this.mapIdHard+1, 1)
+		} else if isHard == 2 {
+			nextLevelId = this.getLevelId(this.mapIdHard2+1, 1)
 		}
 		}
 		_, ok2 := serverproto.LevelCfgLoader[nextLevelId]
 		_, ok2 := serverproto.LevelCfgLoader[nextLevelId]
 		if !ok2 {
 		if !ok2 {
 			util.WarnF("uid=%v BossReward next level cfg data not found!!!", this.role.GetUUid())
 			util.WarnF("uid=%v BossReward next level cfg data not found!!!", this.role.GetUUid())
 		} else {
 		} else {
-			if isHard {
+			if isHard == 1 {
 				this.mapIdHard++
 				this.mapIdHard++
 				this.mapLevelHard = 1
 				this.mapLevelHard = 1
 				//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 				//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 				this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 				this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 				util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard+1, 1)
 				util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard+1, 1)
+			} else if isHard == 2 {
+				this.mapIdHard2++
+				this.mapLevelHard2 = 1
+				//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
+				this.addHard2MapRank(1, oldHard2MapId, oldHard2MapLevel, challengeTime, recordTimeStamp)
+				util.InfoF("uid=%v hard2 BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard2+1, 1)
 			} else {
 			} else {
 				this.mapId++
 				this.mapId++
 				this.mapLevel = 1
 				this.mapLevel = 1
@@ -1239,11 +1350,16 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 			this.changeBattleDataNtf()
 			this.changeBattleDataNtf()
 		}
 		}
 	} else {
 	} else {
-		if isHard {
+		if isHard == 1 {
 			this.mapLevelHard++
 			this.mapLevelHard++
 			//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 			//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 			this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 			this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 			util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard, this.mapLevelHard)
 			util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard, this.mapLevelHard)
+		} else if isHard == 2 {
+			this.mapLevelHard2++
+			//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
+			this.addHardMapRank(1, oldHard2MapId, oldHard2MapLevel, challengeTime, recordTimeStamp)
+			util.InfoF("uid=%v hard2 BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard2, this.mapLevelHard2)
 		} else {
 		} else {
 			this.mapLevel++
 			this.mapLevel++
 			//修改地图通关排名(需要通关该关卡)
 			//修改地图通关排名(需要通关该关卡)
@@ -1321,8 +1437,11 @@ func (this *RoleBattle) bossRewardCheck(challengeTime uint32, mapId, mapLevel ui
 func (this *RoleBattle) mapFightCheck() serverproto.ErrorCode {
 func (this *RoleBattle) mapFightCheck() serverproto.ErrorCode {
 	//战斗力校验
 	//战斗力校验
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
-	if this.role.GetHardFight() {
+	hard := this.role.GetHardFight()
+	if hard == 1 {
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
+	} else if hard == 2 {
+		levelId = this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
 	}
 	}
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	if !ok {
 	if !ok {
@@ -1396,13 +1515,19 @@ func (this *RoleBattle) DropProcess(dropList map[int32]int32, dropId int32) {
 
 
 func (this *RoleBattle) GetMapRank() {
 func (this *RoleBattle) GetMapRank() {
 	nowTime := util.GetTimeSeconds()
 	nowTime := util.GetTimeSeconds()
+	hard := this.role.isHardFight
 	if this.getRankTimeStamp > 0 && (nowTime-this.getRankTimeStamp) < 5 {
 	if this.getRankTimeStamp > 0 && (nowTime-this.getRankTimeStamp) < 5 {
 		ackMsg := &serverproto.SCGetMapRankAck{}
 		ackMsg := &serverproto.SCGetMapRankAck{}
-		if this.role.isHardFight {
+		if hard == 1 {
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.SelfRank = this.selfHardRank
 			ackMsg.SelfRank = this.selfHardRank
 			ackMsg.TotalRank = this.totalHardRanks
 			ackMsg.TotalRank = this.totalHardRanks
 			ackMsg.TopPlayerList = append(this.topHardRankList)
 			ackMsg.TopPlayerList = append(this.topHardRankList)
+		} else if hard == 2 {
+			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
+			ackMsg.SelfRank = this.selfHard2Rank
+			ackMsg.TotalRank = this.totalHard2Ranks
+			ackMsg.TopPlayerList = append(this.topHardRankList)
 		} else {
 		} else {
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.SelfRank = this.selfRank
 			ackMsg.SelfRank = this.selfRank
@@ -1417,9 +1542,8 @@ func (this *RoleBattle) GetMapRank() {
 	this.getRankTimeStamp = nowTime
 	this.getRankTimeStamp = nowTime
 	//重新获取排名
 	//重新获取排名
 	dbMsg := &serverproto.SSMapLevelChangeReq{}
 	dbMsg := &serverproto.SSMapLevelChangeReq{}
-	if this.role.isHardFight {
-		dbMsg.IsHard = true
-	}
+	dbMsg.IsHard = int32(hard)
+
 	this.role.SendRank(dbMsg)
 	this.role.SendRank(dbMsg)
 }
 }
 
 

+ 493 - 22
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role_task.go

@@ -49,12 +49,14 @@ type RoleTask struct {
 	jobCondition []*serverproto.ChangeJob //只针对主角//伙伴转职出案子再做
 	jobCondition []*serverproto.ChangeJob //只针对主角//伙伴转职出案子再做
 	roleHeadCond serverproto.RoleHeadCond
 	roleHeadCond serverproto.RoleHeadCond
 
 
-	taskTypeList         map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
-	dailyTaskList        map[uint32]*serverproto.TaskData
-	weekTaskList         map[uint32]*serverproto.TaskData
-	mainTaskList         map[uint32]*serverproto.TaskData
-	mapHardTaskList      map[uint32]*serverproto.TaskData //困难模式任务
-	mapGroupHardTaskList map[uint32]*serverproto.TaskData //困难模式组任务
+	taskTypeList          map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
+	dailyTaskList         map[uint32]*serverproto.TaskData
+	weekTaskList          map[uint32]*serverproto.TaskData
+	mainTaskList          map[uint32]*serverproto.TaskData
+	mapHardTaskList       map[uint32]*serverproto.TaskData //困难模式任务
+	mapGroupHardTaskList  map[uint32]*serverproto.TaskData //困难模式组任务
+	mapHard2TaskList      map[uint32]*serverproto.TaskData //噩梦模式任务
+	mapGroupHard2TaskList map[uint32]*serverproto.TaskData //噩梦模式组任务
 
 
 	dailyTaskScore serverproto.KeyValueType //活跃度/活跃度对应的奖励,按位处理(完成任务累加的积分)
 	dailyTaskScore serverproto.KeyValueType //活跃度/活跃度对应的奖励,按位处理(完成任务累加的积分)
 	weekTaskScore  serverproto.KeyValueType
 	weekTaskScore  serverproto.KeyValueType
@@ -72,12 +74,14 @@ func newRoleTask(r *Role) *RoleTask {
 		SaveObject: SaveObject{
 		SaveObject: SaveObject{
 			role: r,
 			role: r,
 		},
 		},
-		loadTaskData:         &serverproto.RoleTask{},
-		dailyTaskList:        map[uint32]*serverproto.TaskData{},
-		weekTaskList:         map[uint32]*serverproto.TaskData{},
-		mainTaskList:         map[uint32]*serverproto.TaskData{},
-		mapHardTaskList:      map[uint32]*serverproto.TaskData{},
-		mapGroupHardTaskList: map[uint32]*serverproto.TaskData{},
+		loadTaskData:          &serverproto.RoleTask{},
+		dailyTaskList:         map[uint32]*serverproto.TaskData{},
+		weekTaskList:          map[uint32]*serverproto.TaskData{},
+		mainTaskList:          map[uint32]*serverproto.TaskData{},
+		mapHardTaskList:       map[uint32]*serverproto.TaskData{},
+		mapGroupHardTaskList:  map[uint32]*serverproto.TaskData{},
+		mapHard2TaskList:      map[uint32]*serverproto.TaskData{},
+		mapGroupHard2TaskList: map[uint32]*serverproto.TaskData{},
 
 
 		taskTypeList: map[int32]set.Interface{},
 		taskTypeList: map[int32]set.Interface{},
 		recTypeCnt:   map[int32]*serverproto.KeyValueType{},
 		recTypeCnt:   map[int32]*serverproto.KeyValueType{},
@@ -127,8 +131,12 @@ func (this *RoleTask) Load(msg interface{}) bool {
 					this.mainTaskList[taskInfo.TaskId] = taskInfo
 					this.mainTaskList[taskInfo.TaskId] = taskInfo
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD {
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD {
 					this.mapHardTaskList[taskInfo.TaskId] = taskInfo
 					this.mapHardTaskList[taskInfo.TaskId] = taskInfo
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2 {
+					this.mapHard2TaskList[taskInfo.TaskId] = taskInfo
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
 					this.mapGroupHardTaskList[taskInfo.TaskId] = taskInfo
 					this.mapGroupHardTaskList[taskInfo.TaskId] = taskInfo
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2_GROUP {
+					this.mapGroupHard2TaskList[taskInfo.TaskId] = taskInfo
 				}
 				}
 			}
 			}
 			//util.InfoF("qqqqqq:%v bbbbbb:%v", this.mapHardTaskList, this.mapGroupHardTaskList)
 			//util.InfoF("qqqqqq:%v bbbbbb:%v", this.mapHardTaskList, this.mapGroupHardTaskList)
@@ -214,7 +222,14 @@ func (this *RoleTask) CopyData() *serverproto.RoleTask {
 	for _, val := range this.mapGroupHardTaskList {
 	for _, val := range this.mapGroupHardTaskList {
 		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
 		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
 	}
 	}
-	util.InfoF("send task group:%v task:%v all task:%v", this.mapGroupHardTaskList, this.mapHardTaskList, tmpRoleTask.TaskList)
+	for _, val := range this.mapHard2TaskList {
+		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
+	}
+
+	for _, val := range this.mapGroupHard2TaskList {
+		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
+	}
+	util.DebugF("send task group:%v task:%v all task:%v", this.mapGroupHardTaskList, this.mapHardTaskList, tmpRoleTask.TaskList)
 
 
 	for _, val := range this.recTypeCnt {
 	for _, val := range this.recTypeCnt {
 		tmpRoleTask.TypeRecCount = append(tmpRoleTask.TypeRecCount, val)
 		tmpRoleTask.TypeRecCount = append(tmpRoleTask.TypeRecCount, val)
@@ -399,7 +414,7 @@ func (this *RoleTask) initTaskDataFromConfig() {
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		}
 		}
 	}
 	}
-	util.InfoF("uuid:%v init hard task2:%v", this.role.GetUUid(), this.mapHardTaskList)
+	//util.InfoF("uuid:%v init hard task2:%v", this.role.GetUUid(), this.mapHardTaskList)
 
 
 	var curGroupId uint32
 	var curGroupId uint32
 	if len(this.mapGroupHardTaskList) > 0 {
 	if len(this.mapGroupHardTaskList) > 0 {
@@ -431,10 +446,71 @@ func (this *RoleTask) initTaskDataFromConfig() {
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		}
 		}
 	}
 	}
+	curId = 0
+	if len(this.mapHard2TaskList) > 0 {
+		for _, v := range this.mapHard2TaskList {
+			if curId <= v.TaskId {
+				curId = v.TaskId
+			}
+		}
+	}
+	for _, val := range model.Hard2MissionTaskIdList {
+		//每组任务3个,目前只初始化5组所以是15个任务
+		if len(this.mapHard2TaskList) >= 15 {
+			break
+		}
+		if val < curId {
+			continue
+		}
+		bSave = true
+		data := model.Hard2MissionTaskList[val]
+		if data != nil {
+			taskInfo := &serverproto.TaskData{
+				TaskId: data.TaskId,
+				State:  TASK_REWARD_STATE_NONE,
+				//BeginTime: util.GetTimeMilliseconds(),
+				TaskType: data.TaskType,
+			}
+			this.mapHard2TaskList[data.TaskId] = taskInfo
+			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		}
+	}
+	util.InfoF("uuid:%v init hard2 task2:%v", this.role.GetUUid(), this.mapHard2TaskList)
+
+	curGroupId = 0
+	if len(this.mapGroupHard2TaskList) > 0 {
+		for _, v := range this.mapGroupHard2TaskList {
+			if curGroupId <= v.TaskId {
+				curGroupId = v.TaskId
+			}
+		}
+	}
+	//util.InfoF("uuid:%v init hard task group1:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
+	for _, val := range model.Hard2GroupMissionTaskIdList {
+		//初始化5组 组任务
+		if len(this.mapGroupHard2TaskList) >= 5 {
+			break
+		}
+		if val < curGroupId {
+			continue
+		}
+		bSave = true
+		data := model.Hard2GroupMissionTaskList[val]
+		if data != nil {
+			taskInfo := &serverproto.TaskData{
+				TaskId: data.GroupTaskId,
+				State:  TASK_REWARD_STATE_NONE,
+				//BeginTime: util.GetTimeMilliseconds(),
+				TaskType: data.TaskType,
+			}
+			this.mapGroupHard2TaskList[data.GroupTaskId] = taskInfo
+			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		}
+	}
 	if bSave {
 	if bSave {
 		this.SetDirty(true)
 		this.SetDirty(true)
 	}
 	}
-	util.InfoF("uuid:%v init hard task group2:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
+	util.InfoF("uuid:%v init hard task2 group2:%v", this.role.GetUUid(), this.mapGroupHard2TaskList)
 }
 }
 
 
 func (this *RoleTask) getTaskData(taskId uint32) *serverproto.TaskData {
 func (this *RoleTask) getTaskData(taskId uint32) *serverproto.TaskData {
@@ -463,6 +539,16 @@ func (this *RoleTask) getTaskHardAllData(taskId uint32) *serverproto.TaskData {
 	return nil
 	return nil
 }
 }
 
 
+func (this *RoleTask) getTaskHard2AllData(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	if taskInfo, ok := this.mapGroupHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
 func (this *RoleTask) getTaskHardData(taskId uint32) *serverproto.TaskData {
 func (this *RoleTask) getTaskHardData(taskId uint32) *serverproto.TaskData {
 	if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
 	if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
 		return taskInfo
 		return taskInfo
@@ -477,6 +563,20 @@ func (this *RoleTask) getGroupTaskHardData(taskId uint32) *serverproto.TaskData
 	return nil
 	return nil
 }
 }
 
 
+func (this *RoleTask) getTaskHard2Data(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
+func (this *RoleTask) getGroupTaskHard2Data(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapGroupHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
 func (this *RoleTask) initTaskTypeList() {
 func (this *RoleTask) initTaskTypeList() {
 	if len(this.taskTypeList) <= 0 {
 	if len(this.taskTypeList) <= 0 {
 		//dailyTaskList
 		//dailyTaskList
@@ -554,6 +654,38 @@ func (this *RoleTask) initTaskTypeList() {
 				this.taskTypeList[key].Add(taskInfo.TaskId)
 				this.taskTypeList[key].Add(taskInfo.TaskId)
 			}
 			}
 		}
 		}
+
+		for _, taskInfo := range this.mapHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		for _, taskInfo := range this.mapGroupHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
 	}
 	}
 }
 }
 
 
@@ -606,6 +738,46 @@ func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
 						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
 						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
 
 
+						this.SetDirty(true)
+					}
+				}
+			}
+		} else if taskType == serverproto.TaskType_Level_Hard_Battle2_Count {
+			if taskInfo := this.getTaskHard2AllData(tmpTaskId); taskInfo != nil {
+				if taskInfo.TaskType == model.TASK_TYPE_HARD2 {
+					convertTaskData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+					if !ok {
+						util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
+						continue
+					}
+					if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
+						taskInfo.State != TASK_REWARD_STATE_REWARD {
+						util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
+					}
+					//多条件处理
+					ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
+					if ret {
+						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+
+						this.SetDirty(true)
+					}
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2_GROUP {
+					convertTaskData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+					if !ok {
+						util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
+						continue
+					}
+					if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
+						taskInfo.State != TASK_REWARD_STATE_REWARD {
+						util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
+					}
+					//多条件处理
+					ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
+					if ret {
+						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+
 						this.SetDirty(true)
 						this.SetDirty(true)
 					}
 					}
 				}
 				}
@@ -636,6 +808,9 @@ func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
 	if taskType == serverproto.TaskType_Level_Hard_Battle_Count {
 	if taskType == serverproto.TaskType_Level_Hard_Battle_Count {
 		this.AddHardTask()
 		this.AddHardTask()
 	}
 	}
+	if taskType == serverproto.TaskType_Level_Hard_Battle2_Count {
+		this.AddHard2Task()
+	}
 	if len(ntfMsg.TaskChangeList) > 0 {
 	if len(ntfMsg.TaskChangeList) > 0 {
 		this.role.ReplayGate(ntfMsg, true)
 		this.role.ReplayGate(ntfMsg, true)
 		util.InfoF("uid=%v TaskCheck changelist=%v", this.role.GetUUid(), ntfMsg.TaskChangeList)
 		util.InfoF("uid=%v TaskCheck changelist=%v", this.role.GetUUid(), ntfMsg.TaskChangeList)
@@ -903,7 +1078,146 @@ func (this *RoleTask) AddHardTask() bool {
 
 
 		this.role.ReplayGate(ntfMsg, true)
 		this.role.ReplayGate(ntfMsg, true)
 		this.role.roleTask.SetDirty(true)
 		this.role.roleTask.SetDirty(true)
-		util.InfoF("uuid:%v add start hard group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
+		//util.InfoF("uuid:%v add start hard group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
+		if len(ntfMsg.TaskChangeList) > 0 {
+			return true
+		} else {
+			return false
+		}
+	}
+	return false
+}
+
+func (this *RoleTask) AddHard2Task() bool {
+	var (
+		count2     int32  //未完成任务组数量
+		maxGroupId uint32 //最后一组 组id
+		//ggId       uint32
+	)
+
+	for _, v := range this.mapGroupHard2TaskList {
+		if v.State == TASK_REWARD_STATE_NONE {
+			count2++
+			//if maxGroupId < v.TaskId {
+			//	maxGroupId = v.TaskId
+			//}
+			break
+		}
+		if maxGroupId < v.TaskId {
+			maxGroupId = v.TaskId
+		}
+	}
+
+	if count2 < 1 {
+		////一下全部完成了任务
+		//if maxGroupId == 0 {
+		//	maxGroupId = ggId
+		//}
+		var (
+			count3 int32
+			count4 int32
+			maxId  uint32 //最后一个小任务id
+		)
+		if v, ok := model.Hard2GroupMissionTaskList[maxGroupId]; ok {
+			maxId = v.TaskId
+		}
+		ntfMsg := &serverproto.SCTaskChangeNtf{
+			DailyTaskScore: &this.dailyTaskScore,
+			WeekTaskScore:  &this.weekTaskScore,
+		}
+		for _, val := range model.Hard2GroupMissionTaskIdList {
+			//初始化5组 组任务
+			if count3 >= 5 {
+				break
+			}
+			if val <= maxGroupId {
+				continue
+			}
+			data := model.Hard2GroupMissionTaskList[val]
+			if data != nil {
+				taskInfo := &serverproto.TaskData{
+					TaskId: data.GroupTaskId,
+					State:  TASK_REWARD_STATE_NONE,
+					//BeginTime: util.GetTimeMilliseconds(),
+					TaskType: data.TaskType,
+				}
+				passNum := this.role.GetRoleBattle().GetPassHardBattle2IdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle2_Count)][1])
+				if passNum == 1 {
+					taskInfo.State = TASK_REWARD_STATE_COMPLETED
+					taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
+				}
+				this.mapGroupHard2TaskList[data.GroupTaskId] = taskInfo
+				//role.roleTask.loadTaskData.TaskList = append(role.roleTask.loadTaskData.TaskList, taskInfo)
+				this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+				ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+				//util.InfoF("add task gg:%v", taskInfo)
+				count3++
+			}
+		}
+		for _, val := range model.Hard2MissionTaskIdList {
+			//每组任务3个,目前只初始化5组所以是15个任务
+			if count4 >= 15 {
+				break
+			}
+			if val <= maxId {
+				continue
+			}
+			data := model.Hard2MissionTaskList[val]
+			if data != nil {
+				taskInfo := &serverproto.TaskData{
+					TaskId: data.TaskId,
+					State:  TASK_REWARD_STATE_NONE,
+					//BeginTime: util.GetTimeMilliseconds(),
+					TaskType: data.TaskType,
+				}
+				passNum := this.role.GetRoleBattle().GetPassHardBattle2IdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle2_Count)][1])
+				if passNum == 1 {
+					taskInfo.State = TASK_REWARD_STATE_COMPLETED
+					taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
+				}
+				this.mapHard2TaskList[data.TaskId] = taskInfo
+				//this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
+				this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+				ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+				//util.InfoF("add task gg2:%v", taskInfo)
+				count4++
+			}
+		}
+		for _, taskInfo := range this.mapHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		for _, taskInfo := range this.mapGroupHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		this.role.ReplayGate(ntfMsg, true)
+		this.role.roleTask.SetDirty(true)
+		//util.InfoF("uuid:%v add start hard2 group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
 		if len(ntfMsg.TaskChangeList) > 0 {
 		if len(ntfMsg.TaskChangeList) > 0 {
 			return true
 			return true
 		} else {
 		} else {
@@ -1035,6 +1349,59 @@ func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverpro
 		taskInfo.State = TASK_REWARD_STATE_REWARD
 		taskInfo.State = TASK_REWARD_STATE_REWARD
 		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		this.SetDirty(true)
 		this.SetDirty(true)
+	} else if rewardType == model.TASK_TYPE_HARD2 {
+		taskInfo := this.getTaskHard2Data(rewardIdx)
+		if taskInfo == nil {
+			return serverproto.ErrorCode_ERROR_FAIL
+		}
+		if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
+			return serverproto.ErrorCode_ERROR_TASK_REWARDED
+		}
+		convertData, ok := model.Hard2MissionTaskList[rewardIdx]
+		if !ok {
+			return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
+		}
+		for _, value := range convertData.TaskReward {
+			addItemList[value.Key] = value.Value
+		}
+		if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
+			return ret
+		}
+		taskInfo.State = TASK_REWARD_STATE_REWARD
+		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		this.SetDirty(true)
+	} else if rewardType == model.TASK_TYPE_HARD2_GROUP {
+		taskInfo := this.getGroupTaskHard2Data(rewardIdx)
+		if taskInfo == nil {
+			return serverproto.ErrorCode_ERROR_FAIL
+		}
+		if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
+			return serverproto.ErrorCode_ERROR_TASK_REWARDED
+		}
+		convertData, ok := model.Hard2GroupMissionTaskList[rewardIdx]
+		if !ok {
+			return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
+		}
+		//没找到这组的奖励
+		if len(convertData.GroupTaskReward) == 0 {
+			for _, v := range model.HardMissionTaskList {
+				if v.GroupTaskId == convertData.GroupTaskId {
+					if len(v.GroupTaskReward) != 0 {
+						convertData.GroupTaskReward = v.GroupTaskReward
+						break
+					}
+				}
+			}
+		}
+		for _, value := range convertData.GroupTaskReward {
+			addItemList[value.Key] = value.Value
+		}
+		if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
+			return ret
+		}
+		taskInfo.State = TASK_REWARD_STATE_REWARD
+		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		this.SetDirty(true)
 	}
 	}
 	for key, val := range addItemList {
 	for key, val := range addItemList {
 		ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
 		ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
@@ -1047,18 +1414,27 @@ func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverpro
 		DailyTaskScore: &this.dailyTaskScore,
 		DailyTaskScore: &this.dailyTaskScore,
 		WeekTaskScore:  &this.weekTaskScore,
 		WeekTaskScore:  &this.weekTaskScore,
 	}
 	}
-	if rewardType == model.TASK_TYPE_HARD {
+	switch rewardType {
+	case model.TASK_TYPE_HARD:
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHardData(rewardIdx))
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHardData(rewardIdx))
-	}
-	if rewardType == model.TASK_TYPE_HARD_GROUP {
+	case model.TASK_TYPE_HARD_GROUP:
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHardData(rewardIdx))
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHardData(rewardIdx))
+	case model.TASK_TYPE_HARD2:
+		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHard2Data(rewardIdx))
+	case model.TASK_TYPE_HARD2_GROUP:
+		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHard2Data(rewardIdx))
 	}
 	}
 	this.role.ReplayGate(ntfMsg, true)
 	this.role.ReplayGate(ntfMsg, true)
-	if rewardType == model.TASK_TYPE_HARD {
+
+	switch rewardType {
+	case model.TASK_TYPE_HARD:
 		this.CheckHardTaskAndDelete(rewardIdx)
 		this.CheckHardTaskAndDelete(rewardIdx)
-	}
-	if rewardType == model.TASK_TYPE_HARD_GROUP {
+	case model.TASK_TYPE_HARD_GROUP:
 		this.CheckHardGroupTaskAndDelete(rewardIdx)
 		this.CheckHardGroupTaskAndDelete(rewardIdx)
+	case model.TASK_TYPE_HARD2:
+		this.CheckHard2TaskAndDelete(rewardIdx)
+	case model.TASK_TYPE_HARD2_GROUP:
+		this.CheckHard2GroupTaskAndDelete(rewardIdx)
 	}
 	}
 	this.role.AddItemList(addItemList, AddFrom_Task, true)
 	this.role.AddItemList(addItemList, AddFrom_Task, true)
 	this.role.ReplayGate(ackMsg, true)
 	this.role.ReplayGate(ackMsg, true)
@@ -1108,6 +1484,46 @@ func (this *RoleTask) CheckHardGroupTaskAndDelete(groupTaskId uint32) {
 	}
 	}
 }
 }
 
 
+func (this *RoleTask) CheckHard2GroupTaskAndDelete(groupTaskId uint32) {
+	groupTask := this.getGroupTaskHard2Data(groupTaskId)
+	isDelete := true
+	list := make([]uint32, 0)
+	for _, v := range this.mapHard2TaskList {
+		if v2, ok := model.Hard2MissionTaskList[v.TaskId]; ok {
+			if v2.GroupTaskId == groupTask.TaskId {
+				list = append(list, v.TaskId)
+				if v.State != TASK_REWARD_STATE_REWARD {
+					isDelete = false
+					break
+				}
+			}
+		}
+	}
+	if isDelete {
+		//最后一组任务删除前新增任务
+		if len(this.mapGroupHard2TaskList) == 1 {
+			if !this.AddHard2Task() {
+				return
+			}
+
+		}
+		for _, v := range list {
+			task := this.getTaskHard2Data(v)
+			task.HardState = TASK_REWARD_STATE_DELETE
+			this.saveTaskDataList = append(this.saveTaskDataList, task)
+			delete(this.mapHard2TaskList, v)
+		}
+		task2 := this.getGroupTaskHard2Data(groupTaskId)
+		if task2 != nil {
+			task2.HardState = TASK_REWARD_STATE_DELETE
+		}
+		this.saveTaskDataList = append(this.saveTaskDataList, task2)
+		this.SetDirty(true)
+		delete(this.mapGroupHard2TaskList, groupTaskId)
+		util.InfoF("uuid:%v delete groupId2:%v saveTask:%v ", this.role.GetUUid(), groupTaskId, this.saveTaskDataList)
+	}
+}
+
 func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
 func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
 
 
 	var (
 	var (
@@ -1163,6 +1579,61 @@ func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
 	}
 	}
 }
 }
 
 
+func (this *RoleTask) CheckHard2TaskAndDelete(TaskId uint32) {
+
+	var (
+		groupId     uint32
+		isOver      bool
+		isGroupOver bool
+	)
+	list := make([]uint32, 0)
+	if g, ok := model.Hard2MissionTaskList[TaskId]; ok {
+		groupId = g.GroupTaskId
+	}
+	if v, ok := this.mapGroupHard2TaskList[groupId]; ok {
+		if v.State != TASK_REWARD_STATE_REWARD {
+			isGroupOver = true
+		}
+	}
+	for _, v := range this.mapHard2TaskList {
+		if v2, ok := model.Hard2MissionTaskList[v.TaskId]; ok {
+			if v2.GroupTaskId == groupId {
+				list = append(list, v.TaskId)
+				if v.State != TASK_REWARD_STATE_REWARD {
+					isOver = true
+					break
+				}
+			}
+		}
+	}
+	if !isOver && !isGroupOver {
+		//for _, v := range list {
+		//	delete(this.mapHardTaskList, v)
+		//}
+		//delete(this.mapGroupHardTaskList, groupId)
+		//最后一组任务不删除
+		if len(this.mapGroupHard2TaskList) == 1 {
+			if !this.AddHard2Task() {
+				return
+			}
+		}
+		for _, v := range list {
+			task := this.getTaskHard2Data(v)
+			task.HardState = TASK_REWARD_STATE_DELETE
+			this.saveTaskDataList = append(this.saveTaskDataList, task)
+			delete(this.mapHard2TaskList, v)
+		}
+		task2 := this.getGroupTaskHard2Data(groupId)
+		if task2 != nil {
+			task2.HardState = TASK_REWARD_STATE_DELETE
+		}
+		this.saveTaskDataList = append(this.saveTaskDataList, task2)
+		delete(this.mapGroupHard2TaskList, groupId)
+		this.SetDirty(true)
+		util.InfoF("uuid:%v delete groupId2:%v hard2 task:%v ", this.role.GetUUid(), groupId, list)
+	}
+}
+
 // 来自上一个任务的继承数值preTaskCount
 // 来自上一个任务的继承数值preTaskCount
 func (this *RoleTask) genNextTask(nextTaskId uint32, preTaskCount int32) *serverproto.TaskData {
 func (this *RoleTask) genNextTask(nextTaskId uint32, preTaskCount int32) *serverproto.TaskData {
 	convertTaskData, ok := model.ConvertTaskList[nextTaskId]
 	convertTaskData, ok := model.ConvertTaskList[nextTaskId]

+ 9 - 0
RO_Server_Trunk-branch_0.1.39/roserver/game/model/task_manager.go

@@ -183,6 +183,15 @@ func conditionCheck(role *Role, taskData *serverproto.TaskData, taskType serverp
 		//todo...关卡通关次数会在battle结构中做记录
 		//todo...关卡通关次数会在battle结构中做记录
 		passNum := role.GetRoleBattle().GetPassHardBattleIdNum(passBattleId)
 		passNum := role.GetRoleBattle().GetPassHardBattleIdNum(passBattleId)
 		return changeTaskProgressSet(&taskData.Progress, passNum, int32(taskType), targetNum)
 		return changeTaskProgressSet(&taskData.Progress, passNum, int32(taskType), targetNum)
+	case serverproto.TaskType_Level_Hard_Battle2_Count:
+		passBattleId := conditionList[1]
+		var targetNum int32 = 1
+		if len(conditionList) >= 3 {
+			targetNum = conditionList[2]
+		}
+		//todo...关卡通关次数会在battle结构中做记录
+		passNum := role.GetRoleBattle().GetPassHardBattle2IdNum(passBattleId)
+		return changeTaskProgressSet(&taskData.Progress, passNum, int32(taskType), targetNum)
 		// 总战力达到指定数值
 		// 总战力达到指定数值
 	case serverproto.TaskType_Total_Power:
 	case serverproto.TaskType_Total_Power:
 		targetNum := conditionList[1]
 		targetNum := conditionList[1]

+ 1 - 1
RO_Server_Trunk-branch_0.1.39/roserver/game/msg/login_msg.go

@@ -65,7 +65,7 @@ func init() {
 		role.SetPlatform(msg.Platform)
 		role.SetPlatform(msg.Platform)
 		role.SetClientIP(msg.Ip)
 		role.SetClientIP(msg.Ip)
 		role.SetSelectZone(msg.SelectZone) //客户端登陆时选择的服务器zone
 		role.SetSelectZone(msg.SelectZone) //客户端登陆时选择的服务器zone
-		role.SetHardFight(false)
+		role.SetHardFight(0)
 
 
 		//利用缓存数据
 		//利用缓存数据
 		if bHas {
 		if bHas {

+ 9 - 4
RO_Server_Trunk-branch_0.1.39/roserver/game/msg/role_msg.go

@@ -1121,16 +1121,21 @@ func init() {
 		}
 		}
 		//转为困难模式
 		//转为困难模式
 		if msg.Type == 1 {
 		if msg.Type == 1 {
-			if role.GetHardFight() {
+			if role.GetHardFight() == 1 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 			}
 			}
-			role.SetHardFight(true)
+			role.SetHardFight(1)
 			//ackMsg.Type = role.GetHardFightHigh()
 			//ackMsg.Type = role.GetHardFightHigh()
 		} else if msg.Type == 0 { //转为普通模式
 		} else if msg.Type == 0 { //转为普通模式
-			if !role.GetHardFight() {
+			if role.GetHardFight() == 0 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 			}
 			}
-			role.SetHardFight(false)
+			role.SetHardFight(0)
+		} else if msg.Type == 2 { //噩梦模式
+			if role.GetHardFight() == 2 {
+				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
+			}
+			role.SetHardFight(2)
 		}
 		}
 		util.InfoF("uid=%v cliId=%v receive CSMapLevelTypeChangeReq msg=%v", role.GetUUid(), cliId, msg)
 		util.InfoF("uid=%v cliId=%v receive CSMapLevelTypeChangeReq msg=%v", role.GetUUid(), cliId, msg)
 		role.ReplayGate(ackMsg, true)
 		role.ReplayGate(ackMsg, true)

+ 102 - 0
RO_Server_Trunk-branch_0.1.39/roserver/rank/model/rank_map.go

@@ -28,6 +28,7 @@ const (
 
 
 var MapRankTopThree []*serverproto.RankPlayerInfo
 var MapRankTopThree []*serverproto.RankPlayerInfo
 var MapHardRankTopThree []*serverproto.RankPlayerInfo
 var MapHardRankTopThree []*serverproto.RankPlayerInfo
+var MapHard2RankTopThree []*serverproto.RankPlayerInfo
 
 
 // zSet rank
 // zSet rank
 // https://www.jianshu.com/p/2cbf358b933b
 // https://www.jianshu.com/p/2cbf358b933b
@@ -134,6 +135,57 @@ func AddHardMapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo
 	return uint32(selfRank), uint32(rankList), 0
 	return uint32(selfRank), uint32(rankList), 0
 }
 }
 
 
+func AddHard2MapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo *serverproto.BattleRecordInfo) (uint32, uint32, uint64) {
+	if uid <= 0 {
+		return 0, 0, 0
+	}
+
+	//score
+	scoreStr := getRankScore(uint64(newMapLevel), passTime)
+	//uid
+	keyStr := strconv.FormatUint(uid, 10)
+
+	//todo... 通过多命令方式处理
+	_, err := service.GetRedis().ZAdd(model2.MapHard2RankPrefix, redis.Z{Score: float64(scoreStr), Member: keyStr}).Result()
+	if err != nil {
+		util.ErrorF("AddMapRank err=%v uid=%v", err, uid)
+		return 0, 0, 0
+	}
+
+	//util.InfoF("[AddMapRank] ret:%v %v %v", ret, scoreStr, keyStr)
+	//retRank,err1 := service.GetRedis().ZRevRange(MapRankPrefix, 0, -1).Result()
+	//if err1 == nil {
+	//	util.DebugF("[AddMapRank] rankList:%v", retRank)
+	//}
+
+	selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
+	if err2 != nil {
+		util.DebugF("AddMapRank selfRank err=%v uid=%v", err2, uid)
+		return 0, 0, 0
+	}
+	util.DebugF("AddMapRank selfRank=%v uid=%v score=%v", selfRank+1, uid, scoreStr)
+
+	rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
+	if err3 != nil {
+		util.DebugF("AddMapRank totalRanks err=%v uid=%v", err2, uid)
+		return 0, 0, 0
+	}
+	util.DebugF("AddMapRank totalRanks=%v uid=%v", rankList, uid)
+
+	////记录战斗回复记录数据(不包括战斗过程记录)
+	//recordId := battleRecord(uid, int32(selfRank), recordInfo)
+	//if recordId > 0 {
+	//	service.GetRedis().SAdd(model2.BattleRecordDetailCheckPrefix, recordId)
+	//}
+
+	//如果自己在前3名内,重新获取排名前3的玩家列表
+	if selfRank < MAPRANK_TOP_3 {
+		getTop3MapHard2Rank()
+	}
+
+	return uint32(selfRank), uint32(rankList), 0
+}
+
 func GetMapRank(uid uint64) (uint32, uint32) {
 func GetMapRank(uid uint64) (uint32, uint32) {
 	//获取排名前3的玩家列表
 	//获取排名前3的玩家列表
 	//if len(MapRankTopThree) <= 0 {
 	//if len(MapRankTopThree) <= 0 {
@@ -190,6 +242,34 @@ func GetMapHardRank(uid uint64) (uint32, uint32) {
 	return uint32(selfRank), uint32(rankList)
 	return uint32(selfRank), uint32(rankList)
 }
 }
 
 
+func GetMapHard2Rank(uid uint64) (uint32, uint32) {
+	//获取排名前3的玩家列表
+	//if len(MapRankTopThree) <= 0 {
+	//	getTop3MapRank()
+	//}
+	//暂时处理成每次重新获取,因为简介信息可能发生变化
+	getTop3MapHard2Rank()
+
+	//uid
+	keyStr := strconv.FormatUint(uid, 10)
+
+	selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
+	if err2 != nil {
+		util.DebugF("uid=%v GetMapRank selfRank keystr=%v err=%v", uid, model2.MapHard2RankPrefix, err2)
+		return 0, 0
+	}
+	util.DebugF("uid=%v GetMapRank keystr=%v selfRank=%v", uid, model2.MapHard2RankPrefix, selfRank+1)
+
+	rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
+	if err3 != nil {
+		util.DebugF("uid=%v GetMapRank keystr=%v totalRanks err=%v", uid, model2.MapHard2RankPrefix, err2)
+		return 0, 0
+	}
+	util.DebugF("uid=%v GetMapRank keystr=%v totalRanks=%v", uid, model2.MapHard2RankPrefix, rankList)
+
+	return uint32(selfRank), uint32(rankList)
+}
+
 func GetRankByKeyUid(KeyStr string, uid uint64, compId int32) (uint32, uint32, uint32) {
 func GetRankByKeyUid(KeyStr string, uid uint64, compId int32) (uint32, uint32, uint32) {
 	//uid
 	//uid
 	uidStr := strconv.FormatUint(uid, 10)
 	uidStr := strconv.FormatUint(uid, 10)
@@ -335,6 +415,28 @@ func getTop3MapHardRank() {
 	}
 	}
 }
 }
 
 
+func getTop3MapHard2Rank() {
+	//topList,err4 := service.GetRedis().ZRevRange(MapRankPrefix, 0, MAPRANK_TOP_3 -1).Result()
+	topListWithScore, err4 := service.GetRedis().ZRevRangeWithScores(model2.MapHard2RankPrefix, 0, MAPRANK_TOP_3-1).Result()
+	if err4 == nil {
+		MapHard2RankTopThree = MapHard2RankTopThree[:0]
+		for index, _ := range topListWithScore {
+			rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
+			mapId, mapLevel, _ := getValByRankScore(topListWithScore[index].Score)
+			topRankPlayer := &serverproto.RankPlayerInfo{
+				Uid:      rankUid,
+				MapId:    mapId,
+				MapLevel: mapLevel,
+				Brief:    &serverproto.CommonPlayerBriefInfo{},
+			}
+
+			//获取top rank player nickName
+			model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, topRankPlayer.Brief)
+			MapHard2RankTopThree = append(MapHard2RankTopThree, topRankPlayer)
+		}
+	}
+}
+
 func battleRecord(uid uint64, selfRank int32, recordInfo *serverproto.BattleRecordInfo) uint64 {
 func battleRecord(uid uint64, selfRank int32, recordInfo *serverproto.BattleRecordInfo) uint64 {
 	var retId uint64 = 0
 	var retId uint64 = 0
 	if recordInfo.RecordTime <= 0 {
 	if recordInfo.RecordTime <= 0 {

+ 22 - 1
RO_Server_Trunk-branch_0.1.39/roserver/rank/msg/rank_msg.go

@@ -20,7 +20,7 @@ func init() {
 			//Error:  int32(serverproto.ErrorCode_ERROR_FAIL),
 			//Error:  int32(serverproto.ErrorCode_ERROR_FAIL),
 			Notify: false,
 			Notify: false,
 		}
 		}
-		if msg.IsHard {
+		if msg.IsHard == 1 {
 			var selfRank uint32 = 0
 			var selfRank uint32 = 0
 			var totalRank uint32 = 0
 			var totalRank uint32 = 0
 			var battleRecordId uint64 = 0
 			var battleRecordId uint64 = 0
@@ -35,6 +35,27 @@ func init() {
 				ackMsg.RecordTimeStamp = msg.RecordInfo.RecordTime
 				ackMsg.RecordTimeStamp = msg.RecordInfo.RecordTime
 			}
 			}
 
 
+			if totalRank > 0 {
+				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
+				ackMsg.Rank = selfRank + 1
+			}
+			ackMsg.RankPlayers = totalRank
+			ackMsg.TopPlayerList = append(rankMode.MapHardRankTopThree)
+		} else if msg.IsHard == 2 {
+			var selfRank uint32 = 0
+			var totalRank uint32 = 0
+			var battleRecordId uint64 = 0
+			//获取排名
+			if msg.NewMapLevelId == 0 && msg.PassTime == 0 {
+				selfRank, totalRank = rankMode.GetMapHard2Rank(cliId.SessID)
+				ackMsg.Notify = true
+			} else {
+				//设置排名
+				selfRank, totalRank, battleRecordId = rankMode.AddHard2MapRank(cliId.SessID, msg.NewMapLevelId, msg.PassTime, msg.RecordInfo)
+				ackMsg.BattleRecordId = battleRecordId
+				ackMsg.RecordTimeStamp = msg.RecordInfo.RecordTime
+			}
+
 			if totalRank > 0 {
 			if totalRank > 0 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 				ackMsg.Rank = selfRank + 1
 				ackMsg.Rank = selfRank + 1

+ 2 - 2
RO_Server_Trunk-branch_0.1.39/roserver/serverproto/config_csv.go

@@ -2273,7 +2273,7 @@ type Hard2MissionCfg struct {
 func Hard2MissionCfgLoad(path string) {
 func Hard2MissionCfgLoad(path string) {
 	cfg := []*Hard2MissionCfg{}
 	cfg := []*Hard2MissionCfg{}
 	Hard2MissionCfgLoader = map[int32]*Hard2MissionCfg{}
 	Hard2MissionCfgLoader = map[int32]*Hard2MissionCfg{}
-	loadCsvCfg(path+"Hard2MissionCfg.csv", &cfg)
+	loadCsvCfg(path+"EMMissionCfg.csv", &cfg)
 	for _, row := range cfg {
 	for _, row := range cfg {
 		Hard2MissionCfgLoader[row.MissionID] = row
 		Hard2MissionCfgLoader[row.MissionID] = row
 	}
 	}
@@ -3927,7 +3927,7 @@ type Hard2LevelCfg struct {
 func Hard2LevelCfgLoad(path string) {
 func Hard2LevelCfgLoad(path string) {
 	cfg := []*Hard2LevelCfg{}
 	cfg := []*Hard2LevelCfg{}
 	Hard2LevelCfgLoader = map[int32]*Hard2LevelCfg{}
 	Hard2LevelCfgLoader = map[int32]*Hard2LevelCfg{}
-	loadCsvCfg(path+"Hard2LevelCfg.csv", &cfg)
+	loadCsvCfg(path+"EMLevelCfg.csv", &cfg)
 	for _, row := range cfg {
 	for _, row := range cfg {
 		Hard2LevelCfgLoader[row.Id] = row
 		Hard2LevelCfgLoader[row.Id] = row
 	}
 	}

+ 204 - 204
RO_Server_Trunk-branch_0.1.39/roserver/serverproto/db.pb.go

@@ -2206,7 +2206,7 @@ type SSMapLevelChangeReq struct {
 	NewMapLevelId        uint32            `protobuf:"varint,1,opt,name=new_map_level_id,json=newMapLevelId,proto3" json:"new_map_level_id,omitempty"`
 	NewMapLevelId        uint32            `protobuf:"varint,1,opt,name=new_map_level_id,json=newMapLevelId,proto3" json:"new_map_level_id,omitempty"`
 	PassTime             uint64            `protobuf:"varint,2,opt,name=pass_time,json=passTime,proto3" json:"pass_time,omitempty"`
 	PassTime             uint64            `protobuf:"varint,2,opt,name=pass_time,json=passTime,proto3" json:"pass_time,omitempty"`
 	RecordInfo           *BattleRecordInfo `protobuf:"bytes,3,opt,name=record_info,json=recordInfo,proto3" json:"record_info,omitempty"`
 	RecordInfo           *BattleRecordInfo `protobuf:"bytes,3,opt,name=record_info,json=recordInfo,proto3" json:"record_info,omitempty"`
-	IsHard               bool              `protobuf:"varint,4,opt,name=isHard,proto3" json:"isHard,omitempty"`
+	IsHard               int32             `protobuf:"varint,4,opt,name=isHard,proto3" json:"isHard,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
 	XXX_sizecache        int32             `json:"-"`
 	XXX_sizecache        int32             `json:"-"`
@@ -2258,11 +2258,11 @@ func (m *SSMapLevelChangeReq) GetRecordInfo() *BattleRecordInfo {
 	return nil
 	return nil
 }
 }
 
 
-func (m *SSMapLevelChangeReq) GetIsHard() bool {
+func (m *SSMapLevelChangeReq) GetIsHard() int32 {
 	if m != nil {
 	if m != nil {
 		return m.IsHard
 		return m.IsHard
 	}
 	}
-	return false
+	return 0
 }
 }
 
 
 type SSMapLevelChangeAck struct {
 type SSMapLevelChangeAck struct {
@@ -7378,7 +7378,7 @@ func init() {
 }
 }
 
 
 var fileDescriptor_8817812184a13374 = []byte{
 var fileDescriptor_8817812184a13374 = []byte{
-	// 5082 bytes of a gzipped FileDescriptorProto
+	// 5080 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x5d, 0x6f, 0x1c, 0x47,
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x5d, 0x6f, 0x1c, 0x47,
 	0x72, 0xd8, 0x2f, 0x72, 0xb7, 0x96, 0x4b, 0x52, 0x63, 0x59, 0xa2, 0xac, 0xb3, 0x4f, 0x1e, 0x9f,
 	0x72, 0xd8, 0x2f, 0x72, 0xb7, 0x96, 0x4b, 0x52, 0x63, 0x59, 0xa2, 0xac, 0xb3, 0x4f, 0x1e, 0x9f,
 	0x1d, 0xf9, 0xe3, 0xec, 0x3b, 0x49, 0x91, 0x6d, 0x59, 0xb1, 0x4d, 0x52, 0x12, 0xc5, 0xb3, 0x28,
 	0x1d, 0xf9, 0xe3, 0xec, 0x3b, 0x49, 0x91, 0x6d, 0x59, 0xb1, 0x4d, 0x52, 0x12, 0xc5, 0xb3, 0x28,
@@ -7497,204 +7497,204 @@ var fileDescriptor_8817812184a13374 = []byte{
 	0x38, 0x92, 0xc6, 0xd1, 0x8e, 0xd3, 0x09, 0xe5, 0x93, 0x14, 0x7f, 0xdf, 0xc3, 0x7d, 0x4f, 0x84,
 	0x38, 0x92, 0xc6, 0xd1, 0x8e, 0xd3, 0x09, 0xe5, 0x93, 0x14, 0x7f, 0xdf, 0xc3, 0x7d, 0x4f, 0x84,
 	0x52, 0xa6, 0xfa, 0x9a, 0x08, 0x20, 0xe5, 0x7d, 0x0c, 0xed, 0x58, 0xf6, 0xa3, 0xd8, 0xe3, 0x13,
 	0x52, 0xa6, 0xfa, 0x9a, 0x08, 0x20, 0xe5, 0x7d, 0x0c, 0xed, 0x58, 0xf6, 0xa3, 0xd8, 0xe3, 0x13,
 	0xc1, 0x4e, 0xf2, 0xe5, 0x82, 0x2a, 0x74, 0x09, 0x43, 0x58, 0x5c, 0x35, 0xc4, 0xd9, 0x6f, 0xeb,
 	0xc1, 0x4e, 0xf2, 0xe5, 0x82, 0x2a, 0x74, 0x09, 0x43, 0x58, 0x5c, 0x35, 0xc4, 0xd9, 0x6f, 0xeb,
-	0x1c, 0xac, 0xf8, 0xea, 0x2e, 0x56, 0x64, 0x75, 0xba, 0xb8, 0xd1, 0x5f, 0xf6, 0x1f, 0x57, 0xe7,
-	0xb9, 0x46, 0x3b, 0xcf, 0x0c, 0xb8, 0x62, 0x1a, 0xb0, 0x05, 0x75, 0x94, 0x2a, 0x71, 0xd7, 0x71,
-	0xe8, 0x37, 0xe6, 0xb3, 0x24, 0x69, 0xf6, 0x25, 0x8a, 0x58, 0xeb, 0x38, 0x6d, 0x84, 0xb1, 0x23,
-	0x51, 0xd6, 0x2e, 0x6c, 0xa0, 0x42, 0xb4, 0xb7, 0x31, 0x42, 0xcf, 0x4c, 0x55, 0x9d, 0x4d, 0x21,
-	0xf6, 0x3b, 0x49, 0x34, 0xe1, 0x4f, 0x8a, 0x11, 0xe7, 0x60, 0x25, 0x8c, 0x12, 0x7f, 0x70, 0x42,
-	0x2a, 0x6f, 0x3a, 0xfa, 0xcb, 0xba, 0x0c, 0x9b, 0x5c, 0xb4, 0xb9, 0xa9, 0x80, 0x3c, 0xd2, 0x78,
-	0xdd, 0x59, 0xef, 0x99, 0x12, 0xf1, 0x30, 0x96, 0x6a, 0x14, 0x14, 0xb1, 0xab, 0x12, 0x31, 0x9e,
-	0x6c, 0xad, 0x12, 0xea, 0x06, 0x0f, 0xa0, 0xa8, 0xbb, 0x08, 0xb6, 0x93, 0x2c, 0x7b, 0x45, 0xae,
-	0xd2, 0x1b, 0xbc, 0x8b, 0xd0, 0xa2, 0xbd, 0x1a, 0xf9, 0x72, 0x13, 0x01, 0x78, 0x88, 0x70, 0x50,
-	0x25, 0x22, 0xc6, 0xba, 0xec, 0x29, 0x49, 0xa8, 0xe1, 0x34, 0x09, 0xb0, 0xef, 0x3d, 0x45, 0x4f,
-	0x48, 0x1e, 0x57, 0x49, 0xa1, 0xa2, 0xec, 0xf6, 0xaa, 0xe1, 0xac, 0x21, 0xb4, 0x4b, 0xc0, 0x7d,
-	0xcf, 0xfe, 0x9f, 0xca, 0xdc, 0xb2, 0x8b, 0x95, 0xf1, 0xbe, 0x66, 0xc6, 0x48, 0x33, 0x8a, 0x2e,
-	0x32, 0xa3, 0x43, 0xe2, 0x24, 0x46, 0x49, 0x92, 0xc8, 0xa8, 0x0c, 0x06, 0x74, 0x40, 0x34, 0x1b,
-	0x4d, 0x04, 0x20, 0x6a, 0x71, 0x8b, 0xf5, 0x65, 0x5b, 0x6c, 0xcc, 0x6c, 0xf1, 0x0d, 0xd8, 0xc8,
-	0xc8, 0xea, 0xc3, 0xc9, 0x27, 0xaf, 0x93, 0x12, 0xa7, 0xe3, 0x69, 0xff, 0x26, 0x96, 0xd6, 0x19,
-	0x6f, 0x8e, 0x7c, 0x22, 0x62, 0xaf, 0xdc, 0x3b, 0x67, 0xfe, 0xa1, 0x3a, 0xe3, 0x1f, 0x66, 0xa5,
-	0xd8, 0x54, 0xa9, 0x04, 0x7f, 0x50, 0x42, 0x1c, 0x45, 0x58, 0xd8, 0x73, 0x65, 0x66, 0xcf, 0x97,
-	0x61, 0x33, 0x26, 0x4c, 0x43, 0x3d, 0xbc, 0xe4, 0x3a, 0xc3, 0x33, 0x05, 0xfd, 0xb0, 0x40, 0xfe,
-	0xc1, 0xc4, 0x13, 0x09, 0x1d, 0xf2, 0x79, 0xf5, 0x56, 0xe6, 0xd5, 0x4b, 0xd7, 0x78, 0xbc, 0x8e,
-	0x79, 0x14, 0xb8, 0x5a, 0xd3, 0x1c, 0xe4, 0x06, 0x6f, 0xff, 0x45, 0xa5, 0x64, 0xb1, 0xc5, 0xe6,
-	0xb0, 0xbf, 0x90, 0xf8, 0xec, 0x39, 0xfb, 0x4c, 0x9e, 0x3c, 0x14, 0xc1, 0x54, 0xa2, 0x4a, 0xaf,
-	0x5f, 0x9b, 0x5f, 0xb9, 0x54, 0x1e, 0xb5, 0x52, 0x79, 0x8c, 0xe0, 0xd5, 0x6e, 0x77, 0x37, 0x8e,
-	0x94, 0xfa, 0x8d, 0xa9, 0x08, 0xef, 0x8a, 0x70, 0x78, 0x14, 0xfb, 0x22, 0xf8, 0x05, 0x28, 0xf6,
-	0x87, 0xcf, 0x5a, 0xe9, 0xe7, 0xa8, 0xe5, 0x27, 0x8b, 0xd7, 0xfa, 0xc5, 0xaa, 0xfc, 0x27, 0x95,
-	0x67, 0xad, 0xfc, 0x4b, 0xa6, 0xff, 0x3f, 0xab, 0xc0, 0x96, 0x2e, 0x8e, 0x0f, 0x85, 0x52, 0x79,
-	0x38, 0xc4, 0x58, 0xfa, 0x09, 0x74, 0xa8, 0xfa, 0x75, 0x7b, 0x85, 0x9b, 0x96, 0x22, 0x33, 0x34,
-	0x37, 0xbf, 0x40, 0x68, 0xd3, 0x8c, 0x1d, 0xbe, 0x64, 0x29, 0x75, 0xd8, 0xd5, 0x52, 0x87, 0x8d,
-	0x69, 0x98, 0xaf, 0xdc, 0x21, 0xbf, 0x90, 0x34, 0x9d, 0xba, 0xaf, 0xf6, 0xc6, 0xf6, 0x0d, 0x4c,
-	0xe4, 0x68, 0x85, 0x03, 0x3f, 0x34, 0x82, 0xbd, 0x7c, 0x8c, 0xb9, 0x2b, 0x33, 0x47, 0x41, 0x59,
-	0x8b, 0x12, 0x08, 0x44, 0xa1, 0xd0, 0xfe, 0x8f, 0x0a, 0x74, 0x0a, 0x53, 0x71, 0x8a, 0x99, 0x05,
-	0xe8, 0x29, 0x83, 0x8c, 0xac, 0xf5, 0x01, 0x34, 0x70, 0x9f, 0x4a, 0x97, 0xc0, 0xcf, 0x73, 0x61,
-	0xc2, 0x13, 0x90, 0xb4, 0xb1, 0x53, 0x9d, 0x60, 0x40, 0xbe, 0x47, 0x44, 0xd0, 0x51, 0x8e, 0x10,
-	0xea, 0x14, 0x64, 0x81, 0x41, 0x84, 0xf0, 0x3a, 0xe8, 0x70, 0xe7, 0x1e, 0xcb, 0x58, 0xf9, 0x51,
-	0xa8, 0xfd, 0x73, 0x87, 0xa1, 0x0f, 0x19, 0x68, 0xff, 0x6b, 0xa5, 0x5c, 0x24, 0x3a, 0xe9, 0x66,
-	0x91, 0x68, 0x65, 0xcd, 0x47, 0x94, 0xc2, 0x3c, 0xa7, 0x45, 0xd8, 0xa4, 0xa9, 0xb2, 0x20, 0x5c,
-	0x7d, 0xfe, 0x20, 0x5c, 0x2b, 0xd7, 0x69, 0x1e, 0xf2, 0xeb, 0x66, 0xc8, 0xb7, 0xdf, 0xc6, 0x3d,
-	0xa0, 0xbd, 0x1d, 0x65, 0xea, 0x62, 0x3f, 0x50, 0xe2, 0x6b, 0xec, 0xeb, 0xb0, 0x9e, 0xa3, 0x11,
-	0xb3, 0x69, 0x16, 0xa3, 0x2f, 0xbc, 0x28, 0x8b, 0x99, 0xcb, 0xfb, 0xec, 0xb8, 0x7c, 0x91, 0x67,
-	0xba, 0x99, 0x1b, 0x05, 0x29, 0x96, 0x9d, 0xbf, 0x22, 0x3b, 0x86, 0x18, 0xed, 0x50, 0x17, 0x1e,
-	0x77, 0x62, 0x5f, 0x86, 0xde, 0x51, 0x0a, 0x2f, 0x77, 0xa2, 0x17, 0xa0, 0x39, 0x73, 0xe3, 0xb7,
-	0x3a, 0xe5, 0xbb, 0x3e, 0xf4, 0x10, 0x3d, 0x39, 0xf4, 0xc3, 0x34, 0xb1, 0xa6, 0x0f, 0x7a, 0x07,
-	0x0a, 0xd3, 0x77, 0x42, 0xfc, 0x69, 0xff, 0x65, 0xa5, 0x7c, 0xc1, 0xf2, 0x4a, 0xc7, 0x30, 0xef,
-	0xda, 0xe9, 0xcc, 0xfb, 0x2c, 0x34, 0x06, 0x7e, 0x28, 0x02, 0x7d, 0x38, 0xf9, 0x23, 0xe7, 0xb2,
-	0x5e, 0xc2, 0x65, 0x23, 0xe7, 0xf2, 0x2d, 0xcc, 0xd6, 0x3f, 0x0f, 0x03, 0x3f, 0x94, 0x7b, 0x32,
-	0xc1, 0x1a, 0x63, 0xa1, 0x50, 0xec, 0x41, 0x29, 0x2e, 0xee, 0xe7, 0x06, 0xb4, 0xb0, 0x8a, 0xe1,
-	0x3b, 0x2a, 0x36, 0xee, 0x62, 0xfe, 0x8c, 0xc8, 0xe6, 0xcd, 0x8c, 0xd3, 0x8c, 0x75, 0x35, 0x54,
-	0x62, 0x1d, 0x7f, 0x48, 0xd9, 0x7e, 0x5a, 0x2e, 0xe5, 0xd9, 0xfe, 0xbc, 0xd4, 0x2e, 0xea, 0x75,
-	0x29, 0xa1, 0xd2, 0x69, 0x21, 0x02, 0x28, 0xa1, 0x2a, 0xaf, 0x80, 0xce, 0xc1, 0x0a, 0xfd, 0xb8,
-	0x92, 0xbe, 0xe9, 0xf2, 0x57, 0x06, 0xbf, 0xaa, 0xa5, 0xa3, 0xbf, 0xec, 0xbf, 0x29, 0x61, 0xa6,
-	0x5c, 0x85, 0x4b, 0x99, 0x79, 0x19, 0x80, 0x06, 0xe3, 0x68, 0x1a, 0xa6, 0x0e, 0x9f, 0xd0, 0x1d,
-	0x04, 0xe4, 0xbc, 0xd6, 0xcb, 0x79, 0x6d, 0x2c, 0xe0, 0x75, 0xa5, 0xc0, 0x2b, 0x29, 0x48, 0xab,
-	0x86, 0xdf, 0x87, 0x17, 0xa7, 0x09, 0x5f, 0x83, 0x5b, 0xfb, 0x47, 0x95, 0xd2, 0x85, 0xbe, 0x82,
-	0x58, 0xce, 0xc1, 0x0a, 0x47, 0x3d, 0x6d, 0xbd, 0xfa, 0x8b, 0x0a, 0x1f, 0x8e, 0x92, 0xcc, 0x02,
-	0x8b, 0xa5, 0xcd, 0xb0, 0x8c, 0x89, 0xb3, 0x19, 0x13, 0xdd, 0x51, 0x34, 0x59, 0x7c, 0x9a, 0x97,
-	0xb2, 0x80, 0x0e, 0x67, 0x14, 0x4d, 0xcc, 0xda, 0xbd, 0x89, 0x00, 0x1a, 0x7c, 0x05, 0xda, 0x6a,
-	0xda, 0x73, 0x09, 0x21, 0x6b, 0x03, 0x68, 0xa9, 0x69, 0x8f, 0x16, 0xf4, 0xec, 0x7f, 0x29, 0x63,
-	0xe2, 0x6b, 0x98, 0x87, 0x4a, 0xc4, 0x50, 0x9a, 0x02, 0xef, 0x22, 0x60, 0x46, 0x1f, 0xf5, 0x59,
-	0xeb, 0x29, 0x6c, 0xa1, 0xb1, 0x7c, 0x0b, 0x2b, 0xb3, 0x5b, 0xf8, 0x13, 0x32, 0x70, 0x63, 0x0b,
-	0x3b, 0xd3, 0x93, 0x9f, 0xb7, 0x18, 0x2f, 0x40, 0x73, 0x18, 0x45, 0x9e, 0xca, 0x65, 0xb8, 0x4a,
-	0xdf, 0x5c, 0x99, 0xf3, 0x50, 0x38, 0x1d, 0xa7, 0xbc, 0x13, 0xe0, 0xfe, 0x74, 0x6c, 0xff, 0x57,
-	0x09, 0x6f, 0xbf, 0x5c, 0xd2, 0x35, 0x77, 0xb6, 0xb2, 0x64, 0x67, 0xab, 0x33, 0x3b, 0xdb, 0xa6,
-	0xfb, 0x27, 0xde, 0x18, 0x39, 0xc4, 0x53, 0x4b, 0xdc, 0xfe, 0xe7, 0xea, 0x0c, 0x8d, 0xc5, 0xf9,
-	0xeb, 0xfc, 0xcd, 0xcb, 0xd2, 0x3a, 0xf5, 0x02, 0x34, 0xb3, 0xbb, 0xae, 0x3a, 0xcd, 0x59, 0x95,
-	0xfa, 0xa2, 0xab, 0xc0, 0x51, 0x63, 0x46, 0xce, 0xd7, 0xa0, 0x99, 0x44, 0x13, 0x8e, 0x02, 0x2b,
-	0x14, 0x05, 0x2e, 0xcc, 0x45, 0x01, 0x5c, 0xe0, 0x28, 0x9a, 0x5c, 0x75, 0x56, 0x13, 0x7e, 0x35,
-	0x42, 0xf1, 0x13, 0x2b, 0x9c, 0x2c, 0xae, 0x6a, 0xfb, 0x94, 0xc1, 0x80, 0xc2, 0xb8, 0x75, 0x15,
-	0x9a, 0x74, 0x0b, 0x8e, 0x44, 0x9b, 0x25, 0x2d, 0x1e, 0x48, 0x54, 0x5f, 0x9c, 0x3b, 0xab, 0x13,
-	0xfe, 0x81, 0x05, 0x44, 0x7f, 0x1a, 0xbb, 0x86, 0x5a, 0x5b, 0x5c, 0x40, 0xf4, 0xa7, 0xb1, 0x93,
-	0xf9, 0x31, 0x2f, 0xed, 0xc1, 0x40, 0xc8, 0x57, 0xf5, 0x95, 0x94, 0x5e, 0x92, 0xab, 0x32, 0x4c,
-	0x1f, 0x18, 0x44, 0x7a, 0xfa, 0xf7, 0xca, 0xdc, 0x32, 0xa7, 0xd4, 0x54, 0xbe, 0x78, 0x6d, 0xf9,
-	0xe2, 0xf5, 0xd9, 0xc5, 0xad, 0xeb, 0xd0, 0xf2, 0x13, 0x39, 0xe6, 0x4c, 0xa6, 0x51, 0xa2, 0x13,
-	0xb3, 0x60, 0x71, 0x9a, 0x88, 0x4b, 0x59, 0x4e, 0xf1, 0x4c, 0xac, 0xcc, 0x46, 0x80, 0xdf, 0xa9,
-	0xc0, 0x1a, 0x6e, 0xe7, 0x40, 0xbf, 0x37, 0x95, 0x08, 0xed, 0x46, 0xc6, 0x9a, 0x51, 0x2c, 0x2d,
-	0x59, 0x5b, 0x73, 0x4d, 0xab, 0xd3, 0xbd, 0xa0, 0x1f, 0xb8, 0x13, 0x11, 0x8b, 0xb1, 0xf9, 0x2e,
-	0xd3, 0x41, 0xf0, 0x21, 0x42, 0xa9, 0xa6, 0xfb, 0xbb, 0x0a, 0x5c, 0xe4, 0xe0, 0x9c, 0xbd, 0x1c,
-	0x65, 0x35, 0x2b, 0x56, 0x49, 0xaf, 0x40, 0x9b, 0xe8, 0xf4, 0x07, 0xc3, 0xbc, 0x88, 0x6c, 0x21,
-	0x68, 0x77, 0x30, 0xe4, 0x23, 0x4a, 0xe3, 0xa6, 0x62, 0x11, 0x90, 0x8a, 0x8e, 0x06, 0xc9, 0xf2,
-	0x6a, 0x0b, 0xcc, 0x39, 0x15, 0x00, 0xcf, 0x4b, 0xed, 0x79, 0x89, 0x3b, 0xe1, 0xf7, 0xf9, 0xd4,
-	0x1a, 0x9e, 0x51, 0xcb, 0x5f, 0x37, 0xf3, 0xaa, 0x67, 0x4a, 0x30, 0xcb, 0xa9, 0xec, 0xbf, 0xae,
-	0xc0, 0x7a, 0x4e, 0xbb, 0x84, 0xab, 0xca, 0xac, 0x93, 0x33, 0x6f, 0x1f, 0xd3, 0xbc, 0x7d, 0x46,
-	0x83, 0xb5, 0xaf, 0xa9, 0xc1, 0x7a, 0x99, 0x06, 0x7f, 0x5c, 0xe0, 0x34, 0xbd, 0x42, 0x5b, 0x7c,
-	0xda, 0x6e, 0x02, 0xdd, 0x7e, 0xba, 0x59, 0xd6, 0x50, 0x7e, 0xd5, 0x99, 0x6f, 0xdc, 0x81, 0x38,
-	0xfb, 0xc6, 0xb4, 0x62, 0x40, 0xbd, 0x56, 0xc5, 0xb4, 0x82, 0x61, 0xac, 0x9e, 0x51, 0xa9, 0x7a,
-	0xca, 0x83, 0xce, 0xcd, 0x32, 0x13, 0x5f, 0xc4, 0x0c, 0xdd, 0x73, 0x1a, 0x22, 0xb2, 0xef, 0x52,
-	0xb5, 0x28, 0xd5, 0xcc, 0x52, 0xc6, 0x4d, 0xf9, 0xf3, 0x46, 0x82, 0x8f, 0xf8, 0x11, 0x0e, 0xad,
-	0x91, 0xaf, 0xe9, 0xcb, 0x69, 0x14, 0x6e, 0x86, 0x3a, 0x3a, 0xc9, 0xb4, 0x0f, 0xa1, 0xc3, 0x4f,
-	0x64, 0x68, 0xca, 0x38, 0xb1, 0xdc, 0x31, 0xbd, 0x09, 0x75, 0xd4, 0x9c, 0x2e, 0xbf, 0x5f, 0x2c,
-	0x69, 0x5b, 0xf2, 0x03, 0x87, 0x50, 0xec, 0xdf, 0xae, 0x22, 0x49, 0x04, 0xa4, 0x8f, 0xa3, 0x9f,
-	0x6a, 0x6b, 0x50, 0x89, 0x48, 0x64, 0xfe, 0x98, 0x39, 0xeb, 0xca, 0x71, 0xca, 0x6e, 0x14, 0x26,
-	0x32, 0x4c, 0xd8, 0x4e, 0xba, 0x88, 0x6f, 0x3e, 0x40, 0x13, 0x15, 0xf3, 0xa5, 0xd3, 0x93, 0x01,
-	0xce, 0x22, 0x9c, 0x9b, 0xd0, 0x11, 0x9e, 0x67, 0xe0, 0xd4, 0x9e, 0xb1, 0x46, 0x5b, 0x78, 0x5e,
-	0x36, 0x9b, 0x7c, 0xc5, 0x53, 0x9e, 0x9d, 0xa7, 0x7a, 0x63, 0xf1, 0x14, 0x31, 0xf6, 0x3d, 0xeb,
-	0x6d, 0xb0, 0x30, 0xa4, 0x0c, 0x83, 0xa8, 0x27, 0x82, 0x0c, 0x8d, 0x43, 0xe0, 0x46, 0x7f, 0x1a,
-	0xef, 0xd1, 0x00, 0x23, 0xdb, 0x2e, 0xb5, 0x38, 0x45, 0xe3, 0x89, 0x4c, 0xfc, 0xc4, 0x8f, 0xc2,
-	0xf4, 0xcd, 0x67, 0x0f, 0x36, 0xfb, 0x39, 0x34, 0xad, 0x97, 0xe6, 0x9b, 0x94, 0xa8, 0xfb, 0x26,
-	0x47, 0x74, 0x36, 0x8c, 0x59, 0x74, 0xc2, 0x87, 0xba, 0xe3, 0xe4, 0x81, 0xef, 0xed, 0x9c, 0xd0,
-	0x03, 0x96, 0x18, 0xd3, 0x0a, 0x17, 0x80, 0xe2, 0xb8, 0xf1, 0x8a, 0xb5, 0x8a, 0xdf, 0x0f, 0x7c,
-	0x6a, 0x9f, 0x51, 0x52, 0xc4, 0xfd, 0x91, 0x1b, 0x8a, 0x71, 0xd6, 0xff, 0xc9, 0x20, 0x9c, 0x9e,
-	0xf5, 0x70, 0xd6, 0x8c, 0x1e, 0xce, 0x7e, 0xd9, 0x42, 0x78, 0x1c, 0xbe, 0x07, 0x1b, 0x79, 0x1b,
-	0x8b, 0xa9, 0xd3, 0xe7, 0xa9, 0x5d, 0x3b, 0x59, 0x2f, 0x0b, 0x1d, 0x05, 0x6a, 0x53, 0xbb, 0xb5,
-	0xc3, 0x95, 0xf2, 0xb6, 0xe7, 0xdd, 0x11, 0xa1, 0xd2, 0x9b, 0xa1, 0x8e, 0x30, 0x63, 0x33, 0xf8,
-	0x8d, 0x9b, 0x39, 0x0f, 0xab, 0xa8, 0xec, 0x3c, 0x58, 0xae, 0x08, 0xcf, 0x7b, 0xe0, 0x53, 0x68,
-	0x9a, 0x27, 0xb6, 0x38, 0xe0, 0x9a, 0x4b, 0x54, 0x8b, 0x4b, 0x7c, 0x94, 0x2f, 0x51, 0x7b, 0xee,
-	0x4b, 0xa7, 0x94, 0x8d, 0xc2, 0x96, 0x6e, 0xc9, 0x00, 0xb9, 0xc0, 0xa3, 0xb0, 0x7c, 0x4b, 0x68,
-	0xe3, 0xc6, 0x96, 0x3c, 0x19, 0x20, 0xad, 0x7f, 0xa3, 0x34, 0x58, 0x93, 0x32, 0x5e, 0x10, 0xaf,
-	0x43, 0x13, 0x53, 0x7b, 0x43, 0xf6, 0x4b, 0x2f, 0x23, 0x57, 0xd5, 0xb4, 0x47, 0xa6, 0xfe, 0x01,
-	0xb4, 0x06, 0x22, 0x54, 0xcf, 0x7d, 0x8b, 0xd9, 0x44, 0x6c, 0x9a, 0x79, 0x03, 0xa0, 0x17, 0x88,
-	0x7e, 0xa1, 0x85, 0x64, 0xe9, 0xd4, 0x16, 0xa1, 0x93, 0x92, 0xa9, 0x7f, 0x10, 0x1d, 0x4d, 0xbe,
-	0x11, 0x14, 0xc8, 0x7b, 0xb0, 0x32, 0x20, 0xc0, 0xc2, 0xfe, 0x41, 0xc6, 0x77, 0x34, 0x9a, 0xfd,
-	0xbf, 0x15, 0xb0, 0xbe, 0x8c, 0xe2, 0xc0, 0xdb, 0x89, 0x94, 0x22, 0x0f, 0x91, 0x76, 0x8d, 0xf5,
-	0x22, 0x65, 0xb4, 0xd2, 0xac, 0xe0, 0xe7, 0xbe, 0x67, 0xad, 0x43, 0x75, 0x34, 0xd1, 0x3e, 0xb3,
-	0x3a, 0x9a, 0x14, 0xee, 0x76, 0x6a, 0xc5, 0xbb, 0x1d, 0x3c, 0x21, 0x53, 0xd4, 0xaa, 0x99, 0xfb,
-	0x02, 0x83, 0x28, 0xfd, 0x7d, 0x0d, 0x3a, 0xde, 0x34, 0x16, 0x74, 0x78, 0x09, 0x45, 0xbf, 0xb9,
-	0xa7, 0x40, 0x42, 0xc2, 0x84, 0x96, 0xa9, 0xf8, 0xde, 0xd3, 0xbc, 0xe0, 0x42, 0xc8, 0xbe, 0xf7,
-	0xd4, 0xba, 0x0c, 0x9b, 0x7a, 0x98, 0xf8, 0x25, 0x8f, 0xce, 0x59, 0xef, 0x3a, 0xc3, 0x71, 0x5f,
-	0xe4, 0xd7, 0xff, 0xaf, 0x82, 0x8e, 0x94, 0xda, 0xcb, 0xa3, 0xe1, 0x82, 0x34, 0x2b, 0xed, 0x30,
-	0xab, 0x1a, 0x1d, 0x66, 0x17, 0xd8, 0x2e, 0xcc, 0xd7, 0x68, 0x35, 0xed, 0xa5, 0xa5, 0xd0, 0x5c,
-	0x48, 0x6e, 0x4d, 0xd2, 0x70, 0x8c, 0x01, 0x92, 0x3e, 0xae, 0x5f, 0xcb, 0x33, 0xc6, 0xba, 0xd3,
-	0xd6, 0x30, 0x6d, 0x02, 0x85, 0xa0, 0xb7, 0x72, 0x9a, 0xac, 0x00, 0x19, 0x4b, 0xf4, 0xed, 0xf9,
-	0xea, 0xa5, 0xda, 0xe5, 0x96, 0xb3, 0xaa, 0x12, 0xbe, 0x9e, 0xbf, 0x0d, 0x6b, 0xd9, 0x56, 0xb9,
-	0x4f, 0xa3, 0x19, 0x44, 0x43, 0xd3, 0xb6, 0x67, 0x7a, 0x69, 0x4c, 0xb9, 0x38, 0xab, 0x41, 0xc4,
-	0x8d, 0x34, 0x63, 0x38, 0xc3, 0x0d, 0x6a, 0xea, 0xca, 0xc1, 0x89, 0x7a, 0xcc, 0x97, 0x92, 0x67,
-	0xa1, 0x31, 0x8e, 0x42, 0x79, 0xa2, 0xdf, 0x86, 0xf9, 0xc3, 0x7a, 0x1d, 0xd6, 0x93, 0x28, 0x11,
-	0x81, 0x1b, 0xcb, 0xfe, 0x48, 0xc4, 0x43, 0x96, 0x61, 0xd5, 0xe9, 0x10, 0xd4, 0xd1, 0x40, 0x8c,
-	0xbc, 0xc7, 0xbe, 0x7e, 0x5f, 0x4e, 0xf3, 0xef, 0x63, 0x9f, 0xdf, 0x74, 0xed, 0x17, 0xd2, 0x7e,
-	0x6d, 0x47, 0x2a, 0x5a, 0xef, 0x7e, 0x32, 0xb0, 0xff, 0x88, 0xae, 0x47, 0xd8, 0x31, 0x90, 0x7d,
-	0xf2, 0xad, 0x51, 0x79, 0x50, 0xc6, 0x02, 0x72, 0xea, 0x07, 0xc6, 0xad, 0xee, 0x2a, 0x7d, 0x73,
-	0xbb, 0x63, 0xda, 0xb5, 0x65, 0x54, 0x16, 0xba, 0x33, 0x0b, 0x95, 0x79, 0x19, 0x36, 0x3d, 0x89,
-	0x86, 0xc4, 0x57, 0xe7, 0x86, 0xcd, 0xae, 0x13, 0x9c, 0xae, 0x92, 0xa9, 0x6d, 0x5d, 0xc2, 0x05,
-	0xee, 0x23, 0xde, 0x8d, 0x82, 0x40, 0xf6, 0xd1, 0x54, 0x97, 0x31, 0x75, 0x1e, 0x56, 0xfb, 0x22,
-	0xbf, 0x69, 0x6e, 0x38, 0x2b, 0xf8, 0xb9, 0x4f, 0x4d, 0x2b, 0x34, 0x60, 0x4a, 0xa3, 0x85, 0x10,
-	0x16, 0xc7, 0x17, 0xa8, 0x44, 0x3c, 0xe2, 0x87, 0x32, 0x41, 0xca, 0x6f, 0x40, 0x6d, 0x22, 0x93,
-	0x85, 0x6d, 0x84, 0x87, 0x32, 0x71, 0x10, 0x01, 0x85, 0x10, 0x44, 0xc2, 0x73, 0xd1, 0x0b, 0xf0,
-	0x3f, 0x3f, 0xac, 0xe2, 0xf7, 0xed, 0xd0, 0xb3, 0xc3, 0xd4, 0x6b, 0xe4, 0x3d, 0xe1, 0xdc, 0x6e,
-	0xf5, 0x75, 0x1a, 0xc9, 0x97, 0xac, 0xf7, 0xb7, 0x74, 0x6d, 0x7b, 0x28, 0x93, 0x2f, 0xa6, 0x32,
-	0x3e, 0xd9, 0x56, 0xca, 0x57, 0x59, 0x8f, 0xcb, 0x2e, 0x9c, 0x79, 0x8c, 0x50, 0x57, 0x10, 0xd8,
-	0x34, 0xce, 0xa2, 0xd7, 0xe2, 0x69, 0x64, 0x99, 0x1b, 0x8f, 0x73, 0x3a, 0x33, 0x6f, 0xed, 0xd5,
-	0xc2, 0x5b, 0xfb, 0x12, 0xb7, 0x64, 0xda, 0x48, 0xbd, 0x60, 0x23, 0xf6, 0x71, 0x39, 0xb7, 0x18,
-	0xef, 0xf2, 0x85, 0x2a, 0x85, 0x85, 0x4a, 0x77, 0x51, 0x3d, 0xdd, 0x2e, 0xec, 0x2f, 0xd0, 0xf0,
-	0x0f, 0x65, 0xd2, 0x95, 0x09, 0x43, 0xb5, 0x52, 0xe6, 0x25, 0x73, 0xb1, 0x84, 0x26, 0x35, 0xe6,
-	0x51, 0x72, 0x2e, 0x72, 0x92, 0xff, 0x54, 0xa5, 0x63, 0x23, 0x93, 0x9d, 0x28, 0xf4, 0xf2, 0xa5,
-	0x50, 0xf0, 0xaf, 0x00, 0xb5, 0xb4, 0xcd, 0xd4, 0x71, 0x08, 0xe2, 0x3a, 0x6e, 0x07, 0x36, 0xfa,
-	0x51, 0xe8, 0x51, 0x7a, 0xf4, 0xdd, 0xe7, 0xac, 0x37, 0xd7, 0xf3, 0x19, 0x24, 0x64, 0x93, 0xc6,
-	0x95, 0xe7, 0xac, 0x78, 0x72, 0x1a, 0x57, 0xe6, 0x68, 0x5c, 0x35, 0x9b, 0x31, 0x9e, 0x8b, 0xc6,
-	0xd5, 0x54, 0xd9, 0x99, 0x1d, 0x34, 0x16, 0xdb, 0xc1, 0x4a, 0xd1, 0x0e, 0xe2, 0x52, 0xd9, 0xa1,
-	0x19, 0x3c, 0x4b, 0x76, 0x1f, 0x14, 0x95, 0xf6, 0x0c, 0x43, 0x30, 0x15, 0x76, 0x5d, 0xaf, 0xb9,
-	0xed, 0x1d, 0x6f, 0xf7, 0x47, 0xbe, 0x3c, 0x96, 0x63, 0xcc, 0xaa, 0xe5, 0x63, 0xeb, 0x1b, 0x00,
-	0x13, 0x99, 0x14, 0x97, 0x6c, 0x4e, 0x64, 0x42, 0x2b, 0xda, 0x7f, 0x5a, 0x29, 0x9d, 0x88, 0xcc,
-	0x2e, 0x9d, 0x68, 0xbd, 0x09, 0x9b, 0x22, 0xc7, 0x37, 0x9b, 0x79, 0x36, 0x0c, 0x38, 0xc5, 0xe0,
-	0x0f, 0xa0, 0x41, 0x29, 0xe6, 0x29, 0x32, 0x37, 0x9e, 0x60, 0x3f, 0x44, 0x57, 0x39, 0xc7, 0x5c,
-	0x97, 0x1d, 0xda, 0x72, 0xfe, 0x2e, 0x42, 0x4b, 0x78, 0xc7, 0xda, 0x39, 0xea, 0x22, 0x4d, 0x78,
-	0xc7, 0xec, 0x1b, 0x4f, 0xa8, 0x65, 0x9e, 0x2f, 0xab, 0x70, 0xbd, 0xdc, 0xff, 0xd2, 0x73, 0x29,
-	0x06, 0x22, 0xb3, 0x9b, 0x10, 0x08, 0xc4, 0x4d, 0x57, 0xef, 0xe8, 0xde, 0xb6, 0x6a, 0xd9, 0xbf,
-	0x6a, 0xe4, 0x14, 0xb9, 0xb5, 0x2d, 0x75, 0xe7, 0xb5, 0xfc, 0x41, 0xe5, 0x00, 0xb6, 0x78, 0x69,
-	0x72, 0x87, 0xa7, 0x5c, 0x7c, 0xfe, 0x7d, 0xe6, 0x21, 0x96, 0x04, 0xb7, 0x9f, 0x4e, 0x24, 0x9b,
-	0xed, 0xad, 0x9d, 0xbb, 0x32, 0x98, 0xa0, 0xda, 0x6d, 0xe8, 0xf4, 0xa4, 0x3b, 0x92, 0xc1, 0x44,
-	0x7a, 0x46, 0x82, 0xdb, 0xee, 0xc9, 0xbb, 0x04, 0x7b, 0xc0, 0xf1, 0x6e, 0x41, 0xbe, 0x6d, 0x07,
-	0x65, 0x74, 0x17, 0x67, 0xee, 0x73, 0xab, 0x55, 0x97, 0xaf, 0x56, 0x2b, 0xae, 0xe6, 0xa2, 0xe7,
-	0xc4, 0xc0, 0xb2, 0x1f, 0x1e, 0xfb, 0x89, 0x48, 0x2b, 0x2b, 0x94, 0xc9, 0x2d, 0xd8, 0xf0, 0x33,
-	0xe0, 0xe2, 0xe7, 0x75, 0x6e, 0x29, 0x4c, 0xf1, 0x9c, 0xf5, 0x7c, 0x0e, 0x3d, 0x38, 0xfe, 0x67,
-	0x1d, 0x43, 0x57, 0x8e, 0x90, 0x16, 0xc3, 0x17, 0xa1, 0xd5, 0x13, 0x4a, 0xba, 0x4a, 0x1c, 0x4b,
-	0xed, 0x9a, 0x9b, 0x3d, 0xfd, 0xef, 0x5e, 0x38, 0xd8, 0x0f, 0xfc, 0x3e, 0x37, 0xd7, 0x69, 0x13,
-	0x22, 0xc0, 0xfd, 0xe9, 0xd8, 0xba, 0x06, 0xe7, 0xa8, 0xb6, 0x33, 0x98, 0x0b, 0xa7, 0xe3, 0x5e,
-	0xd6, 0x35, 0x77, 0x16, 0x47, 0xf3, 0x05, 0xef, 0xd3, 0x18, 0x37, 0x9a, 0xd2, 0x7f, 0xb6, 0x4d,
-	0xb3, 0xf8, 0xd1, 0x62, 0xc8, 0x83, 0xb4, 0x07, 0x8f, 0x86, 0xb3, 0x3b, 0xdf, 0x46, 0xda, 0x83,
-	0x87, 0xe0, 0xb4, 0xc5, 0xf1, 0x2d, 0x38, 0xc3, 0x9c, 0x8d, 0x25, 0x92, 0xcd, 0xb3, 0xbf, 0xba,
-	0xb3, 0x41, 0x03, 0x07, 0x04, 0x27, 0x47, 0xf5, 0x3e, 0x6c, 0x31, 0x6e, 0x2c, 0x27, 0x81, 0x38,
-	0x71, 0xf5, 0x02, 0x59, 0xde, 0x57, 0x77, 0x5e, 0xa4, 0x71, 0x87, 0x86, 0x0f, 0x68, 0x54, 0x97,
-	0xf0, 0xad, 0xbc, 0xc7, 0x9c, 0x6f, 0x7b, 0xbf, 0x59, 0x90, 0x79, 0xbe, 0xbb, 0xac, 0x57, 0xbd,
-	0x99, 0xa4, 0x5d, 0xea, 0x5d, 0x78, 0x81, 0x2e, 0x00, 0x98, 0xc1, 0xcc, 0x8b, 0xb6, 0x88, 0xce,
-	0xb7, 0x16, 0xd0, 0x61, 0xb6, 0x1f, 0x0a, 0xbe, 0xc6, 0xdb, 0x14, 0x9e, 0xc7, 0x10, 0xfd, 0xbf,
-	0x1d, 0xd6, 0xb7, 0xe1, 0x05, 0xba, 0x79, 0x98, 0x21, 0x0a, 0xdc, 0x66, 0xe2, 0xc9, 0xa0, 0x88,
-	0xfe, 0x29, 0xac, 0x21, 0x0f, 0x59, 0xee, 0xda, 0xa6, 0xc5, 0x5f, 0x59, 0xb0, 0x78, 0x9a, 0xbf,
-	0x82, 0xf0, 0xbc, 0x7b, 0x9c, 0xc2, 0x92, 0xbe, 0x78, 0x31, 0xb4, 0x81, 0x35, 0x7d, 0x0f, 0x41,
-	0x90, 0xfb, 0xd3, 0xb1, 0xfd, 0xeb, 0x78, 0x98, 0x73, 0x0a, 0x7b, 0x52, 0xeb, 0x59, 0xff, 0x17,
-	0xec, 0x50, 0x66, 0x46, 0xc1, 0xb6, 0xd5, 0x1a, 0xca, 0x72, 0x4b, 0xa8, 0xce, 0x58, 0x82, 0x3d,
-	0x58, 0x40, 0x19, 0x8f, 0xe0, 0xdb, 0x70, 0x66, 0xde, 0xea, 0xf4, 0x3f, 0x49, 0xfa, 0xcb, 0x2d,
-	0x6e, 0x6e, 0x9d, 0xf7, 0xe1, 0x65, 0x73, 0x1d, 0x9e, 0xf4, 0x40, 0xe5, 0xef, 0xf1, 0x98, 0xb9,
-	0x98, 0x2b, 0xe8, 0x2f, 0xfb, 0xaf, 0x2a, 0xcb, 0x66, 0x2e, 0xf6, 0x14, 0x59, 0x30, 0xa8, 0x9e,
-	0x32, 0x18, 0xcc, 0xe8, 0xa2, 0x36, 0xa3, 0x0b, 0x83, 0xd1, 0x7a, 0x81, 0xd1, 0x1f, 0x53, 0xaf,
-	0xd1, 0xac, 0x8d, 0xdd, 0x8f, 0x12, 0xbf, 0x2f, 0xd9, 0xda, 0xd1, 0x11, 0x14, 0xc5, 0x54, 0x99,
-	0x3d, 0x98, 0xe6, 0x4d, 0x4e, 0xb5, 0x78, 0x93, 0xf3, 0x1e, 0x34, 0xa8, 0x24, 0xd3, 0xd1, 0x6d,
-	0x49, 0x76, 0xc1, 0x78, 0xf6, 0x1f, 0xf0, 0xa5, 0x88, 0x60, 0xc7, 0xff, 0xdd, 0xef, 0x7c, 0x27,
-	0x75, 0x46, 0x1f, 0x42, 0x0b, 0xfd, 0xd0, 0xf2, 0x9b, 0x28, 0x63, 0x9e, 0xd3, 0x54, 0x3a, 0x77,
-	0xb3, 0xae, 0x1b, 0x15, 0x5a, 0xd9, 0x25, 0x82, 0x31, 0xeb, 0x5e, 0x34, 0xcc, 0x4b, 0xb4, 0x03,
-	0x74, 0xbc, 0xdc, 0x71, 0x95, 0x75, 0xed, 0x17, 0x3b, 0x84, 0x8d, 0x4a, 0xe4, 0x12, 0xac, 0x65,
-	0xcd, 0xff, 0x79, 0x39, 0x02, 0x8f, 0xf4, 0xc4, 0x7d, 0xcf, 0xee, 0xc2, 0xc5, 0xc2, 0xce, 0xbe,
-	0x1c, 0x49, 0x19, 0xdc, 0x8b, 0x86, 0xdb, 0x1e, 0x5d, 0xa5, 0x5e, 0x9b, 0xab, 0x23, 0x8b, 0xd2,
-	0x4a, 0xd1, 0x8b, 0x65, 0xe4, 0x3e, 0x58, 0xba, 0x57, 0x2c, 0xbd, 0x6f, 0x41, 0x5a, 0x57, 0xe7,
-	0x85, 0x35, 0xff, 0xaf, 0x03, 0x34, 0x2b, 0x17, 0x53, 0xfa, 0x2f, 0xb9, 0xc2, 0x9b, 0xfb, 0x97,
-	0x5c, 0xe1, 0x2d, 0xf9, 0x97, 0x5c, 0xe1, 0x39, 0x84, 0x62, 0x7f, 0x3f, 0x17, 0xd7, 0x2c, 0x95,
-	0xd2, 0xc2, 0x0d, 0x27, 0x19, 0x85, 0x1b, 0x7e, 0xee, 0xf3, 0xdd, 0x2f, 0x96, 0xa2, 0x59, 0x33,
-	0x04, 0x7e, 0xf0, 0x36, 0x31, 0x06, 0x66, 0x5b, 0xd5, 0xdb, 0xa4, 0xea, 0xe8, 0x79, 0xb6, 0x89,
-	0x88, 0xb4, 0xcd, 0x5d, 0x34, 0xb0, 0x2f, 0x7d, 0x35, 0xda, 0x89, 0x9e, 0x9a, 0x3c, 0xbe, 0x0d,
-	0x8d, 0x27, 0xbe, 0x1a, 0xa9, 0x85, 0x5b, 0xc5, 0x39, 0x0e, 0xe3, 0xd8, 0x3f, 0xa2, 0xff, 0xb2,
-	0xd8, 0x39, 0x32, 0x85, 0xfe, 0x21, 0xac, 0xf5, 0x12, 0xb7, 0x17, 0x05, 0xbe, 0xc9, 0x50, 0x31,
-	0x41, 0xdd, 0x39, 0xda, 0x89, 0x02, 0x9f, 0x3d, 0x69, 0x2f, 0x49, 0x7f, 0x5b, 0xd7, 0x74, 0xa4,
-	0x35, 0xfe, 0x75, 0x6a, 0x6e, 0x9e, 0x50, 0x5c, 0x89, 0x50, 0x08, 0xc6, 0x5f, 0x3b, 0x9b, 0xdf,
-	0x5f, 0x7f, 0xf7, 0xbd, 0x8f, 0x0c, 0xb4, 0xde, 0x0a, 0xfd, 0xb9, 0xfa, 0xb3, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x42, 0x41, 0xc2, 0xeb, 0xa4, 0x40, 0x00, 0x00,
+	0x1c, 0xac, 0xf8, 0xea, 0x2e, 0x56, 0x64, 0xfa, 0x9a, 0x88, 0xbf, 0xec, 0x3f, 0xae, 0xce, 0x73,
+	0x8d, 0x76, 0x9e, 0x19, 0x70, 0xc5, 0x34, 0x60, 0x0b, 0xea, 0x28, 0x55, 0xe2, 0xae, 0xe3, 0xd0,
+	0x6f, 0xcc, 0x67, 0x49, 0xd2, 0xec, 0x4b, 0x14, 0xb1, 0xd6, 0x71, 0xda, 0x08, 0x63, 0x47, 0xa2,
+	0xac, 0x5d, 0xd8, 0x40, 0x85, 0x68, 0x6f, 0x63, 0x84, 0x9e, 0x99, 0xaa, 0x3a, 0x9b, 0x42, 0xec,
+	0x77, 0x92, 0x68, 0xc2, 0x9f, 0x14, 0x23, 0xce, 0xc1, 0x4a, 0x18, 0x25, 0xfe, 0xe0, 0x84, 0x54,
+	0xde, 0x74, 0xf4, 0x97, 0x75, 0x19, 0x36, 0xb9, 0x68, 0x73, 0x53, 0x01, 0x79, 0xa4, 0xf1, 0xba,
+	0xb3, 0xde, 0x33, 0x25, 0xe2, 0x61, 0x2c, 0xd5, 0x28, 0x28, 0x62, 0x57, 0x25, 0x62, 0x3c, 0xd9,
+	0x5a, 0x25, 0xd4, 0x0d, 0x1e, 0x40, 0x51, 0x77, 0x11, 0x6c, 0x27, 0x59, 0xf6, 0x8a, 0x5c, 0xa5,
+	0x37, 0x78, 0x17, 0xa1, 0x45, 0x7b, 0x35, 0xf2, 0xe5, 0x26, 0x02, 0xf0, 0x10, 0xe1, 0xa0, 0x4a,
+	0x44, 0x8c, 0x75, 0xd9, 0x53, 0x92, 0x50, 0xc3, 0x69, 0x12, 0x60, 0xdf, 0x7b, 0x8a, 0x9e, 0x90,
+	0x3c, 0xae, 0x92, 0x42, 0x45, 0xd9, 0xed, 0x55, 0xc3, 0x59, 0x43, 0x68, 0x97, 0x80, 0xfb, 0x9e,
+	0xfd, 0x3f, 0x95, 0xb9, 0x65, 0x17, 0x2b, 0xe3, 0x7d, 0xcd, 0x8c, 0x91, 0x66, 0x14, 0x5d, 0x64,
+	0x46, 0x87, 0xc4, 0x49, 0x8c, 0x92, 0x24, 0x91, 0x51, 0x19, 0x0c, 0xe8, 0x80, 0x68, 0x36, 0x9a,
+	0x08, 0x40, 0xd4, 0xe2, 0x16, 0xeb, 0xcb, 0xb6, 0xd8, 0x98, 0xd9, 0xe2, 0x1b, 0xb0, 0x91, 0x91,
+	0xd5, 0x87, 0x93, 0x4f, 0x5e, 0x27, 0x25, 0x4e, 0xc7, 0xd3, 0xfe, 0x4d, 0x2c, 0xad, 0x33, 0xde,
+	0x1c, 0xf9, 0x44, 0xc4, 0x5e, 0xb9, 0x77, 0xce, 0xfc, 0x43, 0x75, 0xc6, 0x3f, 0xcc, 0x4a, 0xb1,
+	0xa9, 0x52, 0x09, 0xfe, 0xa0, 0x84, 0x38, 0x8a, 0xb0, 0xb0, 0xe7, 0xca, 0xcc, 0x9e, 0x2f, 0xc3,
+	0x66, 0x4c, 0x98, 0x86, 0x7a, 0x78, 0xc9, 0x75, 0x86, 0x67, 0x0a, 0xfa, 0x61, 0x81, 0xfc, 0x83,
+	0x89, 0x27, 0x12, 0x3a, 0xe4, 0xf3, 0xea, 0xad, 0xcc, 0xab, 0x97, 0xae, 0xf1, 0x78, 0x1d, 0xf3,
+	0x28, 0x70, 0xb5, 0xa6, 0x39, 0xc8, 0x0d, 0xde, 0xfe, 0x8b, 0x4a, 0xc9, 0x62, 0x8b, 0xcd, 0x61,
+	0x7f, 0x21, 0xf1, 0xd9, 0x73, 0xf6, 0x99, 0x3c, 0x79, 0x28, 0x82, 0xa9, 0x44, 0x95, 0x5e, 0xbf,
+	0x36, 0xbf, 0x72, 0xa9, 0x3c, 0x6a, 0xa5, 0xf2, 0x18, 0xc1, 0xab, 0xdd, 0xee, 0x6e, 0x1c, 0x29,
+	0xf5, 0x1b, 0x53, 0x11, 0xde, 0x15, 0xe1, 0xf0, 0x28, 0xf6, 0x45, 0xf0, 0x0b, 0x50, 0xec, 0x0f,
+	0x9f, 0xb5, 0xd2, 0xcf, 0x51, 0xcb, 0x4f, 0x16, 0xaf, 0xf5, 0x8b, 0x55, 0xf9, 0x4f, 0x2a, 0xcf,
+	0x5a, 0xf9, 0x97, 0x4c, 0xff, 0x7f, 0x56, 0x81, 0x2d, 0x5d, 0x1c, 0x1f, 0x0a, 0xa5, 0xf2, 0x70,
+	0x88, 0xb1, 0xf4, 0x13, 0xe8, 0x50, 0xf5, 0xeb, 0xf6, 0x0a, 0x37, 0x2d, 0x45, 0x66, 0x68, 0x6e,
+	0x7e, 0x81, 0xd0, 0xa6, 0x19, 0x3b, 0x7c, 0xc9, 0x52, 0xea, 0xb0, 0xab, 0xa5, 0x0e, 0x1b, 0xd3,
+	0x30, 0x5f, 0xb9, 0x43, 0x7e, 0x21, 0x69, 0x3a, 0x75, 0x5f, 0xed, 0x8d, 0xed, 0x1b, 0x98, 0xc8,
+	0xd1, 0x0a, 0x07, 0x7e, 0x68, 0x04, 0x7b, 0xf9, 0x18, 0x73, 0x57, 0x66, 0x8e, 0x82, 0xb2, 0x16,
+	0x25, 0x10, 0x88, 0x42, 0xa1, 0xfd, 0x1f, 0x15, 0xe8, 0x14, 0xa6, 0xe2, 0x14, 0x33, 0x0b, 0xd0,
+	0x53, 0x06, 0x19, 0x59, 0xeb, 0x03, 0x68, 0xe0, 0x3e, 0x95, 0x2e, 0x81, 0x9f, 0xe7, 0xc2, 0x84,
+	0x27, 0x20, 0x69, 0x63, 0xa7, 0x3a, 0xc1, 0x80, 0x7c, 0x8f, 0x88, 0xa0, 0xa3, 0x1c, 0x21, 0xd4,
+	0x29, 0xc8, 0x02, 0x83, 0x08, 0xe1, 0x75, 0xd0, 0xe1, 0xce, 0x3d, 0x96, 0xb1, 0xf2, 0xa3, 0x50,
+	0xfb, 0xe7, 0x0e, 0x43, 0x1f, 0x32, 0xd0, 0xfe, 0xd7, 0x4a, 0xb9, 0x48, 0x74, 0xd2, 0xcd, 0x22,
+	0xd1, 0xca, 0x9a, 0x8f, 0x28, 0x85, 0x79, 0x4e, 0x8b, 0xb0, 0x49, 0x53, 0x65, 0x41, 0xb8, 0xfa,
+	0xfc, 0x41, 0xb8, 0x56, 0xae, 0xd3, 0x3c, 0xe4, 0xd7, 0xcd, 0x90, 0x6f, 0xbf, 0x8d, 0x7b, 0x40,
+	0x7b, 0x3b, 0xca, 0xd4, 0xc5, 0x7e, 0xa0, 0xc4, 0xd7, 0xd8, 0xd7, 0x61, 0x3d, 0x47, 0x23, 0x66,
+	0xd3, 0x2c, 0x46, 0x5f, 0x78, 0x51, 0x16, 0x33, 0x97, 0xf7, 0xd9, 0x71, 0xf9, 0x22, 0xcf, 0x74,
+	0x33, 0x37, 0x0a, 0x52, 0x2c, 0x3b, 0x7f, 0x45, 0x76, 0x0c, 0x31, 0xda, 0xa1, 0x2e, 0x3c, 0xee,
+	0xc4, 0xbe, 0x0c, 0xbd, 0xa3, 0x14, 0x5e, 0xee, 0x44, 0x2f, 0x40, 0x73, 0xe6, 0xc6, 0x6f, 0x75,
+	0xca, 0x77, 0x7d, 0xe8, 0x21, 0x7a, 0x72, 0xe8, 0x87, 0x69, 0x62, 0x4d, 0x1f, 0xf4, 0x0e, 0x14,
+	0xa6, 0x09, 0x20, 0xfe, 0xb4, 0xff, 0xb2, 0x52, 0xbe, 0x60, 0x79, 0xa5, 0x63, 0x98, 0x77, 0xed,
+	0x74, 0xe6, 0x7d, 0x16, 0x1a, 0x03, 0x3f, 0x14, 0x81, 0x3e, 0x9c, 0xfc, 0x91, 0x73, 0x59, 0x2f,
+	0xe1, 0xb2, 0x91, 0x73, 0xf9, 0x16, 0x66, 0xeb, 0x9f, 0x87, 0x81, 0x1f, 0xca, 0x3d, 0x99, 0x60,
+	0x8d, 0xb1, 0x50, 0x28, 0xf6, 0xa0, 0x14, 0x17, 0xf7, 0x73, 0x03, 0x5a, 0x58, 0xc5, 0xf0, 0x1d,
+	0x15, 0x1b, 0x77, 0x31, 0x7f, 0x46, 0x64, 0xf3, 0x66, 0xc6, 0x69, 0xc6, 0xba, 0x1a, 0x2a, 0xb1,
+	0x8e, 0x3f, 0xa4, 0x6c, 0x3f, 0x2d, 0x97, 0xf2, 0x6c, 0x7f, 0x5e, 0x6a, 0x17, 0xf5, 0xba, 0x94,
+	0x50, 0xe9, 0xb4, 0x10, 0x01, 0x94, 0x50, 0x95, 0x57, 0x40, 0xe7, 0x60, 0x85, 0x7e, 0x5c, 0x49,
+	0x93, 0x75, 0xfe, 0xca, 0xe0, 0x57, 0xb5, 0x74, 0xf4, 0x97, 0xfd, 0x37, 0x25, 0xcc, 0x94, 0xab,
+	0x70, 0x29, 0x33, 0x2f, 0x03, 0xd0, 0x60, 0x1c, 0x4d, 0xc3, 0xd4, 0xe1, 0x13, 0xba, 0x83, 0x80,
+	0x9c, 0xd7, 0x7a, 0x39, 0xaf, 0x8d, 0x05, 0xbc, 0xae, 0x14, 0x78, 0x25, 0x05, 0x69, 0xd5, 0xf0,
+	0xfb, 0xf0, 0xe2, 0x34, 0xe1, 0x6b, 0x70, 0x6b, 0xff, 0xa8, 0x52, 0xba, 0xd0, 0x57, 0x10, 0xcb,
+	0x39, 0x58, 0xe1, 0xa8, 0xa7, 0xad, 0x57, 0x7f, 0x51, 0xe1, 0xc3, 0x51, 0x92, 0x59, 0x60, 0xb1,
+	0xb4, 0x19, 0x96, 0x31, 0x71, 0x36, 0x63, 0xa2, 0x3b, 0x8a, 0x26, 0x8b, 0x4f, 0xf3, 0x52, 0x16,
+	0xd0, 0xe1, 0x8c, 0xa2, 0x89, 0x59, 0xbb, 0x37, 0x11, 0x40, 0x83, 0xaf, 0x40, 0x5b, 0x4d, 0x7b,
+	0x2e, 0x21, 0x64, 0x6d, 0x00, 0x2d, 0x35, 0xed, 0xd1, 0x82, 0x9e, 0xfd, 0x2f, 0x65, 0x4c, 0x7c,
+	0x0d, 0xf3, 0x50, 0x89, 0x18, 0x4a, 0x53, 0xe0, 0x5d, 0x04, 0xcc, 0xe8, 0xa3, 0x3e, 0x6b, 0x3d,
+	0x85, 0x2d, 0x34, 0x96, 0x6f, 0x61, 0x65, 0x76, 0x0b, 0x7f, 0x42, 0x06, 0x6e, 0x6c, 0x61, 0x67,
+	0x7a, 0xf2, 0xf3, 0x16, 0xe3, 0x05, 0x68, 0x0e, 0xa3, 0xc8, 0x53, 0xb9, 0x0c, 0x57, 0xe9, 0x9b,
+	0x2b, 0x73, 0x1e, 0x0a, 0xa7, 0xe3, 0x94, 0x77, 0x02, 0xdc, 0x9f, 0x8e, 0xed, 0xff, 0x2a, 0xe1,
+	0xed, 0x97, 0x4b, 0xba, 0xe6, 0xce, 0x56, 0x96, 0xec, 0x6c, 0x75, 0x66, 0x67, 0xdb, 0x74, 0xff,
+	0xc4, 0x1b, 0x23, 0x87, 0x78, 0x6a, 0x89, 0xdb, 0xff, 0x5c, 0x9d, 0xa1, 0xb1, 0x38, 0x7f, 0x9d,
+	0xbf, 0x79, 0x59, 0x5a, 0xa7, 0x5e, 0x80, 0x66, 0x76, 0xd7, 0x55, 0xa7, 0x39, 0xab, 0x52, 0x5f,
+	0x74, 0x15, 0x38, 0x6a, 0xcc, 0xc8, 0xf9, 0x1a, 0x34, 0x93, 0x68, 0xc2, 0x51, 0x60, 0x85, 0xa2,
+	0xc0, 0x85, 0xb9, 0x28, 0x80, 0x0b, 0x1c, 0x45, 0x93, 0xab, 0xce, 0x6a, 0xc2, 0xaf, 0x46, 0x28,
+	0x7e, 0x62, 0x85, 0x93, 0xc5, 0x55, 0x6d, 0x9f, 0x32, 0x18, 0x50, 0x18, 0xb7, 0xae, 0x42, 0x93,
+	0x6e, 0xc1, 0x91, 0x68, 0xb3, 0xa4, 0xc5, 0x03, 0x89, 0xea, 0x8b, 0x73, 0x67, 0x75, 0xc2, 0x3f,
+	0xb0, 0x80, 0xe8, 0x4f, 0x63, 0xd7, 0x50, 0x6b, 0x8b, 0x0b, 0x88, 0xfe, 0x34, 0x76, 0x32, 0x3f,
+	0xe6, 0xa5, 0x3d, 0x18, 0x08, 0xf9, 0xaa, 0xbe, 0x92, 0xd2, 0x4b, 0x72, 0x55, 0x86, 0xe9, 0x03,
+	0x83, 0x48, 0x4f, 0xff, 0x5e, 0x99, 0x5b, 0xe6, 0x94, 0x9a, 0xca, 0x17, 0xaf, 0x2d, 0x5f, 0xbc,
+	0x3e, 0xbb, 0xb8, 0x75, 0x1d, 0x5a, 0x7e, 0x22, 0xc7, 0x9c, 0xc9, 0x34, 0x4a, 0x74, 0x62, 0x16,
+	0x2c, 0x4e, 0x13, 0x71, 0x29, 0xcb, 0x29, 0x9e, 0x89, 0x95, 0xd9, 0x08, 0xf0, 0x3b, 0x15, 0x58,
+	0xc3, 0xed, 0x1c, 0xe8, 0xf7, 0xa6, 0x12, 0xa1, 0xdd, 0xc8, 0x58, 0x33, 0x8a, 0xa5, 0x25, 0x6b,
+	0x6b, 0xae, 0x69, 0x75, 0xba, 0x17, 0xf4, 0x03, 0x77, 0x22, 0x62, 0x31, 0x36, 0xdf, 0x65, 0x3a,
+	0x08, 0x3e, 0x44, 0x28, 0xd5, 0x74, 0x7f, 0x57, 0x81, 0x8b, 0x1c, 0x9c, 0xb3, 0x97, 0xa3, 0xac,
+	0x66, 0xc5, 0x2a, 0xe9, 0x15, 0x68, 0x13, 0x9d, 0xfe, 0x60, 0x98, 0x17, 0x91, 0x2d, 0x04, 0xed,
+	0x0e, 0x86, 0x7c, 0x44, 0x69, 0xdc, 0x54, 0x2c, 0x02, 0x52, 0xd1, 0xd1, 0x20, 0x59, 0x5e, 0x6d,
+	0x81, 0x39, 0xa7, 0x02, 0xe0, 0x79, 0xa9, 0x3d, 0x2f, 0x71, 0x27, 0xfc, 0x3e, 0x9f, 0x5a, 0xc3,
+	0x33, 0x6a, 0xf9, 0xeb, 0x66, 0x5e, 0xf5, 0x4c, 0x09, 0x66, 0x39, 0x95, 0xfd, 0xd7, 0x15, 0x58,
+	0xcf, 0x69, 0x97, 0x70, 0x55, 0x99, 0x75, 0x72, 0xe6, 0xed, 0x63, 0x9a, 0xb7, 0xcf, 0x68, 0xb0,
+	0xf6, 0x35, 0x35, 0x58, 0x2f, 0xd3, 0xe0, 0x8f, 0x0b, 0x9c, 0xa6, 0x57, 0x68, 0x8b, 0x4f, 0xdb,
+	0x4d, 0xa0, 0xdb, 0x4f, 0x37, 0xcb, 0x1a, 0xca, 0xaf, 0x3a, 0xf3, 0x8d, 0x3b, 0x10, 0x67, 0xdf,
+	0x98, 0x56, 0x0c, 0xa8, 0xd7, 0xaa, 0x98, 0x56, 0x30, 0x8c, 0xd5, 0x33, 0x2a, 0x55, 0x4f, 0x79,
+	0xd0, 0xb9, 0x59, 0x66, 0xe2, 0x8b, 0x98, 0xa1, 0x7b, 0x4e, 0x43, 0x44, 0xf6, 0x5d, 0xaa, 0x16,
+	0xa5, 0x9a, 0x59, 0xca, 0xb8, 0x29, 0x7f, 0xde, 0x48, 0xf0, 0x11, 0x3f, 0xc2, 0xa1, 0x35, 0xf2,
+	0x35, 0x7d, 0x39, 0x8d, 0xc2, 0xcd, 0x50, 0x47, 0x27, 0x99, 0xf6, 0x21, 0x74, 0xf8, 0x89, 0x0c,
+	0x4d, 0x19, 0x27, 0x96, 0x3b, 0xa6, 0x37, 0xa1, 0x8e, 0x9a, 0xd3, 0xe5, 0xf7, 0x8b, 0x25, 0x6d,
+	0x4b, 0x7e, 0xe0, 0x10, 0x8a, 0xfd, 0xdb, 0x55, 0x24, 0x89, 0x80, 0xf4, 0x71, 0xf4, 0x53, 0x6d,
+	0x0d, 0x2a, 0x11, 0x89, 0xcc, 0x1f, 0x33, 0x67, 0x5d, 0x39, 0x4e, 0xd9, 0x8d, 0xc2, 0x44, 0x86,
+	0x09, 0xdb, 0x49, 0x17, 0xf1, 0xcd, 0x07, 0x68, 0xa2, 0x62, 0xbe, 0x74, 0x7a, 0x32, 0xc0, 0x59,
+	0x84, 0x73, 0x13, 0x3a, 0xc2, 0xf3, 0x0c, 0x9c, 0xda, 0x33, 0xd6, 0x68, 0x0b, 0xcf, 0xcb, 0x66,
+	0x93, 0xaf, 0x78, 0xca, 0xb3, 0xf3, 0x54, 0x6f, 0x2c, 0x9e, 0x22, 0xc6, 0xbe, 0x67, 0xbd, 0x0d,
+	0x16, 0x86, 0x94, 0x61, 0x10, 0xf5, 0x44, 0x90, 0xa1, 0x71, 0x08, 0xdc, 0xe8, 0x4f, 0xe3, 0x3d,
+	0x1a, 0x60, 0x64, 0xdb, 0xa5, 0x16, 0xa7, 0x68, 0x3c, 0x91, 0x89, 0x9f, 0xf8, 0x51, 0x98, 0xbe,
+	0xf9, 0xec, 0xc1, 0x66, 0x3f, 0x87, 0xa6, 0xf5, 0xd2, 0x7c, 0x93, 0x12, 0x75, 0xdf, 0xe4, 0x88,
+	0xce, 0x86, 0x31, 0x8b, 0x4e, 0xf8, 0x50, 0x77, 0x9c, 0x3c, 0xf0, 0xbd, 0x9d, 0x13, 0x7a, 0xc0,
+	0x12, 0x63, 0x5a, 0xe1, 0x02, 0x50, 0x1c, 0x37, 0x5e, 0xb1, 0x56, 0xf1, 0xfb, 0x81, 0x4f, 0xed,
+	0x33, 0x4a, 0x8a, 0xb8, 0x3f, 0x72, 0x43, 0x31, 0xce, 0xfa, 0x3f, 0x19, 0x84, 0xd3, 0xb3, 0x1e,
+	0xce, 0x9a, 0xd1, 0xc3, 0xd9, 0x2f, 0x5b, 0x08, 0x8f, 0xc3, 0xf7, 0x60, 0x23, 0x6f, 0x63, 0x31,
+	0x75, 0xfa, 0x3c, 0xb5, 0x6b, 0x27, 0xeb, 0x65, 0xa1, 0xa3, 0x40, 0x6d, 0x6a, 0xb7, 0x76, 0xb8,
+	0x52, 0xde, 0xf6, 0xbc, 0x3b, 0x22, 0x54, 0x7a, 0x33, 0xd4, 0x11, 0x66, 0x6c, 0x06, 0xbf, 0x71,
+	0x33, 0xe7, 0x61, 0x15, 0x95, 0x9d, 0x07, 0xcb, 0x15, 0xe1, 0x79, 0x0f, 0x7c, 0x0a, 0x4d, 0xf3,
+	0xc4, 0x16, 0x07, 0x5c, 0x73, 0x89, 0x6a, 0x71, 0x89, 0x8f, 0xf2, 0x25, 0x6a, 0xcf, 0x7d, 0xe9,
+	0x94, 0xb2, 0x51, 0xd8, 0xd2, 0x2d, 0x19, 0x20, 0x17, 0x78, 0x14, 0x96, 0x6f, 0x09, 0x6d, 0xdc,
+	0xd8, 0x92, 0x27, 0x03, 0xa4, 0xf5, 0x6f, 0x94, 0x06, 0x6b, 0x52, 0xc6, 0x0b, 0xe2, 0x75, 0x68,
+	0x62, 0x6a, 0x6f, 0xc8, 0x7e, 0xe9, 0x65, 0xe4, 0xaa, 0x9a, 0xf6, 0xc8, 0xd4, 0x3f, 0x80, 0xd6,
+	0x40, 0x84, 0xea, 0xb9, 0x6f, 0x31, 0x9b, 0x88, 0x4d, 0x33, 0x6f, 0x00, 0xf4, 0x02, 0xd1, 0x2f,
+	0xb4, 0x90, 0x2c, 0x9d, 0xda, 0x22, 0x74, 0x52, 0x32, 0xf5, 0x0f, 0xa2, 0xa3, 0xc9, 0x37, 0x82,
+	0x02, 0x79, 0x0f, 0x56, 0x06, 0x04, 0x58, 0xd8, 0x3f, 0xc8, 0xf8, 0x8e, 0x46, 0xb3, 0xff, 0xb7,
+	0x02, 0xd6, 0x97, 0x51, 0x1c, 0x78, 0x3b, 0x91, 0x52, 0xe4, 0x21, 0xd2, 0xae, 0xb1, 0x5e, 0xa4,
+	0x8c, 0x56, 0x9a, 0x15, 0xfc, 0xdc, 0xf7, 0xac, 0x75, 0xa8, 0x8e, 0x26, 0xda, 0x67, 0x56, 0x47,
+	0x93, 0xc2, 0xdd, 0x4e, 0xad, 0x78, 0xb7, 0x83, 0x27, 0x64, 0x8a, 0x5a, 0x35, 0x73, 0x5f, 0x60,
+	0x10, 0xa5, 0xbf, 0xaf, 0x41, 0xc7, 0x9b, 0xc6, 0x82, 0x0e, 0x2f, 0xa1, 0xe8, 0x37, 0xf7, 0x14,
+	0x48, 0x48, 0x98, 0xd0, 0x32, 0x15, 0xdf, 0x7b, 0x9a, 0x17, 0x5c, 0x08, 0xd9, 0xf7, 0x9e, 0x5a,
+	0x97, 0x61, 0x53, 0x0f, 0x13, 0xbf, 0xe4, 0xd1, 0x39, 0xeb, 0x5d, 0x67, 0x38, 0xee, 0x8b, 0xfc,
+	0xfa, 0xff, 0x55, 0xd0, 0x91, 0x52, 0x7b, 0x79, 0x34, 0x5c, 0x90, 0x66, 0xa5, 0x1d, 0x66, 0x55,
+	0xa3, 0xc3, 0xec, 0x02, 0xdb, 0x85, 0xf9, 0x1a, 0xad, 0xa6, 0xbd, 0xb4, 0x14, 0x9a, 0x0b, 0xc9,
+	0xad, 0x49, 0x1a, 0x8e, 0x31, 0x40, 0xd2, 0xc7, 0xf5, 0x6b, 0x79, 0xc6, 0x58, 0x77, 0xda, 0x1a,
+	0xa6, 0x4d, 0xa0, 0x10, 0xf4, 0x56, 0x4e, 0x93, 0x15, 0x20, 0x63, 0x89, 0xbe, 0x3d, 0x5f, 0xbd,
+	0x54, 0xbb, 0xdc, 0x72, 0x56, 0x55, 0xc2, 0xd7, 0xf3, 0xb7, 0x61, 0x2d, 0xdb, 0x2a, 0xf7, 0x69,
+	0x34, 0x83, 0x68, 0x68, 0xda, 0xf6, 0x4c, 0x2f, 0x8d, 0x29, 0x17, 0x67, 0x35, 0x88, 0xb8, 0x91,
+	0x66, 0x0c, 0x67, 0xb8, 0x41, 0x4d, 0x5d, 0x39, 0x38, 0x51, 0x8f, 0xf9, 0x52, 0xf2, 0x2c, 0x34,
+	0xc6, 0x51, 0x28, 0x4f, 0xf4, 0xdb, 0x30, 0x7f, 0x58, 0xaf, 0xc3, 0x7a, 0x12, 0x25, 0x22, 0x70,
+	0x63, 0xd9, 0x1f, 0x89, 0x78, 0xc8, 0x32, 0xac, 0x3a, 0x1d, 0x82, 0x3a, 0x1a, 0x88, 0x91, 0xf7,
+	0xd8, 0xd7, 0xef, 0xcb, 0x69, 0xfe, 0x7d, 0xec, 0xf3, 0x9b, 0xae, 0xfd, 0x42, 0xda, 0xaf, 0xed,
+	0x48, 0x45, 0xeb, 0xdd, 0x4f, 0x06, 0xf6, 0x1f, 0xd1, 0xf5, 0x08, 0x3b, 0x06, 0xb2, 0x4f, 0xbe,
+	0x35, 0x2a, 0x0f, 0xca, 0x58, 0x40, 0x4e, 0xfd, 0xc0, 0xb8, 0xd5, 0x5d, 0xa5, 0x6f, 0x6e, 0x77,
+	0x4c, 0xbb, 0xb6, 0x8c, 0xca, 0x42, 0x77, 0x66, 0xa1, 0x32, 0x2f, 0xc3, 0xa6, 0x27, 0xd1, 0x90,
+	0xf8, 0xea, 0xdc, 0xb0, 0xd9, 0x75, 0x82, 0xd3, 0x55, 0x32, 0xb5, 0xad, 0x4b, 0xb8, 0xc0, 0x7d,
+	0xc4, 0xbb, 0x51, 0x10, 0xc8, 0x3e, 0x9a, 0xea, 0x32, 0xa6, 0xce, 0xc3, 0x6a, 0x5f, 0xe4, 0x37,
+	0xcd, 0x0d, 0x67, 0x05, 0x3f, 0xf7, 0xa9, 0x69, 0x85, 0x06, 0x4c, 0x69, 0xb4, 0x10, 0xc2, 0xe2,
+	0xf8, 0x02, 0x95, 0x88, 0x47, 0xfc, 0x50, 0x26, 0x48, 0xf9, 0x0d, 0xa8, 0x4d, 0x64, 0xb2, 0xb0,
+	0x8d, 0xf0, 0x50, 0x26, 0x0e, 0x22, 0xa0, 0x10, 0x82, 0x48, 0x78, 0x2e, 0x7a, 0x01, 0xfe, 0xe7,
+	0x87, 0x55, 0xfc, 0xbe, 0x1d, 0x7a, 0x76, 0x98, 0x7a, 0x8d, 0xbc, 0x27, 0x9c, 0xdb, 0xad, 0xbe,
+	0x4e, 0x23, 0xf9, 0x92, 0xf5, 0xfe, 0x96, 0xae, 0x6d, 0x0f, 0x65, 0xf2, 0xc5, 0x54, 0xc6, 0x27,
+	0xdb, 0x4a, 0xf9, 0x2a, 0xeb, 0x71, 0xd9, 0x85, 0x33, 0x8f, 0x11, 0xea, 0x0a, 0x02, 0x9b, 0xc6,
+	0x59, 0xf4, 0x5a, 0x3c, 0x8d, 0x2c, 0x73, 0xe3, 0x71, 0x4e, 0x67, 0xe6, 0xad, 0xbd, 0x5a, 0x78,
+	0x6b, 0x5f, 0xe2, 0x96, 0x4c, 0x1b, 0xa9, 0x17, 0x6c, 0xc4, 0x3e, 0x2e, 0xe7, 0x16, 0xe3, 0x5d,
+	0xbe, 0x50, 0xa5, 0xb0, 0x50, 0xe9, 0x2e, 0xaa, 0xa7, 0xdb, 0x85, 0xfd, 0x05, 0x1a, 0xfe, 0xa1,
+	0x4c, 0xba, 0x32, 0x61, 0xa8, 0x56, 0xca, 0xbc, 0x64, 0x2e, 0x96, 0xd0, 0xa4, 0xc6, 0x3c, 0x4a,
+	0xce, 0x45, 0x4e, 0xf2, 0x9f, 0xaa, 0x74, 0x6c, 0x64, 0xb2, 0x13, 0x85, 0x5e, 0xbe, 0x14, 0x0a,
+	0xfe, 0x15, 0xa0, 0x96, 0xb6, 0x99, 0x3a, 0x0e, 0x41, 0x5c, 0xc7, 0xed, 0xc0, 0x46, 0x3f, 0x0a,
+	0x3d, 0x4a, 0x8f, 0xbe, 0xfb, 0x9c, 0xf5, 0xe6, 0x7a, 0x3e, 0x83, 0x84, 0x6c, 0xd2, 0xb8, 0xf2,
+	0x9c, 0x15, 0x4f, 0x4e, 0xe3, 0xca, 0x1c, 0x8d, 0xab, 0x66, 0x33, 0xc6, 0x73, 0xd1, 0xb8, 0x9a,
+	0x2a, 0x3b, 0xb3, 0x83, 0xc6, 0x62, 0x3b, 0x58, 0x29, 0xda, 0x41, 0x5c, 0x2a, 0x3b, 0x34, 0x83,
+	0x67, 0xc9, 0xee, 0x83, 0xa2, 0xd2, 0x9e, 0x61, 0x08, 0xa6, 0xc2, 0xae, 0xeb, 0x35, 0xb7, 0xbd,
+	0xe3, 0xed, 0xfe, 0xc8, 0x97, 0xc7, 0x72, 0x8c, 0x59, 0xb5, 0x7c, 0x6c, 0x7d, 0x03, 0x60, 0x22,
+	0x93, 0xe2, 0x92, 0xcd, 0x89, 0x4c, 0x68, 0x45, 0xfb, 0x4f, 0x2b, 0xa5, 0x13, 0x91, 0xd9, 0xa5,
+	0x13, 0xad, 0x37, 0x61, 0x53, 0xe4, 0xf8, 0x66, 0x33, 0xcf, 0x86, 0x01, 0xa7, 0x18, 0xfc, 0x01,
+	0x34, 0x28, 0xc5, 0x3c, 0x45, 0xe6, 0xc6, 0x13, 0xec, 0x87, 0xe8, 0x2a, 0xe7, 0x98, 0xeb, 0xb2,
+	0x43, 0x5b, 0xce, 0xdf, 0x45, 0x68, 0x09, 0xef, 0x58, 0x3b, 0x47, 0x5d, 0xa4, 0x09, 0xef, 0x98,
+	0x7d, 0xe3, 0x09, 0xb5, 0xcc, 0xf3, 0x65, 0x15, 0xae, 0x97, 0xfb, 0x5f, 0x7a, 0x2e, 0xc5, 0x40,
+	0x64, 0x76, 0x13, 0x02, 0x81, 0xb8, 0xe9, 0xea, 0x1d, 0xdd, 0xdb, 0x56, 0x2d, 0xfb, 0x57, 0x8d,
+	0x9c, 0x22, 0xb7, 0xb6, 0xa5, 0xee, 0xbc, 0x96, 0x3f, 0xa8, 0x1c, 0xc0, 0x16, 0x2f, 0x4d, 0xee,
+	0xf0, 0x94, 0x8b, 0xcf, 0xbf, 0xcf, 0x3c, 0xc4, 0x92, 0xe0, 0xf6, 0xd3, 0x89, 0x64, 0xb3, 0xbd,
+	0xb5, 0x73, 0x57, 0x06, 0x13, 0x54, 0xbb, 0x0d, 0x9d, 0x9e, 0x74, 0x47, 0x32, 0x98, 0x48, 0xcf,
+	0x48, 0x70, 0xdb, 0x3d, 0x79, 0x97, 0x60, 0x0f, 0x38, 0xde, 0x2d, 0xc8, 0xb7, 0xed, 0xa0, 0x8c,
+	0xee, 0xe2, 0xcc, 0x7d, 0x6e, 0xb5, 0xea, 0xf2, 0xd5, 0x6a, 0xc5, 0xd5, 0x5c, 0xf4, 0x9c, 0x18,
+	0x58, 0xf6, 0xc3, 0x63, 0x3f, 0x11, 0x69, 0x65, 0x85, 0x32, 0xb9, 0x05, 0x1b, 0x7e, 0x06, 0x5c,
+	0xfc, 0xbc, 0xce, 0x2d, 0x85, 0x29, 0x9e, 0xb3, 0x9e, 0xcf, 0xa1, 0x07, 0xc7, 0xff, 0xac, 0x63,
+	0xe8, 0xca, 0x11, 0xd2, 0x62, 0xf8, 0x22, 0xb4, 0x7a, 0x42, 0x49, 0x57, 0x89, 0x63, 0xa9, 0x5d,
+	0x73, 0xb3, 0xa7, 0xff, 0xdd, 0x0b, 0x07, 0xfb, 0x81, 0xdf, 0xe7, 0xe6, 0x3a, 0x6d, 0x42, 0x04,
+	0xb8, 0x3f, 0x1d, 0x5b, 0xd7, 0xe0, 0x1c, 0xd5, 0x76, 0x06, 0x73, 0xe1, 0x74, 0xdc, 0xcb, 0xba,
+	0xe6, 0xce, 0xe2, 0x68, 0xbe, 0xe0, 0x7d, 0x1a, 0xe3, 0x46, 0x53, 0xfa, 0xcf, 0xb6, 0x69, 0x16,
+	0x3f, 0x5a, 0x0c, 0x79, 0x90, 0xf6, 0xe0, 0xd1, 0x70, 0x76, 0xe7, 0xdb, 0x48, 0x7b, 0xf0, 0x10,
+	0x9c, 0xb6, 0x38, 0xbe, 0x05, 0x67, 0x98, 0xb3, 0xb1, 0x44, 0xb2, 0x79, 0xf6, 0x57, 0x77, 0x36,
+	0x68, 0xe0, 0x80, 0xe0, 0xe4, 0xa8, 0xde, 0x87, 0x2d, 0xc6, 0x8d, 0xe5, 0x24, 0x10, 0x27, 0xae,
+	0x5e, 0x20, 0xcb, 0xfb, 0xea, 0xce, 0x8b, 0x34, 0xee, 0xd0, 0xf0, 0x01, 0x8d, 0xea, 0x12, 0xbe,
+	0x95, 0xf7, 0x98, 0xf3, 0x6d, 0xef, 0x37, 0x0b, 0x32, 0xcf, 0x77, 0x97, 0xf5, 0xaa, 0x37, 0x93,
+	0xb4, 0x4b, 0xbd, 0x0b, 0x2f, 0xd0, 0x05, 0x00, 0x33, 0x98, 0x79, 0xd1, 0x16, 0xd1, 0xf9, 0xd6,
+	0x02, 0x3a, 0xcc, 0xf6, 0x43, 0xc1, 0xd7, 0x78, 0x9b, 0xc2, 0xf3, 0x18, 0xa2, 0xff, 0xb7, 0xc3,
+	0xfa, 0x36, 0xbc, 0x40, 0x37, 0x0f, 0x33, 0x44, 0x81, 0xdb, 0x4c, 0x3c, 0x19, 0x14, 0xd1, 0x3f,
+	0x85, 0x35, 0xe4, 0x21, 0xcb, 0x5d, 0xdb, 0xb4, 0xf8, 0x2b, 0x0b, 0x16, 0x4f, 0xf3, 0x57, 0x10,
+	0x9e, 0x77, 0x8f, 0x53, 0x58, 0xd2, 0x17, 0x2f, 0x86, 0x36, 0xb0, 0xa6, 0xef, 0x21, 0x08, 0x72,
+	0x7f, 0x3a, 0xb6, 0x7f, 0x1d, 0x0f, 0x73, 0x4e, 0x61, 0x4f, 0x6a, 0x3d, 0xeb, 0xff, 0x82, 0x1d,
+	0xca, 0xcc, 0x28, 0xd8, 0xb6, 0x5a, 0x43, 0x59, 0x6e, 0x09, 0xd5, 0x19, 0x4b, 0xb0, 0x07, 0x0b,
+	0x28, 0xe3, 0x11, 0x7c, 0x1b, 0xce, 0xcc, 0x5b, 0x9d, 0xfe, 0x27, 0x49, 0x7f, 0xb9, 0xc5, 0xcd,
+	0xad, 0xf3, 0x3e, 0xbc, 0x6c, 0xae, 0xc3, 0x93, 0x1e, 0xa8, 0xfc, 0x3d, 0x1e, 0x33, 0x17, 0x73,
+	0x05, 0xfd, 0x65, 0xff, 0x55, 0x65, 0xd9, 0xcc, 0xc5, 0x9e, 0x22, 0x0b, 0x06, 0xd5, 0x53, 0x06,
+	0x83, 0x19, 0x5d, 0xd4, 0x66, 0x74, 0x61, 0x30, 0x5a, 0x2f, 0x30, 0xfa, 0x63, 0xea, 0x35, 0x9a,
+	0xb5, 0xb1, 0xfb, 0x51, 0xe2, 0xf7, 0x25, 0x5b, 0x3b, 0x3a, 0x82, 0xa2, 0x98, 0x2a, 0xb3, 0x07,
+	0xd3, 0xbc, 0xc9, 0xa9, 0x16, 0x6f, 0x72, 0xde, 0x83, 0x06, 0x95, 0x64, 0x3a, 0xba, 0x2d, 0xc9,
+	0x2e, 0x18, 0xcf, 0xfe, 0x03, 0xbe, 0x14, 0x11, 0xec, 0xf8, 0xbf, 0xfb, 0x9d, 0xef, 0xa4, 0xce,
+	0xe8, 0x43, 0x68, 0xa1, 0x1f, 0x5a, 0x7e, 0x13, 0x65, 0xcc, 0x73, 0x9a, 0x4a, 0xe7, 0x6e, 0xd6,
+	0x75, 0xa3, 0x42, 0x2b, 0xbb, 0x44, 0x30, 0x66, 0xdd, 0x8b, 0x86, 0x79, 0x89, 0x76, 0x80, 0x8e,
+	0x97, 0x3b, 0xae, 0xb2, 0xae, 0xfd, 0x62, 0x87, 0xb0, 0x51, 0x89, 0x5c, 0x82, 0xb5, 0xac, 0xf9,
+	0x3f, 0x2f, 0x47, 0xe0, 0x91, 0x9e, 0xb8, 0xef, 0xd9, 0x5d, 0xb8, 0x58, 0xd8, 0xd9, 0x97, 0x23,
+	0x29, 0x83, 0x7b, 0xd1, 0x70, 0xdb, 0xa3, 0xab, 0xd4, 0x6b, 0x73, 0x75, 0x64, 0x51, 0x5a, 0x29,
+	0x7a, 0xb1, 0x8c, 0xdc, 0x07, 0x4b, 0xf7, 0x8a, 0xa5, 0xf7, 0x2d, 0x48, 0xeb, 0xea, 0xbc, 0xb0,
+	0xe6, 0xff, 0x75, 0x80, 0x66, 0xe5, 0x62, 0x4a, 0xff, 0x25, 0x57, 0x78, 0x73, 0xff, 0x92, 0x2b,
+	0xbc, 0x25, 0xff, 0x92, 0x2b, 0x3c, 0x87, 0x50, 0xec, 0xef, 0xe7, 0xe2, 0x9a, 0xa5, 0x52, 0x5a,
+	0xb8, 0xe1, 0x24, 0xa3, 0x70, 0xc3, 0xcf, 0x7d, 0xbe, 0xfb, 0xc5, 0x52, 0x34, 0x6b, 0x86, 0xc0,
+	0x0f, 0xde, 0x26, 0xc6, 0xc0, 0x6c, 0xab, 0x7a, 0x9b, 0x54, 0x1d, 0x3d, 0xcf, 0x36, 0x11, 0x91,
+	0xb6, 0xb9, 0x8b, 0x06, 0xf6, 0xa5, 0xaf, 0x46, 0x3b, 0xd1, 0x53, 0x93, 0xc7, 0xb7, 0xa1, 0xf1,
+	0xc4, 0x57, 0x23, 0xb5, 0x70, 0xab, 0x38, 0xc7, 0x61, 0x1c, 0xfb, 0x47, 0xf4, 0x5f, 0x16, 0x3b,
+	0x47, 0xa6, 0xd0, 0x3f, 0x84, 0xb5, 0x5e, 0xe2, 0xf6, 0xa2, 0xc0, 0x37, 0x19, 0x2a, 0x26, 0xa8,
+	0x3b, 0x47, 0x3b, 0x51, 0xe0, 0xb3, 0x27, 0xed, 0x25, 0xe9, 0x6f, 0xeb, 0x9a, 0x8e, 0xb4, 0xc6,
+	0xbf, 0x4e, 0xcd, 0xcd, 0x13, 0x8a, 0x2b, 0x11, 0x0a, 0xc1, 0xf8, 0x6b, 0x67, 0xf3, 0xfb, 0xeb,
+	0xef, 0xbe, 0xf7, 0x91, 0x81, 0xd6, 0x5b, 0xa1, 0x3f, 0x57, 0x7f, 0x16, 0x00, 0x00, 0xff, 0xff,
+	0x0b, 0x72, 0xac, 0x28, 0xa4, 0x40, 0x00, 0x00,
 }
 }