package controllers

import (
	"bufio"
	"encoding/base64"
	"eta/eta_api/models"
	"eta/eta_api/services"
	"eta/eta_api/utils"
	"fmt"
	"github.com/h2non/filetype"
	"github.com/kgiannakakis/mp3duration/src/mp3duration"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"path"
	"regexp"
	"strings"
	"time"
)

// 资源管理-图片上传，合同上传等
type ResourceController struct {
	//BaseAuthController
	BaseCommonController
}

// ResourceAuthController 文件资源
type ResourceAuthController struct {
	BaseAuthController
}

// @Title 图片上传
// @Description 图片上传接口
// @Param   file   query   file  true       "文件"
// @Success 200 {object} models.ResourceResp
// @router /image/upload [post]
func (this *ResourceController) Upload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	f, h, err := this.GetFile("file")
	if err != nil {
		br.Msg = "获取资源信息失败"
		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
		return
	}

	fileData, e := ioutil.ReadAll(f)
	if e != nil {
		br.Msg = "上传失败"
		br.ErrMsg = "读取文件失败, Err: " + e.Error()
		return
	}
	pass := filetype.IsImage(fileData)
	if !pass {
		br.Msg = "文件格式有误"
		br.ErrMsg = "文件格式有误"
		return
	}

	uploadFileName := h.Filename //上传的文件名
	ext := path.Ext(h.Filename)
	dateDir := time.Now().Format("20060102")
	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
	if err != nil {
		br.Msg = "存储目录创建失败"
		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
		return
	}
	randStr := utils.GetRandStringNoSpecialChar(28)
	fileName := randStr + ext
	fpath := uploadDir + "/" + fileName
	defer f.Close() //关闭上传文件
	err = this.SaveToFile("file", fpath)
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}
	resourceUrl := ``
	//上传到阿里云 和 minio
	//if utils.ObjectStorageClient == "minio" {
	//	resourceUrl, err = services.UploadImgToMinIo(fileName, fpath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//} else {
	//	resourceUrl, err = services.UploadAliyunV2(fileName, fpath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//}
	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}

	defer func() {
		os.Remove(fpath)
	}()

	item := new(models.Resource)
	item.ResourceUrl = resourceUrl
	item.ResourceType = 1
	item.CreateTime = time.Now()
	newId, err := models.AddResource(item)
	if err != nil {
		br.Msg = "资源上传失败"
		br.ErrMsg = "资源上传失败,Err:" + err.Error()
		return
	}
	resp := models.ResourceResp{
		Id:           newId,
		ResourceUrl:  resourceUrl,
		ResourceName: uploadFileName,
	}

	br.Msg = "上传成功"
	br.Ret = 200
	br.Success = true
	br.Data = resp
	return
}

// @Title 视频上传
// @Description 视频上传接口
// @Param   file   query   file  true       "文件"
// @Success 200 新增成功
// @router /video/upload [post]
func (this *ResourceController) VideoUpload() {
	utils.FileLog.Info("start VideoUpload ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))

	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	f, h, err := this.GetFile("file")
	if err != nil {
		br.Msg = "获取资源信息失败"
		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
		return
	}

	fileData, e := ioutil.ReadAll(f)
	if e != nil {
		br.Msg = "上传失败"
		br.ErrMsg = "读取文件失败, Err: " + e.Error()
		return
	}
	pass := filetype.IsVideo(fileData)
	if !pass {
		br.Msg = "文件格式有误"
		br.ErrMsg = "文件格式有误"
		return
	}

	ext := path.Ext(h.Filename)
	dateDir := time.Now().Format("20060102")
	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
	//uploadDir := "./" + dateDir
	fmt.Println(uploadDir)
	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
	if err != nil {
		br.Msg = "存储目录创建失败"
		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
		return
	}
	randStr := utils.GetRandStringNoSpecialChar(28)
	fileName := randStr + ext
	fpath := uploadDir + "/" + fileName
	defer f.Close() //关闭上传文件

	utils.FileLog.Info("start save")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	utils.FileLog.Info("fpath %s:", fpath)
	fileHandle, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModeAppend)
	if err != nil {
		br.Msg = "创建文件失败"
		br.ErrMsg = "创建文件失败,Err:" + err.Error()
		return
	}
	defer fileHandle.Close()
	//循环读取
	for {
		buffer := make([]byte, 4096)
		_, err := f.Read(buffer)
		//如果错误信息是其他类型的，则直接panic
		if err != nil && err != io.EOF {
			br.Msg = "上传失败"
			br.ErrMsg = "读取文件内容失败,Err:" + err.Error()
			return
		}
		//注意，错误信息是以io包的EOF时，表示读取到文件末尾
		if err == io.EOF {
			break
		}

		// NewWriter 默认缓冲区大小是 4096
		// 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
		buf := bufio.NewWriter(fileHandle)
		// 字节写入
		// 字符串写入
		buf.WriteString(string(buffer))
		// 将缓冲中的数据写入
		err = buf.Flush()
		if err != nil {
			br.Msg = "上传失败"
			br.ErrMsg = "写入文件内容失败,Err:" + err.Error()
			return
		}
	}
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	utils.FileLog.Info("end save")
	//err = this.SaveToFile("file", fpath)
	//if err != nil {
	//	br.Msg = "文件上传失败"
	//	br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//	return
	//}
	/*
		fmt.Println("start")
			fmt.Println(time.Now())
			tofile:="./20201123.mp4"
			fromFile:="./第五期下.mp4"
			f, err := os.Open(fromFile)
			defer f.Close() //注意要关闭文件

			fileHandle, err := os.OpenFile(tofile, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0666)
			if err != nil {
				fmt.Println("open file error :", err)
				return
			}
			defer fileHandle.Close()

			if err != nil {
				panic(err)
			} else {
				//循环读取
				for {
					buffer := make([]byte, 4096)
					_, err := f.Read(buffer)
					//如果错误信息是其他类型的，则直接panic
					if err != nil && err != io.EOF {
						panic(err)
					}
					//注意，错误信息是以io包的EOF时，表示读取到文件末尾
					if err == io.EOF {
						fmt.Println("读取完毕")
						break
					}

					// NewWriter 默认缓冲区大小是 4096
					// 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
					buf := bufio.NewWriter(fileHandle)
					// 字节写入
					// 字符串写入
					buf.WriteString(string(buffer))
					// 将缓冲中的数据写入
					err = buf.Flush()
					if err != nil {
						fmt.Println("flush error :"+err.Error())
						return
					}
				}
			}
	*/

	utils.FileLog.Info("start update oss ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))

	//savePath := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
	//savePath += fileName

	defer func() {
		_ = os.Remove(fpath)
	}()

	//上传到阿里云 和 minio
	resourceUrl := ``
	//if utils.ObjectStorageClient == "minio" {
	//	err = services.UploadVideoToMinIo(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.MinIoImghost + savePath
	//} else {
	//	err = services.UploadVideoAliyun(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.Imghost + savePath
	//}
	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}

	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	utils.FileLog.Info("end update oss ")

	item := new(models.Resource)
	item.ResourceUrl = resourceUrl
	item.ResourceType = 3
	item.CreateTime = time.Now()
	newId, err := models.AddResource(item)
	if err != nil {
		br.Msg = "资源上传失败"
		br.ErrMsg = "资源上传失败,Err:" + err.Error()
		return
	}
	resp := new(models.ResourceResp)
	resp.Id = newId
	resp.ResourceUrl = resourceUrl

	utils.FileLog.Info("start GetMP4Duration ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))

	duration, err := services.GetMP4Duration(f)
	if err != nil {
		panic(err)
	}
	utils.FileLog.Info("end GetMP4Duration ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	resp.PlaySeconds = duration
	br.Msg = "上传成功"
	br.Ret = 200
	br.Success = true
	br.Data = resp
	utils.FileLog.Info("end VideoUpload ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	return
}

// VoiceUpload
// @Title 音频上传
// @Description 音频上传接口
// @Param   file   query   file  true       "文件"
// @Success 200 {object} models.ResourceResp
// @router /voice/upload [post]
func (this *ResourceController) VoiceUpload() {
	utils.FileLog.Info("start VoiceUpload ")
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))

	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	f, h, err := this.GetFile("file")
	if err != nil {
		br.Msg = "获取资源信息失败"
		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
		return
	}
	uploadFileName := h.Filename //上传的文件名

	fileData, e := ioutil.ReadAll(f)
	if e != nil {
		br.Msg = "上传失败"
		br.ErrMsg = "读取文件失败, Err: " + e.Error()
		return
	}
	pass := filetype.IsAudio(fileData)
	if !pass {
		br.Msg = "文件格式有误"
		br.ErrMsg = "文件格式有误"
		return
	}

	ext := path.Ext(h.Filename)
	dateDir := time.Now().Format("20060102")
	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
	//uploadDir := "./" + dateDir
	fmt.Println(uploadDir)
	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
	if err != nil {
		br.Msg = "存储目录创建失败"
		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
		return
	}
	randStr := utils.GetRandStringNoSpecialChar(28)
	fileName := randStr + ext
	fpath := uploadDir + "/" + fileName
	defer f.Close() //关闭上传文件

	utils.FileLog.Info("start save")
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
	utils.FileLog.Info(fmt.Sprintf("fpath %s:", fpath))
	fileHandle, err := os.OpenFile(fpath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
	if err != nil {
		br.Msg = "创建文件失败"
		br.ErrMsg = "创建文件失败,Err:" + err.Error()
		return
	}
	defer fileHandle.Close()

	localFileBuffer := make([]byte, 0)
	//循环读取
	for {
		buffer := make([]byte, 4096)
		maxLen, err := f.Read(buffer)
		//如果错误信息是其他类型的，则直接panic
		if err != nil && err != io.EOF {
			br.Msg = "上传失败"
			br.ErrMsg = "读取文件内容失败,Err:" + err.Error()
			return
		}
		//注意，错误信息是以io包的EOF时，表示读取到文件末尾
		if err == io.EOF {
			break
		}

		// NewWriter 默认缓冲区大小是 4096
		// 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
		buf := bufio.NewWriter(fileHandle)
		// 字节写入
		// 字符串写入
		buf.WriteString(string(buffer))
		localFileBuffer = append(localFileBuffer, buffer[0:maxLen]...)
		// 将缓冲中的数据写入
		err = buf.Flush()
		if err != nil {
			br.Msg = "上传失败"
			br.ErrMsg = "写入文件内容失败,Err:" + err.Error()
			return
		}
	}
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
	utils.FileLog.Info("end save")

	defer func() {
		if utils.FileIsExist(fpath) {
			os.Remove(fpath)
		}
	}()

	var playSeconds float64

	if ext == ".m4a" { //m4a格式的走这个计算逻辑
		utils.FileLog.Info("start calculate m4a duration ")
		tmpPlaySeconds, err := services.GetMP4Duration(f)
		if err != nil {
			br.Msg = "音频资源时长计算失败"
			br.ErrMsg = "音频资源时长计算失败,Err:" + err.Error()
			return
		}
		playSeconds = float64(tmpPlaySeconds)
		utils.FileLog.Info("end calculate m4a duration ")
	} else {
		utils.FileLog.Info("start calculate  mp3duration ")
		playSeconds, err = mp3duration.Calculate(fpath)
		if playSeconds <= 0 {
			playSeconds, err = utils.GetVideoPlaySeconds(fpath)
			if err != nil {
				br.Msg = "音频资源时长计算失败"
				br.ErrMsg = "音频资源时长计算失败,Err:" + err.Error()
				return
			}
		}
		utils.FileLog.Info("end calculate  mp3duration ")
	}

	utils.FileLog.Info("start update oss ")
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))

	defer func() {
		_ = os.Remove(fpath)
	}()

	//savePath := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
	//savePath += fileName
	//上传到阿里云 和 minio
	resourceUrl := ``
	//if utils.ObjectStorageClient == "minio" {
	//	err = services.UploadVideoToMinIo(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.MinIoImghost + savePath
	//} else {
	//	err = services.UploadVideoAliyun(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.Imghost + savePath
	//}
	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
	utils.FileLog.Info("end update oss ")

	item := new(models.Resource)
	item.ResourceUrl = resourceUrl
	item.ResourceType = 3
	item.CreateTime = time.Now()
	newId, err := models.AddResource(item)
	if err != nil {
		br.Msg = "音频资源上传失败"
		br.ErrMsg = "音频资源上传失败,Err:" + err.Error()
		return
	}
	resp := models.ResourceResp{
		Id:           newId,
		ResourceUrl:  resourceUrl,
		ResourceName: uploadFileName,
		PlaySeconds:  uint32(playSeconds),
	}

	br.Msg = "上传成功"
	br.Ret = 200
	br.Success = true
	br.Data = resp
	utils.FileLog.Info("end VoiceUpload ")
	utils.FileLog.Info(fmt.Sprintf("%s:", time.Now().Format(utils.FormatDateTime)))
	return
}

/*
func (c *Controller) SaveToFile(fromfile, tofile string) error {
	file, _, err := c.Ctx.Request.FormFile(fromfile)
	if err != nil {
		return err
	}
	defer file.Close()
	f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		return err
	}
	defer f.Close()
	io.Copy(f, file)
	return nil
}
*/

func init123() {
	fmt.Println("start")
	fmt.Println(time.Now())
	tofile := "./20201123.mp4"
	fromFile := "./第五期下.mp4"
	f, err := os.Open(fromFile)
	defer f.Close() //注意要关闭文件

	fileHandle, err := os.OpenFile(tofile, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("open file error :", err)
		return
	}
	defer fileHandle.Close()

	if err != nil {
		panic(err)
	} else {
		//循环读取
		for {
			buffer := make([]byte, 4096)
			_, err := f.Read(buffer)
			//如果错误信息是其他类型的，则直接panic
			if err != nil && err != io.EOF {
				panic(err)
			}
			//注意，错误信息是以io包的EOF时，表示读取到文件末尾
			if err == io.EOF {
				fmt.Println("读取完毕")
				break
			}

			// NewWriter 默认缓冲区大小是 4096
			// 需要使用自定义缓冲区的writer 使用 NewWriterSize()方法
			buf := bufio.NewWriter(fileHandle)
			// 字节写入
			// 字符串写入
			buf.WriteString(string(buffer))
			// 将缓冲中的数据写入
			err = buf.Flush()
			if err != nil {
				fmt.Println("flush error :" + err.Error())
				return
			}
		}
	}
	fmt.Println(time.Now())
	fmt.Println("end")
}

// @Title 上传图片
// @Description 上传图片
// @Param   Image query  string  false       "图片,base64字符串"
// @Success 200 {object} models.ImageResponse
// @router /upload_image_base64 [post]
func (this *ResourceController) UploadImageBase64() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	var err error
	ext := ".png"
	uploadDir := "./static"
	randStr := utils.GetRandStringNoSpecialChar(28)
	fileName := randStr + ext
	fpath := uploadDir + "/" + fileName

	image := this.Ctx.Request.FormValue("Image")

	if image == "" {
		// 从 file文件中获取
		f, h, e := this.GetFile("Image")
		if e != nil {
			br.Msg = "参数错误"
			br.ErrMsg = "获取资源信息失败,Err:" + e.Error()
			return
		}

		fileData, e := ioutil.ReadAll(f)
		if e != nil {
			br.Msg = "上传失败"
			br.ErrMsg = "读取文件失败, Err: " + e.Error()
			return
		}
		pass := filetype.IsImage(fileData)
		if !pass {
			br.Msg = "文件格式有误"
			br.ErrMsg = "文件格式有误"
			return
		}

		ext = path.Ext(h.Filename)
		dateDir := time.Now().Format("20060102")
		uploadDir = utils.STATIC_DIR + "hongze/" + dateDir
		err = os.MkdirAll(uploadDir, utils.DIR_MOD)
		if err != nil {
			br.Msg = "存储目录创建失败"
			br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
			return
		}
		randStr = utils.GetRandStringNoSpecialChar(28)
		fileName = randStr + ext
		fpath = uploadDir + "/" + fileName
		defer f.Close() //关闭上传文件
		err = this.SaveToFile("Image", fpath)
		if err != nil {
			br.Msg = "文件上传失败"
			br.ErrMsg = "文件上传失败，Err:" + err.Error()
			return
		}
	} else {
		b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, image)
		if !b {
			br.Msg = "图片格式不正确"
			br.ErrMsg = "图片格式不正确"
			return
		}
		re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
		base64Str := re.ReplaceAllString(image, "")
		base64Str = strings.Replace(base64Str, " ", "", -1)

		err = utils.SaveBase64ToFile(base64Str, fpath)
		if err != nil {
			br.Msg = "图片保存失败"
			br.ErrMsg = "图片保存失败,Err:" + err.Error()
			return
		}
	}

	fmt.Println("end")

	defer os.Remove(fpath)

	hzUploadDir := utils.RESOURCE_DIR + "images/"
	savePath := hzUploadDir + time.Now().Format("200601/20060102/")
	savePath += fileName

	//上传到阿里云 和 minio
	resourceUrl := ``
	//if utils.ObjectStorageClient == "minio" {
	//	err = services.UploadFileToMinIo(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.MinIoImghost + savePath
	//} else {
	//	err = services.UploadFileToAliyun(fileName, fpath, savePath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//	resourceUrl = utils.Imghost + savePath
	//}
	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resourceUrl, err = ossClient.UploadFile(fileName, fpath, savePath)
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
	utils.FileLog.Info("end update oss ")

	item := new(models.Resource)
	item.ResourceUrl = resourceUrl
	item.ResourceType = 1
	item.CreateTime = time.Now()
	newId, err := models.AddResource(item)
	if err != nil {
		br.Msg = "资源上传失败"
		br.ErrMsg = "资源上传失败,Err:" + err.Error()
		return
	}
	resp := new(models.ResourceResp)
	resp.Id = newId
	resp.ResourceUrl = resourceUrl
	br.Msg = "上传成功"
	br.Ret = 200
	br.Success = true
	br.Data = resp
	utils.FileLog.Info("end VideoUpload ")
	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
}

//
//func init() {
//	fmt.Println("start")
//	var err error
//	//imageBody:=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq8AAAH0CAYAAAATwMQ0AAAgAElEQVR4XuydCbyc0/nHf9QSGiQhiBINaklRS6i1tihto7bYUolYIlVLbI3QEEErQojGFlFLQmqJJRptELuQIlGK0NJIpIJohKrE/v/85njzn5k7c /M3Jk7Z Z n88nnyf33vc973O 75l5f3PmOc9Z6uuvv/5aGAQgAAEIQAACEIAABGqAwFKI1xq4S4QIAQhAAAIQgAAEIJAigHhlIEAAAhCAAAQgAAEI1AwBxGvN3CoChQAEIAABCEAAAhBAvDIGIAABCEAAAhCAAARqhgDitWZuFYFCAAIQgAAEIAABCCBeGQMQgAAEIAABCEAAAjVDAPFaM7eKQCEAAQhAAAIQgAAEEK MAQhAoOYJTJ8 XXfffbcGDx6sNm3apPqzePFiXXDBBdp///219dZb13wf6QAEIAABCAQCiFdGAgQgUPMEShGvo0aNUufOnbXvvvum j9x4kQ9  yzGQK4nGASMT158mTtvffeJV0nO Zc8bkfa6 99hLBPmvWLI0cOVJDhw5Vu3btMk5JYtpmm21S52R/AChn/2kLAhCAQLkIIF7LRZJ2IACBoghYiN10001FnXPEEUfoxBNPVCnnJhdKb8Pi1TZnzpyUkLV43XTTTXXJJZfkjStdeFoonn/  UuOzRalFtX9 /df8vezzz57iVguquPfHNyUePX1fMzAgQPVtWvX1FmFileLeB9722236eSTT14yg53dh/S411xzzdT1unTpUkp3OAcCEIBASQQQryVh4yQIQKC5BJoSYtntWyhaZFq8ZltzZl6zxWt66kFjs7G 5ty5c5eI0YULF6ZEn2cw09tw  kznMlMb/pMbHZ/LKA9W/rYY49liONczBNB7HiGDBnSQEymi9dC2kuu0ZTQ9v179913S5pBbu7Y4XwIQKB1E0C8tu77T 8hUDUC5RSvpXQiuX4 8ZpLcDZ1HYvdMWPGNBCQjYnX7JzcxmZK8zHLJ1wdbzEzr031L/m72/SHCKcikE9cKDWOgwAEykUA8VoukrQDAQgURSARYp5NbSp9wLOAicjMNfOaPSuba8bUv7MlM5/5xOsJJ5ygQYMG6aWXXmrQn2RGNDt3NDkwW0Q2lt7gmVXnvzYmXt94442MtIPsgPy1vWd7x40bp3PPPTf19b2Fstveb7/9dPPNN6eukdjpp5 e6lf673LdtEJmXX1erntR1CDgYAhAAAIlEEC8lgCNUyAAgeYTKNfMq2cBLdwS8ebIssVrIiLTRVlj4vXCCy9MicL0XM7GZjATGm7TAtbiMV3gJjOV/fr1WyKe81VDKOQ6 egnba6xxhpLhGV6e67E4AoMXqBlEZ9rRrip 9LYLG/zRwUtQAACEGiaAOK1aUYcAQEIVIBAUyIp 5K5cl6TPFPPAKZ/fZ2I12QW1W1lC8pCxGv79u1TeaQWskkbuVbt 2 5BGrSh2RhV7p4LkS8JmIz30xpsvjM18klXJO4kmoDTbWXxJtv5jXfNSowPGgSAhCAQF4CiFcGBwQgUBUC6eK1sRXto0ePTgnTbPGaCFd/DZ4cky0W/XO6wEvvaDnFaxKL48z Kj09zu23317du3fPmPVsLG0gEZu5atWm80iE81577dXg uWcec2X01uVAcRFIQCBVksA8dpqbz0dh0B1CWSL16Y2GUgXa4kgdGkqi9d0cZcIOfeusTJOhYhXt5GkJOSbeW1MOPocC/OxY8emYE dOjXlLaidQpBrE4VcYrMx8dq7d /UzHD67HN6JYRc7ZWS89qYQK/uSOLqEIBAayOAeG1td5z QiASAs0Rr8m5nmlMBGCHDh1SAu6dd95J9bCxjQDSv7J3uav0Oq9ONUhyXtMF6wcffNCg2H9Tgi65jmOxYHSu6S677JISm8ccc0yTC7aa po/16xykgNscbzTTjtlVBtoTs4rs66RvHAIAwIQYIctxgAEIFAdAs0Rr0nEiTjcddddUyvrk6/t89Vn9TVtFnbOAz3kkEP04osv5hWvCxYsWLLr1Lx58zLEa3Jtt5dd1zWJL4nDq/y98UGyUMp/LyTn1Yu PIv61FNPLUkHaKyEV64SVsnM65lnnqkrrriiyUoDSezp4r xGrbVGT1cFQIQaM0EmHltzXefvkOgigSam/PamABsSrz6q3aLSYtKF 7PN/M6adIk3X///an0g/RZWIvKZBFWdr5tOtLrr79eu 22mzp16pSxyr8Y8ZotcnNtyOD28tVezVW9IIkrvZpCvsVvbjvJSW6qhFYVhxOXhgAEWhEBxGsrutl0FQIxEWhq5jU71lzVBvLNXuYSeOnizG0nObYWp niNZlFTbZaPfzww1N1X7O/os9XwzXXlqml7rCVlNtKhGmSEpHOJqmBm2tzhETUJtUG3J5jcQrElVdeqfSSWo2J10KEekxji1ggAIH6JoB4re/7S 8gEC2BYktlJbOf6av584nX9BX 6QCSr8It9Dp37pxa9Z IYv/87LPPplIA/PdkxjUp/O/cWufHZpfcKgRwqTtspW/nmksU 9qNbWGbS7ymx5u9RW1TmzAU0leOgQAEIFBpAojXShOmfQhAICeBpsRrtrDKJ95KwTtlyhStv/76GZsQuJ2m8libEoqlxMI5EIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQABCEAAAhCAAASKI4B4LY4XR0MAAhCAAAQgAAEIVJEA4rWK8Lk0BCAAAQhAAAIQgEBxBBCvxfHiaAhAAAIQgAAEIACBKhJAvFYRPpeGAAQgAAEIQAACECiOAOK1OF4cDQEIQAACEIAABCBQRQKI1yrC59IQgAAEIAABCEAAAsURQLwWx4ujIQABCEAAAhCAAASqSADxWkX4XBoCEIAABCAAAQhAoDgCiNfieHE0BCAAAQhAAAIQgEAVCSBeqwifS0MAAhCAAAQgAAEIFEcA8VocL46GAAQgAAEIQAACEKgiAcRrFeFzaQhAAAIQgAAEIACB4gggXovjxdEQgAAEIAABCEAAAlUkgHitInwuDQEIQAACEIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQABCEAAAhCAAASKI4B4LY4XR0MAAhCAAAQgAAEIVJEA4rWK8Lk0BCAAAQhAAAIQgEBxBBCvxfHiaAhAAAIQgAAEIACBKhJAvFYRPpeGAAQgAAEIQAACECiOAOK1OF4cDQEIQAACEIAABCBQRQKI1yrC59IQgAAEIAABCEAAAsURQLwWx4ujIQABCEAAAhCAAASqSADxWkX4XBoCEIAABCAAAQhAoDgCiNfieHE0BCAAAQhAAAIQgEAVCSBeqwifS0MAAhCAAAQgAAEIFEcA8VocL46GAAQgAAEIQAACEKgiAcRrFeFzaQhAAAIQgAAEIACB4gggXovjxdEQgAAEIAABCEAAAlUkgHitInwuDQEIQAACEIAABCBQHAHEa3G8OBoCEIAABCAAAQhAoIoEEK9VhM lIQCBQGDx4sW64IILNHny5IKQ7L333ho8eLDatGmz5PiFCxdqyJAhOvnkk9WlS5fU72fNmqWRI0dq6NChateu3ZJjk vtv// 2nrrrZcc94Mf/EBXXXVVzhhyXbOgYCM/aPr06Xrqqad04okn5ow0  8TJ05MHbfvvvtmHG/ l1xyiU444QTdeOONOuSQQ5bch8gREB4EIFBjBBCvNXbDCBcC9UggW0w21keLqbvvvjslXseMGaObbrqpKCRHHHGE vXrlxLLu 66qx599FFZxI4dOzZD5I4aNUo77LBDStymW7bQ3nTTTVMCOV0cFxVQCx9cyAeF0aNHp/pt1uaQ3r9EvG6  eYpwfvOO 802oOkLbeT617V64eCFr6tXA4CrYoA4rVV3W46C4E4CZQqXps785pPvCaziKeffnoDUTplyhStv/76S2YVLcos8mpJwKaPgnwzrxap/pCQ3a mZl5zMcs16pJ7vs022zSYxY1zlBIVBCAQCwHEayx3gjgg0IoJJELGYvLmm2/WSy 9lJOGZzkPP/zw1GxpdtpAMfjSr5c 83rKKafo3HPPzXn9ZAYx zpOTfA5/pekKxQTSzWOtQA9//zzc17aM6Hm7HuQML7  utTM7GXXXbZEjbJcU4VyGdnn312XmGaPoOe/iGkGjy4JgQgUFsEEK 1db IFgJ1SaAcM6/Z a3ZM4TpM4yNidfrrrtO6bOHTcXmdp1r6xnYWhGvxQwic5wzZ86SnNh0run/z56tzjdD62vnyk8uJiaOhQAEWjcBxGvrvv/0HgJFExg6tOhTMk4YMqTh ekC8fvf/37OxVtJbukbb7yxJOc1mbHz f56O32RULbIcn6sF265fZuP33PPPVNtJTmvnnlNxKuv44VMSX5ssrgrPfok7jXWWCPvgqfm0arM2Rb6 fJV02dLzfDZZ5/NmOXO5ppvBteR55t5tdC35VskVple0yoEIFAvBBCv9XIn6QcEWojAUks170Jff920eM0WoumzqtniNRGQbjU9lcAia9GiRamvuefOnZuRu5mI3eaI1xYRrh98IP3 96UD79DBCrHB fmqMFhUdu7cOfVVf7pwffnll1MMk9 7wez/Fzrzmu/apXeSMyEAgdZGAPHa2u44/YVAMwnEJF7dFVcN PDDD7XKKqs0EK eFcw1 1eIeH3sscdSX5fnmnm1UHNJLs/GZpeMaibezNMXLGi eD3ppKLF69prr71kdtusnNeapFI0Z aVRVplHR00BoFWSwDx2mpvPR2HQGkEYkobcCqAy1nZkvJZ999//5LFSNnCNcnf7N27d0qQHXPMMak0gVxpA PGjUvNQu61114pgZykDbTIjGtpt6bgswpNG8iV79ucnNd6zw8u AZwIAQg0CwCiNdm4eNkCECgHASyc16z0wbSr5FrlXryu7Zt2 rVV19NpQh45tSWPjOaXqP0tttuU9  fXXFFVc0qPOaiDufn70QK18JqXJwaMk20uvYJjPJzkFN6trmmyVNGDrWxvJdk764rm6S2 prvvvuu82qFNGSjLgWBCAQJwHEa5z3hagg0KoINLWiv1Dxmp3zmr5KPhGinql1/qZtl112Sc3Apm9S4Jza/v37y6WxOnTokBJeW2yxRUpw2XLtBLbmmmvWXLWBJHVi5syZck5rYu6LF7ZZaOZKi8iuIpBd9zbhnOTOJu22WKpFq3rl0FkItE4CiNfWed/pNQSiItCUeM3 mjs7HSDXbGyur8aTigXehtZ1StN3xUrElcHkKsyfveo KoBFBpO 21U2y6buRbp49bEWvk7ZMFvX6E123MpXF7fIUDkcAhCAQAMCiFcGBQQgAAEIQAACEIBAzRBAvNbMrSJQCEAAAhCAAAQgAAHEK2MAAhCAAAQgAAEIQKBmCCBea ZWESgEIAABCEAAAhCAAOKVMQABCEAAAhCAAAQgUDMEEK81c6sIFAIQgAAEIAABCEAA8coYgAAEIAABCEAAAhCoGQKI15q5VQQKAQhAAAIQgAAEIIB4ZQxAAAIQgAAEIAABCNQMAcRrzdwqAoUABCAAAQhAAAIQQLwyBiAAAQhAAAIQgAAEaoYA4rVmbhWBQgACEIAABCAAAQggXhkDEIAABCAAAQhAAAI1QwDxWjO3ikAhAAEIQAACEIAABJolXseMGaPnnnsuRbFbt27q16/fEqKzZs3S5ZdfrkWLFmmFFVbQd7/7Xc2cOXPJ39dff32deOKJqb/ZJkyYoAcffDD1//bt22vYsGFLjl2wYIGGDh2qxYsXp37Xp08f7bjjjkv PnXqVI0dOzb1c5s2bTRkyBB16NCBuwsBCEAAAhCAAAQgUGcEShavkyZN0lprraWtttpKCxcu1EUXXaSDDjpoyc933HGHDj/88JQ49bGPPPJI6u/bbbddA4QWn PHj9fAgQO10korpYRq586dddppp6WOHTRokDp27Jj62SL3oYceSv1u3XXX1ezZszV8 HD16tUrJWj9e1u6 K2ze0Z3IAABCEAAAhCAQKslULJ4zSbmWdhOnTqpR48eDWAms7AHHnigdt555wZ/Txen/qMF6hNPPJGaQfVsbSJsLVaTWVi307NnT40YMULz589fIlbThbCPxyAAAQhAAAIQgAAE6odAWcRr9sxrNp5k5vXjjz9O/WmfffZZInKzxaj/bgE6btw49e7dW/PmzVsiZJNUgPTZ1Wzh65lYz7ruscceKXGLQQACEIAABCAAAQjUD4GyiFfPutrSc14TRJ51HT16tPr3768uXbosSTHwV/yepc0lNtPF67Rp0zRnzpyMPNZEvDrNIDvFAPFaP4OTnkAAAhCAAAQgAIFsAs0Sr16MNWrUKHXt2jVnusCMGTPk3NczzjhD7dq1W3Jt/37KlCmpBVtuwwI0SQNg5pVBCgEIQAACEIAABCCQj0CzxGtTea6uADBgwIAM4epAskUtOa8MUAhAAAIQgAAEIACBQgiULF6dx/rKK69klLtKLthYDmwyW tyWEmaAdUGCrlVHAMBCEAAAhCAAAQgULJ4Ta/xmmBMFmKl13hN/rbccsvps88 S/3oGq9vv/12albWebA26rwyGCEAAQhAAAIQgAAEmiJQsnhtquHG/u7ZV4tfi91EvDanPc6FAAQgAAEIQAACEGgdBKoiXp3zOn369JzVCWLBPn3m wWFsvUmqxV0HAdBAAIQgAAEIAABCDSfQFXEa/PDrmwLFq6I0soypnUIQAACEIAABCBQCgHEaw5qiNdShhLnQAACEIAABFoZga /lq68Unr3XWnffaVu3VoZgOp0F/GKeK3OyOOqEIAABCAAgVoncMAB0k47SZ06SddfL11 udS1a633Kvr4Ea I1 gHKQFCAAIQgAAEoiNw8MHSySdLO wQQnv4YenOO8NMLFZRAohXxGtFBxiNQwACEIAABOqOwJQp0iWXSJMnZ3ZtqaWkr76S7LGKEUC8Il4rNrhoGAIQgAAEIFCXBDzr2rOnZJ9uRx8tHXaY1L17XXY7lk4hXhGvsYxF4oAABCAAAQjUBoFtt5WeeaZhrOecIy2zjGSPVYwA4hXxWrHBRcMQgAAEIACBuiPw4IMhr/Weexp27YEHpLvvlq6 uu66HVOHEK I15jGI7FAAAIQgAAE4iYwcKC02mqSfba99VZYwGWPVYwA4hXxWrHBRcMQgAAEIACBuiPgfNbzz5e23z5311ZeWZo7V7LHKkIA8Yp4rcjAolEIQAACEIBAXRJYemnpiy8k 1x25JHSccdJzovFKkIA8Yp4rcjAolEIQAACEIBA3RF4/nnpqKMk 3zWt6 0666SPVYRAohXxGtFBhaNQgACEIAABOqOwPjx0ksvSb/7Xf6uDRsmLVwo2WMVIYB4RbxWZGDRKAQgAAEIQKDuCAwYIK23nmSfz 67T3JFgpEj6677sXQI8Yp4jWUsEgcEIAABCEAgbgK77y4NHizZ57MXX5QOP1yyxypCAPGKeK3IwKJRCEAAAhCAQN0R2GYb6c9/ljp2zN 1Tz4JpbTssYoQQLwiXisysGgUAhCAAAQgUFcEFiyQNthAsm/KNt5YevRRac01mzqSv5dAAPGKeC1h2HAKBCAAAQhAoJURePJJadAgyb4p23FHafhwyR4rOwHEK K17IOKBiEAAQhAAAJ1R CWW6TXXpPOO6/prjnnde 9Q 4rVnYCiFfEa9kHFQ1CAAIQgAAE6o7Ar38trb66ZN UnX22tNxykj1WdgKIV8Rr2QcVDUIAAhCAAATqjsC  4YNCuybsltvDdUGGqsH21Qb/D0vAcQr4pWXBwQgAAEIQAACTRHYZBPprrsk 6bMi7XOPTcs2sLKTgDxingt 6CiQQhAAAIQgEDdEdh2W2naNGnppZvu2uzZ0o9 JNljZSeAeEW8ln1Q0SAEIAABCECgrgi89Za0ww6SfaHmWq/z50tLLVXoGRxXIAHEK K1wKHCYRCAAAQgAIFWSuCxx6RzzpHsC7X115ceeECyx8pKAPGKeC3rgKIxCEAAAhCAQN0RuOEG6fHHJftCbc89pYEDJXusrAQQr4jXsg4oGoMABCAAAQjUHYERI6Rll5VOOqnwrvXvL221lWSPlZUA4hXxWtYBRWMQgAAEIACBuiPgElk77RRKZRVqV18tffhh2JULKysBxCvitawDisYgAAEIQAACdUfgJz8Js672hdrEidL110v2WFkJIF4Rr2UdUDQGAQhAAAIQqDsCBx8cFmxtumnhXZs5UzrgAMkeKysBxCvitawDisYgAAEIQAACdUdgnXWkp56S7Au1r76Sdt djQoK5VXEcYhXxGsRw4VDIQABCEAAAq2QwLe/Lb33nmRfjG24oTRpkmSPlY0A4hXxWrbBREMQgAAEIACBuiPw2WdS27aSfbG2335S376SPVY2AohXxGvZBhMNQQACEIAABOqOgGdct9mmtK1eXWKrTRvp OPrDks1O4R4RbxWc/xxbQhAAAIQgEDcBP7xD6lHD8m WLvzTmn8eMkeKxsBxCvitWyDiYYgAAEIQAACdUdg nTp2GMl 2LtzTelXXeV7LGyEUC8Il7LNphoCAIQgAAEIFB3BB59VDr33NKrBnixlreWXXPNukNTrQ4hXhGv1Rp7XBcCEIAABCAQP4E//Um69lrJvhT7xS kn/5UssfKQgDxingty0CiEQhAAAIQgEBdEnDOqstd2Zdid90VhO8NN5RyNufkIIB4RbzywoAABCAAAQhAIB Bm2 W/vlPaejQ0hntuad03XXSuuuW3gZnLiGAeEW88nKAAAQgAAEIQCAfgUsvlebOlexLtU8 kXbaKWxy0Lt3aGW11aQVV5R 8AOpU6dSW26V5yFeEa tcuDTaQhAAAIQgEBBBC64QFq8WLJvrj3xhPTYY9KcOdIyy0j/ lf4t9Za0qBB0t57N/cKreJ8xCvitVUMdDoJAQhAAAIQKInAmWdKK68s2VfKXNFg7FhpwIAwE4s1SgDxinjlJQIBCEAAAhCAQD4CFpTrrReEZaVtu 1Cbu1ee1X6SjXdPuIV8VrTA5jgIQABCEAAAhUl0K ftO22kn1L2I9 FFILllqqJa5Wk9dAvCJea3LgEjQEIAABCECgRQi0dJ3Wyy8PebD2WE4CiFfEKy8NCEAAAhCAAATyETj6aGm//aR99mk5Rt/7Xph99UIurAEBxCvilZcFBCAAAQhAAAL5CDj/9NRTWzYP1bVln3lG v3vuS85CCBeEa 8MCAAAQhAAAIQyEfAOaguk2Xfkrb  tIDD0j2WAYBxCvilZcEBCAAAQhAAAL5CGyzjXTVVZJ9S9rEidLjj0sjRrTkVWviWohXxGtNDFSChAAEIAABCFSFwPe/L91 u2Tf0vaTn0gnnSTZY0sINEu8jhkzRs8991yqsW7duqlfWhmJGTNmaPTo0VphhRU0YMAAdenSpVHsyfG52lq0aJFGjRqlN954I2d7U6dO1VgX95XUpk0bDRkyRB06dCj5Nk f b623mS1ks/nRAhAAAIQgAAE6oSAa7xOmRJqvba0ff21tO66kmdht9yypa9enuv985/Syy HLXatzbzwbaWVmtV2yeJ10qRJWmuttbTVVltp4cKFuuiii3TQQQelfk7Mv7/88svVp0 fRsXrrFmzUuLTInf55ZdPCdWuXbuqR48eqaYskjt16pT62SL3jjvu0BlnnKF27dpp9uzZGj58uHr16qUdd9xRg7y9mqRhw4aVDAbxWjI6ToQABCAAAQjUF4FOnaQZMyT7aplnXi38FiyQtthCmj9f s53pP/8R1pzTc/cSd/9rrTnntIqq1Qryszr3nZbWHDWrp207LLSxhuHbXEtZPv2lU45peQ4Sxav2VdMF5jFitfscy1Qp0yZohNPPFHvvPPOEmFrsZrMwnbv3j0llEeMGKH58 cvEauehR0/frwGDhyodf1ppQRDvJYAjVMgAAEIQAAC9Uhgww0lf8vsLWKrac8 K73/vvTf/0offSQtv7z04YfS0kuHurDf pZ0zTXSvvtKv/61tNlm1Yn2hhvCAjcL6d69pR13bBiHRa1nkx96qKQYyyJemzPzmi1G3QvPxDrloH///vrggw WCFmnINgsdm1OU/BMa8eOHXXaaaelfueZWM 67rHHHurZs2dJUBCvJWHjJAhAAAIQgED9EbBITMRiLfTOQvvII6VevaQzz2yZiN97T/rjH4NotXj2dZuqkvDUU5K/YffscZG7iZVFvKaLyXRKhaQN5BK 6eL15Zdf1iuvvJKahc0WrwceeKCGDh2qzp07I15bZnhyFQhAAAIQgEDrImBh5dzTWrNrr5XuukuaPLlykd97r3T//dIdd0gDBkjHHit17Fj49ZwG4Tq6nlUuwpolXpNZ0/T81GLFKzOv3xDzC2PRIumzz6SvvgpfAzhPBKsdAq  Ks2cKb3zTkhMX2aZkIu09dZhX2wMAuUk8NJL0hNPSG 8IS23nLTJJmEWo337cl6FtiDQugl8 mlIF7CvRbNwHTVKuvHG4kRlU3294gppwoTA5oQTpB//uKkz8v/9yy/D UWkEDRLvObKcy1WvPr4msh5XbgwCBInSX/wQbhhzidZY43ib5hXLXrnDP/z1xH 2Tk1L7wQHkCzZgXB4wTxn/0s/N95I01VUJg2LbTph5qFk//94AfS/vs3fW4hvXj  bBd3d/ FoS2PzE5MXzttaXNNw9fETghe7XVQu5NYh6Y5vbuu HrAX/9snhxOHeDDSRvg1eL9tpr4d6Zt1/ELmDtDx7bby99/nlIpv/rX6W33pLeflu6 GJpjz2a7qnPSVZmenxstFE4r5mrM5u MEeURMDvB9/ dhCQLWUnnugcqTDG9t47jBe/Jv1AOeyw8CDwdpbNseRDmL8O/OILyWlb/kDtD2S rj9gYxCoJIEHHwzPHD/b/P7nZ4 fM35G tn25puSF4k777Nr1/A89g9Sm/4AACAASURBVM/bbVe qPy88jPOvlbt3/8Oi7y8gGr33ZvXCz/rhgyRdttN s1vyreIzc9Jz9x6prgAK1m8utpA9tf52dcrJG3A50RZbeCpiSEB2i8OT4n7zdsPCQvCTz6RLMj8grKwPOAA6ZhjGsdt4fbb30r33BOEqs/xnsUWe55iX3XVhudb6PkBddNNkoWSr3n44eHhYcHn2Cwg7747eD9EDz5Yats2iEKLKovGK6 U vQJdeI8PV o foWrPfdJ02fHpLE3Y5ndryq0QLNbxoW9Y7TYttfr3g2yH3zi92fVi26/WC3WHV//TuvjPzf/yTPVvr3Fn7O0Wkqwdwzm34D83nur7m4fef4 A3GD3G/gfnB67bM4Ic/DB8MfK98HzbdNDDym59/55 LsdGjQ1K874HvnZlasDb2VYnZ D447ksucW25sPoysalTpb/8Rbr  vCmYNHq N0P99F/9/1zDpPHYSnmD2Dm4X9 8zc/f8jwfUju1 qrh/vqB4X/ZrHisW/vDxwWaRbo9v67j/P98/g1d78 8plfN74/Hku D 6X23VcHq8 36Vg/BDK962DjzVDv9G5/Irb9Myjx51Z R74Z7fn9j0mPD7N099uuJ/un6/hMekHoWs3FjMz7tehP4j4deex6Db9cPAHOL/efN/MxP1xPH69Wuj5d762Y3Ebfg14HPr15MWlhXw4efpp6Xe/C LUAjaXPfxwWOFrNm7z5z8PD5iEse9dLjNbjzPfHz/kzMYfulyY3f3zvTV3t/noo2Ec j3C/XabnTtLLono97d11sm9uMXXePHF8Hr0ffLr2e9dbtv3yq/HXXdtWnxYqFvUvPJKiNGvJcfla/v1k v9NL3P8 aFup3uq7 u9D30B/8ddpCch2fx4w RHo9//3v4ve VX4NHHFH8q8 vHff5H/8I49bjwO/ffr35tegP/GbgD6qOP61qT0EX89j3P78fm43vva/p14W/zbP5/34te9z7PdjX82vZv/Nrw2PU79lm6fts83333z/ OMTo  dyUX4W Bng88za7XhCx4uJ3L776Xb8vmduvs9 zbnPyXufGXvMeMLG5/o4r0T369W5kx4f5nTUUeF15PGb3g9f2/G6vx4DjtHvaebsD3Clvk9mA/eHNz8j7GvdjjtOOvBAqXv30npy9NFhjPn55/FQbnv99f /z020XbJ4Ta/xmlxjn332WVLeyr/LJ15dTSApjZXUf42uzutdo/9/VtAv1nwPU7/xWJQ  aT0i1 EWc5EDPlN2S/aSy8NA/ gg6T /cPDqxRLPoX6zdYvdL9Q/UZgEeYZ2sbSDCxA/UDz7InFih8QfiPyQyeZSbZYtxD0m7fb8oN5l12knXeWDjkkvMEXan4j8QPaffVDujHzG9B114WcGZsfYH4I Q3Lb8h c/ID2cLAb8QWGr4nftOzILA4WHHFwMSCyv/8xuY3a8fg//vN2uf6PiSi19f1p0jPIvlh6/vnB0cu84vKnwjPOEO68MIgWEupuWdx8Ic/SOPGST/9aRCSHid Y/dD0V/75uNssWThbB5 40hEuPvnB5EfVn7Q P/uo  z74MfGP6dHyRe9Wl2FgoWTeZnNn7Q Bybvbn5AeXxYu5 QPlBZu Hi3n73vjh63YtWjzG/KneDyCPSbP2hxWPV/P1h0CPI48Jf6Cw971zO47BH0DchzvvDOPTry3fa4sHj0uzs5Byn3yffH/9sPfD0uPV7SWi2r9L0m SMeAHof9v3mZjEeEY/SHUMfo15IUGFijmk23m4sUIvgdnnRVmwz2bkbyezd6M/CD1hzl7s/M1LdbdB7MzQ//se K  2d/XbbTTqFPFqYe/76/vj9m7a/ LPomTfr/MdvUa9Hx nXjDwx f/Lrwrv1 IOWP5T6dW3x5j64fd8zC26/h/mYpgqyu6/uj/vge X7bu Hm  lRbzHnoVz8q2LuVqoe1x4DPg1bi5m57bcht8HLJ7MwffX5/i  u9u268DjwGPOQtnj0G34deo77E/APrDsD9cWnS6T369 MOM77ffayyW3LaFvV9vFmK T0luY/p7h3/vseRvWfx 7ntgcZ Iqcbuwy23SN6jPhGT5upY/RpMPhw6Zr9HmpX77deR43Uf/I1bdtUcj1 P2UceCX3268rvYWbk8WLejtmvab/GPdZtyfuix5vHhsdtIl7dXzPxzz7f7ym N34d X3VY9X/dz8scn0/k/HuY/0sSa7l  XjLUyTD3E 1 8l/rDjeDyW/dpwHxyHx6XHg1 Tfg/xM8Af1Jv6EJKP/fHHh/Y82dJc8z3xOEoEfXPbq/b51iHm4lqrxZi/yXE q59bEVjJ4rU5sTvP1eLXYrepzQuac51Szy2p2oCFUDIb44eFX3wWg77hfij6004M5hegZ678cPUbTvIG5jcZv9kls8DJV4MtHbM/NXvm1p/ckzd1PyT8oLFwqUT9Oj8Q/cD0g9wJ7v6k72v7wejZGL/pexbGFS38ybVc5g8Hni3yQ7iYr2D9gLfY8ht9skrTD65kNsX/d3v2fgj6Xvrh7IdJpc0PRT/YzNQPOj/Y/FB0HI6hUPM49UM6mQlyG35AV L JzFZ6PmbEX9IsXC0aPQ1LeL9sHVf/M3HN5VNCu1KwceZnWdW/fq0UEqu6w9JHid L/HMR3MtmZnzeLFYsVngpX8T0Nxr PyknI v5/cZCxEzLcQ8fvxNhF8jFq3JzLUFtd8H/P7amPk87wnvmVmLVr vua e7bM4shgp1fw 4TriFuDnn9 wFffXH0692toiyoK12N2R/P7njXfcD48Ff7DxhwWLbwtD98Gzs55B83tjoVxL7XNLnGfBnZ5u1pxremz7w4vfK5tr/oDgWVz7ejHv2OUJGGuTQszj1x/CSv0wUcg1ijymKuLVs6zTp0/P2JGryLgrenhJ4jU9Ij/k/CZTSj5sRXtG400S8BuovxK1eEq KvPXpy29p3WTgXJARQn4A6hFj79e9ocAf5Ap9qvcigZI41UnYOHqD7UeH57B9Qcczyr6m5VzzgmzVOV42PvbCAsnCzvPMpejzarDa4EAfvWr8GGlubOv/nbs0EPDt2T1ZE5dvOyyhjP72X10CoY3f/I3MxFZVcRrRP3PGYrFa6HGNrKFkuI4CEAAAnVGwKkh/qbIwsZfr3s21qknWPUJeBLCaRvf1IUvOSDPfo8YEWbT68k8OePUAadu5DN/y QPAE41iMwQrzluSLNnXiO7yYQDAQhAAAIQaHUEnK7kb0 akxLjNSCnnx7WgtSbOSXHM9NOmco2zzY779jfKkRoiFfEa4TDkpAgAAEIQAACzSTgxUWuQdqcRUaemTzvvMZnKJsZZlVP94JLLwz0YlrnTzu32vnWXlwe8bcIiFfEa1VfN1wcAhCAAAQgUBECzun04r9zzy29eVdzcMUg 3o1LzI0Ky8y96JYz8ZGluOajR7xinit15cj/YIABCAAgdZMwLWAvXjOvlTz9qcur2aPRUMA8Yp4jWYwEggEIAABCECgbARcrs95r/almssoekOLpA55qe1wXlkJIF4Rr2UdUDQGAQhAAAIQiIaAa7SOHBkqQZRirm/qTTzssWgIIF4Rr9EMRgKBAAQgAAEIlJWAFyK5pql9KeYd27xDnT0WDQHEK I1msFIIBCAAAQgAIGyErjoorDbm7d2LsWuvjpsQGGPRUMA8Yp4jWYwEggEIAABCECgrAT 9Kew7bd9KeaUgzffDKkHWDQEEK I12gGI4FAAAIQgAAEykrgjTekH/9Ysi/FLrlE s9/pAsvLOVszqkQAcQr4rVCQ4tmIQABCEAAAhEQWG45yduh2hdr558vffaZZI9FQwDxiniNZjASCAQgAAEIQKDsBH72M2nYMGmzzYpvevBgqU0byR6LhgDiFfEazWAkEAhAAAIQgEDZCfTsKR16qGRfrA0cGGrF2mPREEC8Il6jGYwEAgEIQAACECg7gbPOktq2leyLtZNPlr77Xckei4YA4hXxGs1gJBAIQAACEIBA2Ql4g4HHHw9VB4q1446TNt9csseiIYB4RbxGMxgJBAIQgAAEIFB2AlOnhq/97Yu1o4 WdthBsseiIYB4RbxGMxgJBAIQgAAEIFB2Au  G2ZP7Yu13r1DqS17LBoCiFfEazSDkUAgAAEIQAACFSHw7W9L770n2Rdjzd1etphrcWzBBBCviNeCBwsHQgACEIAABGqSwA9 II0dK9kXY/vtJ/XtK9lj0RBAvCJeoxmMBAIBCEAAAhCoCAHnrO6/v9SjR3HNH3OM5NnXPfcs7jyOrigBxCvitaIDjMYhAAEIQAACVSdw/PFS166SfTHWvbs0aJBkj0VDAPGKeI1mMBIIBCAAAQhAoCIELrxQ ugjyb4Y22UX6bzzJHssGgKIV8RrNIORQCAAAQhAAAIVIXD99dKTT0r2xdj220uXXirZY9EQQLwiXqMZjAQCAQhAAAIQqAiBe  VrrtOsi/Gtt46bG5gj0VDAPGKeI1mMBIIBCAAAQhAoCIEnnpKOv10yb4Y22wzafx4yR6LhgDiFfEazWAkEAhAAAIQgEBFCLz unTssdLDDxfX/EYbhdlaeywaAohXxGs0g5FAIAABCEAAAhUhMH9 qDZgX4x16RIErz0WDQHEK I1msFIIBCAAAQgAIGKEPjsM6ltW8m GPvOd6RnnpHssWgIIF4Rr9EMRgKBAAQgAAEIVIxAmzbSwoWSfaHWsaP0yiuSPRYNAcQr4jWawUggEIAABCAAgYoRWGMN6cUXJftCrV076c03JXssGgKIV8RrNIORQCAAAQhAAAIVI9CzpzRsmLTBBoVfYostpKefllZYofBzOLLiBBCviNeKDzIuAAEIQAACEKg6gVJqti67rPTJJ5I9Fg0BxCviNZrBSCAQgAAEIACBihEoZavXpZaSvv66YiHRcGkEEK I19JGDmdBAAIQgAAEaonAz34m/epXkn0h9vnn0oorSvZYVAQQr4jXqAYkwUAAAhCAQOsj8PLL0ve/X F H3KIdMABkn0h5nSB1VYLaQNYVAQQr4jXqAYkwUAAAhCAQOshcMMN0qWXSi 9FHTlnXdWsO9HHy3tsINkX4h9 KHUubNkj0VFAPGKeI1qQBIMBCAAAQjUN4H//Ee68krpqqukd9/9/76uskoow1oxO ecsNlA//6FXeL996WNN5bssagIIF4Rr1ENSIKBAAQgAIH6JPDqq9LFF0vXX9 wf65E5RnYX/6ygn0/80xp5ZUl 0Ls7belbt0keywqAohXxGtUA5JgIAABCECgvgg88IB02WXS/fc3XLi/9trSCScE0eqZ14rab38b8lftC7HZs6Uf/Uiyx6IigHhFvEY1IAkGAhCAAARqn8Bnn0k33yyNHCn9/e8N  MJzVNOkQ4 WFpmmRbqrxX0nDlBSRdir78u7b23ZI9FRQDxiniNakASDAQgAAEI1C6BfPms7tHSS0v77htE6847V6GP114rPfecZF IzZwZVpHZY1ERQLwiXqMakAQDAQhAAAK1R C116QRI6Rx46TFizPjb9tWOuoo6dRTpXXXrWLfbrlF vOfJftCzCUQzj1XmjChkKM5pgUJIF4Rry043LgUBCAAAQjUE4EpU8JCq8mTG azusrUiSdKxx4b1klV3e67LyTe/v73hYXiWVon49pjURFAvCJeoxqQBAMBCEAAAnET8IZT48cH0friiw1j/eEPQ2pAz57St74VUV8sXB20fSH29NNhutgei4oA4hXxGtWAJBgIQAACEIiTwAcfhNqsrtE6b15mjM5n3W /oPV23DHO PX449LgwUr5QuyxxyTXhrXHoiKAeEW8RjUgCQYCEIAABOIi4MX2zmcdO7bhTqnOZz3ySOm006qcz1oIsmLTAJwTMWyYZI9FRQDxiniNakASDAQgAAEIxEHg0UfDt yTJjXMZ/VGVc5nbZH6rOXC8fLLoTaXfSH2l7 E/Fh7LCoCiFfEa1QDkmAgAAEIQKB6BL74QrrttiBaZ8xoGMeWW4Z81sMOa8H6rOXCMWuWtPvukn0hNnFi2A7MHouKAOIV8RrVgCQYCEAAAhBoeQIffSSNHh0mGufOzbz UktJP/1pyGe19qtZe cdaYstJPtCzCWybr2VUlmFsGrhY5olXseMGaPnvikh0a1bN/Xr129J IsWLdKoUaP0xhtvaIUVVtB3v/tdzUwr9Lv  uvrxBNPTP3NNmHCBD344IOp/7dv317DnGfyjS1YsEBDhw7V4m Kx/Xp00c7pmWET506VWOdjCOpTZs2GjJkiDp06FAyyukz39fWm6xW8vmcCAEIQAACEKgFAhaqzmf9wx k//43M2I/nnv3ln79a2mDDWqhN03E6A527y799a FdeaPf5TuvVeyx6IiULJ4nTRpktZaay1ttdVWWrhwoS666CIddNBBqZ9tFradOnVSjx49NGPGDN1www06 OCDtXOObTUsPsePH6 BAwdqpZVWSgnVzp076zRngEsaNGiQOnbsmPrZIvehhx5K/W7dddfV7NmzNXz4cPXq1SslaP17W7r4LZY44rVYYhwPAQhAAAK1ROD556WLLgqTil9 mRn56qtLxx8f/q26ai31qolYXeNrxRUl 0Lsppukhx W7LGoCJQsXrN7kS5WZ82alZoJHTBggNq1ayfPwg4ePFjbb7 9errwW5ali1P/yQL1iSeeSM2gerY2EbYWq8ksrEWw2xoxYoTmz5 /RKymC2EfX4ohXkuhxjkQgAAEIBAzga /Dumbzmd94omGkW6ySUgN6NNHWm65mHvSjNhc08uJvfZN2XXXSdOmSfZYVATKIl6zZ1490zplypSMtAAL1A9cJE7SPvvsk5qRtWWLUf/OAnTcuHHq3bu35s2bt0TIJqkA6bOr2cLXM7Gedd1jjz1yCuVC6CNeC6HEMRCAAAQgUAsEFi2SbrxRuuwy6Z//bBix81j9RafzWuvePPP6/vthBrYpu/rqsAuDPRYVgbKIV8 62pKcV6cUvPLKKxniNTnGqQVOMfBX/BawucRmunidNm2a5syZk5HHmohXpxlkpxggXqMaXwQDAQhAAAJVIvCf/0iXXx42FvD/023ZZaVDDpEGDpQ226xKAVbjsl4P48K1hayL8Yyrd2M4  xqRMo1GyHQLPGaLMrq2rVrKv91tJcqplmXLl1SqQNelJUucNNnZt2GBWiSBuDTmXllzEIAAhCAAARKI2BtNny4NG6c9M065yUNtWsnHXusNGCAtNZapbVf02e5015oXkjnL7kkVCawx6Ii0Czxmp7nmt6rXDmvrjzQvXv31IIui9c77rhDZ5xxRionlpzXqMYEwUAAAhCAQA0S8C6mrhyQa1OBLl2CYHVRoEK Ma/B7hcW8vrrSw88INk3Za56tHBh2GULi4pAyeI1V2pAes yqw0kYnX55ZdPldByOawkzYBqA1GNCYKBAAQgAIEaIfDVV9IddwTR uyzDYPedtuQz q10oWsUaqRbpce5ve/L91 u2TflJ1/vvTZZ5I9FhWBksVreo3XpEfpC7Eaq/PqGq9vv/12KqXAqQU26rxGNS4IBgIQgAAEIibwySdhEfzIkQ03jPKmAl4Tffrp0o9 FHEnqhHa4YcHMN6soClzrqvLLpDz2hSpFv97yeK1OZFa2Fr8Wuwm4rU57ZX7XKoNlJso7UEAAhCAQDkIOAXTu2Bdc430TQGfJc22aRM2FfAirLrYVKAcwLLb8AZHTghO2 go72VcN95Jwt/Uj69EOLRZGoGqiFfnvE6fPj1jR67Swq/MWYjXynClVQhAAAIQKI3Aa6 FTQVuuSV8k51u3kjgV78KOa11talAaagaP8t1wQYPLmyfW dbeGHXNxsmVSIc2iyNQFXEa2mhttxZFq FGtvIFkqK4yAAAQhAoFgCjz4aFrv/ c SNxlIN8 unnKKdOSR0jc7rRfbfOs73sVsTzihsKK2J50UprDtsagIIF5z3A5mXqMaowQDAQhAoFURSBZhWbS6qlO2bb99mAw84ADJ a1YEQQMzXmv9k2Zp7M33TRMa2NREUC8Il6jGpAEAwEIQKC1EmhsEZYrBfz852GtUSHpmq2VYZP9PuywANK KXNdMZdrsMeiIoB4RbxGNSAJBgIQgEBrIzB/ftgJy7uQLliQ2XsvwurTRzrjDGm99VobmQr01zkWLsFg35T17Svtuqtkj0VFAPGKeI1qQBIMBCAAgdZCwDtheRGWd8L69NPMXrMIq0Kj4LjjpM03l ybsl/8IuTG2mNREUC8Il6jGpAEAwEIQKDeCTiP9be/lSZObLgIy7OrXoR19NEswqrIOPj1r6V11ilsEdbBB4fdHeyxqAggXhGvUQ1IgoEABCBQjwRcKeDee6WLL5amTm3YQ6dWOp/1wAPZCaui97 Y2q0HHRRmXffbr6Ih0XjxBBCviNfiRw1nQAACEIBAQQRck3Xs2FDuyrVa082VAvyttCcDd9mloOY4qLkEhgwJnw7sm7J99pGOPVayx6IigHhFvEY1IAkGAhCAQD0Q PBD6aqrwm5Y3hUr3ZZdVurVSzrzTGmjjeqhtzXUhwsvlD76SLJvyn7yk5BeYI9FRQDxiniNakASDAQgAIFaJvD222GWdcwY6eOPM3uy8sphIs81Wtdcs5Z7WcOxX3qpNHeuZN Ude8etoa1x6IigHhFvEY1IAkGAhCAQC0ScEqAF2H98Y/SF19k9sA7jHrr1l/ UrKAxapI4MorpVdekeybMpfJOvfcUC4Li4oA4hXxGtWAJBgIQAACtUTgiSdCuatc27d27RpmWXv3lpwqgEVA4A9/kJ56SrJvyrwbxPDh7ArRFKcq/B3xinitwrDjkhCAAARql4ArB7jMlUXrtGkN 7HTTtLAgazzifIO33yzNHmyZN U/fCHIWnZHouKAOIV8RrVgCQYCEAAArES PzzsKGAy129 mpmlK4c4F1HBw WunWLtQfEpTvukG6/XSnflG21lXTddZI9FhUBxCviNaoBSTAQgAAEYiPgxeneutWTcF6QlW7LLScdfnioHLDBBrFFTjwNCDi/w8L1hhuahuOduDxDa49FRQDxiniNakASDAQgAIFYCFiojhgRKgf897 ZUXnhlRdgeTcsKgfEcscKiOP  0OlAfumzEnLEyZI9lhUBBCviNeoBiTBQAACEKg2AS9GdxnQ226TnCqQbknlgF/9SmrbttqRcv2iCTzyiHTeeZJ9U/a974WVePZYVAQQr4jXqAYkwUAAAhCoFoEpU0I 6wMPNIxgk03C9q1UDqjW3SnTdV1pwDfSvinr0kV6 GHJHouKAOIV8RrVgCQYCEAAAi1J4MsvwwyrNxZ4/vmGV3blAG/f6h1CvSgLq3ECzz0X8j3sm7K99w4ltb7znaaO5O8tTADxinht4SHH5SAAAQhUn8Cnn4Y1Oy7jOWtWZjwWqfvuK/3mN1QOqP6dKnMEf/972JvXvilzMvPf/kZSc1OcqvB3xCvitQrDjktCAAIQqA4BL7y65pqwZueddzJjWH75kBZwxhlUDqjO3WmBq3orNNc0s2/KVl1V sc/JHssKgKIV8RrVAOSYCAAAQhUgsD770sjR0pXXSV98EHmFVw5oF /kApJ5YBK0I ozTffDNu92jdlHhhz57Knb1OcqvB3xCvitQrDjktCAAIQaBkC8 aFnbBc7uqTTzKvufrq0sknSyecIK20UsvEw1WqTMD1z7yLRHbB3lxhrbii5E899lhUBBCviNeoBiTBQAACECgHgddfD WuvCNWdrmrddcNs6zHHCO1aVOOq9FGzRCwGN144yBKm7Jllw2feOyxqAggXhGvUQ1IgoEABCDQHAJeh3P  dKdd0pffZXZkstdOZ/VO2J961vNuQrn1iyBjz Wtt66sJxXr9z7 uua7Wo9B454RbzW8/imbxCAQCsh8PjjYaZ18uSGHd5mm7B96377Ue6qlQyH/N10mQnnsto3Zq6h5r1/7bHoCCBeEa/RDUoCggAEIFAogfvuC6J16tSGZ y exCt3bsX2hrH1T0Bz6QuvXTTM6qLF0vt2kn2WHQEEK I1 gGJQFBAAIQaIyA0wFuvz2I1hdfzDySGq2MnSYJLLNMEKX2 cw11bwXsD0WHQHEK I1ukFJQBCAAARyEfDCqxtvDBsLeEFWulmHHHZY2Fhgo43gB4FGCHz729J770n2 cz11NZbr2FdNcBGQQDxiniNYiASBAQgAIF8BP73P2n0aGnEiIYVjlwt4KijwkKszp1hCIECCLRvL/3rX5J9PrO43XTTIHKx6AggXhGv0Q1KAoIABCBgAh9 KF1 efi3YEEmE6 5Oe446bTTpI4d4QWBIgissUbIN7HPZ// t7TttpI9Fh0BxCviNbpBSUAQgEDrJjB/fti 1bthffRRJgtvLDBggHT88dIqq7RuTvS RALrrCM99ZRkn8/mzJFOOkm6554SL8JplSSAeEW8VnJ80TYEIACBggk0thuWUwK8sYC3cWVjgYKRcmAuAuuvLz3wgGSfz5xUvffeDZOrIRoFAcQr4jWKgUgQEIBA6yXgSa7f/jYsxvrss0wOG24oDRok9e7d OLw1kuPnhdNYM89pd//XvKuFfns1VdDYWB7LDoCiFfEa3SDkoAgAIHWQeC114Jo/eMfpS  yOzzZptJZ50lHXxwKMuJQaBsBLbYInxSss9n3qqtVy/JHouOAOIV8RrdoCQgCECgvglYDwwdKt19d8MtXL0blstd7btvfTOgd1Uk4IVYV1wRFmTlsxkzpGOOkeyx6AggXhGv0Q1KAoIABOqTwLRp0vnnS3/ c8P /ehHQbT  Mf12Xd6FRGBnXaShg2T7PPZM89IJ5wg2WPREUC8Il6jG5QEBAEI1BeBhx4K6QGPPNKwX3vtJZ17rrTddvXVZ3oTMQHvGzx4JMJ1HwAAIABJREFUsGSfz7zf8MCBufcdjrhrrSU0xCvitbWMdfoJAQi0MIFJk4Jo9YxruiVbuJ5zjrTlli0cFJeDgKsInHxyqCaQzx59NHyqsseiI4B4RbxGNygJCAIQqF0CX30l3XlnEK0vvJDZj299KyzA8qRX166120cir3ECP/95yGe1z2dTpoTUAnssOgKIV8RrdIOSgCAAgdoj8OWX0s03h d9dnWhZZcNpa4sWrt0qb2 EXGdEejZUzr0UMk n/3lL6Gclj0WHQHEK I1ukFJQBCAQO0Q Pxz6Q9/kC66SHrzzcy4vZnA0UeHOq1rr107fSLSOifgElg9eoRSWPnsT3 Srr1WsseiI4B4RbxGNygJCAIQiJ/A4sXS6NHS8OHS229nxtu2rfTLX4YdsRrbPj7 XhJhXRLo21fadVfJPp/ddVf4KsEei44A4hXxGt2gJCAIQCBeAosWSVdeKV1yifTuu5lxtmsnnXiidOqpkv PQSBKAmecEZKujzgif3i33RaEqz0WHQHEK I1ukFJQBCAQHwE/ve/kAJ46aXS  9nxrfqqtIpp0gnnSSttFJ8sRMRBDIIuH7rxhuHOq75zML1r38N TBYdAQQr4jX6AYlAUEAAvEQ PBD6fLLpZEjpQ8 yIxr9dWl006Tjj9e va344mZSCDQKAF/NeAkbPt85u1jXSbLHouOAOIV8RrdoCQgCECg gQWLgypAd5F0wI23Tp1kn79a m44yQvysIgUFMEvILQeS32 ey660KBYnssOgKIV8RrdIOSgCAAgeoRWLAgfFN61VXSxx9nxuHJKqcL9usnLb989WLkyhBoFoGzz5aWW06yz2fXXCP97W SPRYdAcQr4jW6QUlAEIBAyxPw4iuLVlcQ OSTzOt/97thkuqooyTXbMUgUNMELrhAcrkM 3w2apT0j39I9lh0BBCviNfoBiUBQQACLUdg3jzpd78L3476eZ5uG2wgnXlmWJTt3bEwCNQFAdd386pD 3x22WXSnDmSPRYdAcQr4jW6QUlAEIBA5QnMnRsmnm64Qfrss8zreSH2WWdJv/iFtPTSlY FK0CgRQl49aF31LDPZxdfLL33nmSPRUegZPG6YMECDR06VIsXL1b79u01zHsCptm8efN0wQUX6Isvvkj9tk fPtpxxx3zApgwYYIefPDB1N z20u/Vq62pk6dqrFjx6bObdOmjYYMGaIOHTqUDHv6zPe19SarlXw J0IAAhCIlcCsWUG0jhsneXesdNt007CF60EHIVpjvX/EVQYCTuh 6aWQ2J3PLrxQ ugjyR6LjkDJ4jXpyYgRIzR//vwM8bpo0SINHjxYa621lk477TRNnjxZ9957r8444wytu 66DSBYfI4fP14DBw7USiutlBLFnTt3Tp1rGzRokDp27Jj62SL3oYceSv3Obc2ePVvDhw9Xr169UuLYv7dli liyCNei6HFsRCAQC0QeP11aehQ6Y9/lL78MjPiLbcMovWAA2qhJ8QIgWYSKKSSwHnnSZ58s8eiI1AR8ZouRi0wEzG70UYb6dhjj20AIV2c o8WqE888URqBnXmzJlLhK3bSmZhd955Z/Xs2VPZ4jn72qUQR7yWQo1zIACBGAm89po0ZIh0xx3SV19lRrjNNmHB9T77xBg5MUGgQgT8tcMjj0jXX5//AoVUJKhQeDTbNIGKiFfPtN53330666yz1MkFAb ZPbXPnhHNFqM xgJ03Lhx6t27t5x kAjZJBUgfXY1W/h6JtbX2GOPPVLithRDvJZCjXMgAIGYCLzyinTOOWGHy6 /zoxshx2CaN1775giJhYItBCBW2 V7rlHss9nXqm48sphxSIWHYGKiFfPnD7yyCPq3r279t9/f82aNUsXX3yxVl555QbiNZfYTBev06ZN05w5czLyWBPx6jSD7BQDxGt0Y4yAIACBFiTQmGjdZZcgWvfYowUD4lIQiI3AnXdK48dL9vns9NOlNdeU7LHoCOQVr/6qf9SoUXrjjTcygu7fv7 22mqrJb/LlfM6Y8aM1Myrc2E//fRTrb/  qn/t23bNiVC042Z1 jGBAFBAAI1SMCi1cL07rsbzrTutlsoh7XddjXYMUKGQLkJ/OlP0rXXSvb57OSTJRc4tseiI1CRmVfPtHr1/4ABA9SuXbsGearZFMh5jW5cEBAEIFAjBCxavdjK34JmpwcgWmvkJhJmyxK4/37p0ksl 3x2/vnSOutIffu2bGxcrSACFRGvvvKYMWNS a49evTQtddeqxdeeEFnn3221vQ0fJZRbaCge8VBEIAABJYQsGj9zW kiRMbitbdd5d  1tmWhkuEMhJwIu1XEXAPp/17y/5W2Z7LDoCFRGvTjkYOXJkKtd1qaWW0tJLL52ahd3Yla /qSbgmq7ptV p8xrd2CAgCEAgQgJ//3tYiJVLtDqX1TVcSQ I8MYRUjwEpk6VBg706vD8MXkv5J12CnsiY9ERaLZ4LaVHznP1BgYHHnhgoxsXlNJ2Oc6h2kA5KNIGBCBQTgIWrc5ptWjNNkRrOUnTVt0TeOYZ6YQTJPt81qeP1L27d1iqexy12MGqiFfPsj733HPN2kigkrARr5WkS9sQgEAxBCxandN6770Nz/Kz1RsAdetWTIscC4FWTuBvfwu5rPb57LDDpJ//XLLHoiNQFfEaHYWsgCxeCzW2kS2UFMdBAALFELBodU5rrgXRiNZiSHIsBLIIOGHcdeDt85n/fuih4TgsOgKI1xy3hJnX6MYpAUGg1RCwaD3rLGnSpIZd3nPPUPKKmdZWMxzoaCUIeK9k79Bhn8/22y/Mztpj0RFAvCJeoxuUBASB1kigMdH64x H6gGI1tY4Muhz2Qm89ZbUr580eXL pn/2M lXv5LssegIIF4Rr9ENSgKCQGsi8PzzYSHWffc17DWitTWNBPraYgTmzQtlsOzz2V57SaeeKtlj0RFAvCJeoxuUBASB1kDAotUbDubKafVkjwXtD3/YGkjQRwi0MIH335dcutM n7lYsldK2mPREUC8Il6jG5QEBIF6JtBYyStP8rhOK kB9TwC6FvVCXz0kbT22pJ9Ptt555Bgbo9FRwDxiniNblASEATqkYAXNntzgbvuargjlteO Dm55Zb12HP6BIHICCxaJHXoINnns 23D1vI2mPREUC8Il6jG5QEBIF6IvDaa0G03nFHQ9HqklfeQp0dserpjtOX6Al88YXUpo1kn8/89cc11/A1SKQ3E/GKeI10aBIWBGqbgKvwOKf11lulr77K7Mtuu4WZVkRrbd9joq9hAkstFV6Y9rmsV69Qs27TTWu4k/UbOuIV8Vq/o5ueQaAKBObMCaJ13Djpyy8zA9hxR2nYsLBlOgYBCFSRwHLLSR9/LNnnsu9/X7r9dskei44A4hXxGt2gJCAI1CKB996Thg6VrrtO uyzzB44bc5/8yYDGAQgEAGBtm2ld96R7HPZRhuFPZntsegIIF4Rr9ENSgKCQC0RWLBAuvBC6corG67/cClJ57T 9Ke11CNihUArINC vfSvf0n2uWy99aQpUyR7LDoCiFfEa3SDkoAgUAsE/I3jJZdIl13WsOJO165hpvXAA/On1NVCH4kRAnVLYI89QkJ6x465u9i5s/Tkk5I9Fh0BxCviNbpBSUAQiJmAq uMGiUNHy795z Zka6/fsh3/cUvpKWXjrkXxAaBVk7AdV6nTQv1XnNZp07SjBmSPRYdAcQr4jW6QUlAEIiRgKvqOJ/1vPMa7irp55834zn6aGmZZWKMnpggAIEMAk2lBXhG1sWZ883MgrOqBBCviNeqDkAuDoHYCXz9tXTbbWG7Vpe/SrfVV5fOPFM67jhp eVj7wnxQQACSwh4e9h77gnbxOaypnJiQVlVAohXxGtVByAXh0DMBP7yF k3v5Gefz4zylVWkU4/XTr1VGnFFWPuAbFBAAI5CWy2mTR vGSfy5qqRgDWqhJAvCJeqzoAuTgEYiTw3HPSCSdIf/1rZnTelMe/t6Bt1y7GyIkJAhAoiMDWW0vXXivZ5zK/2BcuDDtxYdERQLwiXqMblAQEgWoR8FauZ5whTZyYGYHzWI88MlQQYP1Gte4O14VAGQm4 PKll0r2uexb3woFm 2x6AggXhGv0Q1KAoJASxN4662Q0 pdsdK3cvXOkQcdFHbF6tKlpaPiehCAQMUI7LJLWH1pn8v84nfCOxYlAcQr4jXKgUlQEGgJAh98IF1wQdhg4NNPM6 4117SxRfnT4lrifi4BgQgUCEC3btLgwZJ9tnm0iJOF7DHoiSAeEW8RjkwCQoClSTgWq3 xtDi9MMPM6/kFLiRI6WddqpkBLQNAQhUlYC3vXMCe67t7xYvlnbYIdR5xaIkgHhFvEY5MAkKApUg0FitVlfM d3vpP33r8SVaRMCEIiKwH77SX37SvbZ9tFHYfMCeyxKAohXxGuUA5OgIFBuAnfcETYS Mc/Mlteay3p3HOlo45ibUa5mdMeBKIl4Bf8z34W9nDOtgULpA02kOyxKAkgXhGvUQ5MgoJAuQg89ph02mnS9OmZLbpW68CB0imnSCusUK6r0Q4EIFATBLyHs1MG7LPt3XelzTeX7LEoCSBeEa9RDkyCgkBzCbzwgvTrX0sPPtiwpZNOkoYMkTp0aO5VOB8CEKhJAk4Z2HXXkDqQbXPnStttJ9ljURJAvCJeoxyYBAWBUgm8 WbYROCPf8ysdLP00lKvXiGvdZ11Sm2d8yAAgbogcOyxUrdukn22zZol7b67ZI9FSQDxiniNcmASFASKJTB/fthEwJvmfP555tl77x0qC2y6abGtcjwEIFCXBI4/XuraVbLPNifG9 jRMEG LkHUZqcQr4jX2hy5RA2Bbwj897/S8OGh9NUnn2Ri2WKL8PvddgMXBCAAgTQCTnbv3DkkvWfbK69IPXtK9liUBBCviNcoByZBQaApAt650ZsLOA3g/fczj95wQ n886WDD26qFf4OAQi0SgJerbnaamHVZrY5Yb5PH8kei5IA4hXxGuXAJCgI5CPg7VvHjg0LrubMyTzKZa/8 6OPpuwVIwgCEGiEgBPjV1wxJMhn23PPSb/8pWSPRUkA8Yp4jXJgEhQEchGYODE8a15 OfOv7dtLZ5whnXyytPzysIMABCDQBIHzzgvbv9pn29NPS6eeKtljURJAvCJeoxyYBAWBdAJTp4ZnyTPPZHJxfVaXvTrrLGnllWEGAQhAoEACF14YdtCyz7bHHw87mthjURJAvCJeoxyYBAUBE3jppTCj uc/Z/JYZpmwI5bzWldfHVYQgAAEiiTgsiTeQWvQoNzi9Q9/kG66qchGObylCCBeEa8tNda4DgQKJvD669I550i33SY5xzWxpZYKi4Avukjq0qXg5jgQAhCAQCaBUaNCKSz7bLv//lCmxB6LkgDiFfEa5cAkqNZJwAuwXKvVEx5ffpnJoHv38DzZbLPWyYZeQwACZSQwerQ0Y4Zkn22TJknXXCPZY1ESQLwiXqMcmATVugi8915YNzFmjOQSWOnmWq2eHNlpp9bFhN5CAAIVJHD99dKTT0r22Xb33aGkiT0WJQHEK I1yoFJUK2DgFPOXKf1qqukRYsy  zdsCxo99 /dbCglxCAQAsSuPlmafJkyT7bbr9dmjBBsseiJIB4RbxGOTAJqr4JeJGvt2u9/HLJO2Sl2/e J517rnTYYZJzXDEIQAACZSfQmEC95ZawStQei5IA4hXxGuXAJKj6JODtW0eOlC65RPrgg8w eqdGL9Lq25cNBurz7tMrCERE4J57pBtvlOyzzb9/9NHwdyxKAohXxGuUA5Og6ovAp5 G1IBhwyTnt6Zbp06hTuuxx0rLLVdf/aY3EIBApAQ8s3rFFQ3r8DlcJ9 7qLQ9FiUBxCviNcqBSVD1QeDzzyWXS7zgAunf/87s06qrhhquJ5wgebMBDAIQgECLEZgyJXyats82f9J2kWl7LEoCiFfEa5QDk6Bqm4B3XbzhhrAY6803M/uyyiphtyz/a9u2tvtJ9BCAQI0SaGwXLSfj/ tfISkfi5IA4hXxGuXAJKjaJGDR6sozFq2zZ2f24dvflk48Mcy2tmtXm/0jaghAoE4IPPus9PvfS PGNeyQk/LfeSck52NREkC8Il6jHJgEVVsEkvQAbxPujQbSrU0b6Ze/lH7zG2m11WqrX0QLAQjUKQFvUHDMMWGjgmzzG5lLothjURJAvCJeoxyYBFUbBCxar7suvMe/9VZD0dqvXxCta6xRG/0hSghAoJUQcE7roYeG3NZs8/7T3pf6zDNbCYza6ybiFfFae6OWiKtOwKLVC3G93iGXaHXlAFcQQLRW/VYRAAQgkIvAP/4h9egh2Wfb4MGSvzKyx6IkgHhFvEY5MAkqTgIWrddeG0Tr3LmZMbpiQP/ 0qBBiNY47x5RQQACSwh4JemuuzZcUeoDnJjfoUPwWJQEEK I1ygHJkHFRcB1WpOZ1uySVyuuGESrv2Hr2DGuuIkGAhCAQE4Cb78tdesm2WebS6GsvXYoiYJFSQDxiniNcmASVBwEvHXrNddIl10mzZuXGZNF63HHhckJRGsc94soIACBAgm8/7608caSfba5LMqGG4byKFiUBEoWrwsWLNDQoUO1ePFitW/fXsP8PWKaXXPNNXr  eeX/KZt27a64IILtEKeauQTJkzQgw8 mDo u730a/nvffr00Y477rik7alTp2rs2LGpn9u0aaMhQ4aog6f8S7TpM9/X1puwLLpEfJxWBwTmzw8lDq 8Ulq4MLNDLnn1q1 F9IBmvMzqgBJdgAAEapaAqwl4dtU 21weZYstQpkULEoCJYvXpDcjRozQ/PnzG4hXC1sL1YEDB2rRokUaNWqUunfvrq222qoBCIvP8ePHp45daaWVUqK4c fOOu2001LHDho0SB07dkz9bJH70EMPpX637rrravbs2Ro fLh69eqVErT vS1bTBdDH/FaDC2OrScCzmP1QlvvirVoUWbPLFS9G9bJJ/sDZj31mr5AAAKtjsDixaHgtH22HX20tMMOkj0WJYGKiVeLyPXWW0/HetlxaqvgMdp6661zitd0cepjLVCfeOKJ1AzqzJkzlwhbi9VkFnbnnXdWz549lS2e04Wwjy/FEK lUOOcWibw2mthY4Hx4yVvNJBuSeqX81qdKoBBAAIQqHkCLoW1zDKhJFa29ekjde/ur3lrvpv12oGKideRI0emhKdtww031EYbbaQeLkuRZdli1H 2AB03bpx69 6tefPmLRGySSpA uxqtvD1TKxnXffYY4 UuC3FEK lUOOcWiTw3HPSBRdI994rff11Zg cDjZwoNS7d3iPxyAAAQjUFYEf/Uh69FFp6aUzu X6r/vtF rAYlESqJh4XbhwoS666KLUTKmtW7du6ueK5VmWS2ymi9dp06Zpzpw5GXmsiXh1mkF2igHiNcpxRlCREZg4URo5MrxvZ5tTvc45R9p//8iCJhwIQAAC5STgNTjWKNlrcQ48UOrVS7LHoiSQV7wmeapvvPFGRuD9 /fP Oo/V85rdo7r5MmTNXHixNRCq 233z6jPWZeoxwXBFWHBFzuyusaXTngmy9FMnq5115hEZZLH2IQgAAE6p7AKquE/azt0 3nPw9bx9pjURKoyMzrrFmzNHr0aFnodunSRTNmzEhVA/je976n448/vgEIcl6jHBsEVScE/vMf6YorpKuukt57L7NT3/qW5Owaz7R27VonHaYbEIAABAoh4Bp/r7zSsNbfT34inXSSZI9FSaAi4jVJGfDqf eeXn755amKBLvttlvOvFeqDUQ5Ngiqxgm8/rp0ySVhtjW7coDLXR11lOSCHiWua6xxOoQPAQi0egLf Y70zDOSfbp5darTBnbZpdUjihVARcSrO5u YMs/p e8JjVd0 u1Uuc11iFCXLVGwHmsl14qTZrUcBFWp06h7rbrtGZ/U1Zr/SReCEAAAs0isN560pQpkn26WbSedx7itVlwK3tys8VrKeE5z9UbFhx44IEZmw2U0lYlzqHaQCWo0mYlCXz2mXTrrWFjgRkzGl5ps83CToe/ IW07LKVjIS2IQABCNQIAZdUueeesNNWunltjmcAstbo1EivWkWYVRGvnmV97rnnmrWRQCXvDuK1knRpu5wEvLOhd8G6 mrp3XcbtvzjH4fUAHsMAhCAAATSCGy uXTzzZJ9unXrFvbFtseiJFAV8RolibSgLF4LNbaRLZQUx5WTwN//Lo0YEWZbXUUg3ZZbTjrssFCjlUVY5aROWxCAQF0RyCdS84nauup8bXcG8Zrj/jHzWtuDul6j90Yw/obLqQGPP96wl6uvHrbidkEP/x DAAQgAIFGCHgLWK9qtU 3TTaR7rpLsseiJIB4RbxGOTAJ6v8JuIb2mDEhNWD27IZkvKnAgAFhcaxnXTEIQAACECiAQN  0tFHSzvvnHnwBhtIkydL9liUBBCviNcoByZBSU4N8JoBpwYsXpxJxPVZXT/bopVqLowWCEAAAiUQ8M4sXslqn26dO0tPPinZY1ESQLwiXqMcmK01qM8/l 64I2wq8PTTDSm0axcmCixa11mntVKi3xCAAATKQGCffaRjj5Xs0801BV22xR6LkgDiFfEa5cBsbUG9805IC7j2Wsn/zzaXunIua58 Dbfhbm2s6C8EIACBshA48MCQb2WfbqutJr36qmSPRUkA8Yp4jXJgtpagnngilLry2gDPuqbbMstI  0nnXACqQGtZTzQTwhAoAUJuCyL86/s023llaW5cyV7LEoCiFfEa5QDs56D t//wpatLiP44osNe7rGGuGbLO Cteaa9UyCvkEAAhCoIoEjjpB2312yT7dttw0lXdq0qWJwXLoxAohXxCuvkBYi8Mor0qhR0i23SP/9b8OLejMXz7IedBC7YLXQLeEyEIBAaybQr59koWqfbl4R620L7bEoCSBeEa9RDsx6Ccrvf7ffHmZZp05t2KsVVgjfWJ18suS8VgwCEIAABFqIgBcSeCcX 8S /lpaemnJHouWAOIV8Rrt4KzlwFyP1bmsN9wgeQvXbPve96T /UPlAFcQwCAAAQhAoIUJnHJKKIdln5i3LHSua/bWhS0cGpdrnADiFfHKa6RMBLwD1p/ FKoGPPBAww/uXoDltQHeBWvPPct0UZqBAAQgAIHSCAwbFoSqFxgk5pyutdbKndtV2lU4qwIEEK I1woMq9bV5L//HXbA sMfwgLVbPvOd0JKlWdaWYDVusYGvYUABCImcM45kmcV7BPzlobeWcsei5YA4hXxGu3gjDmwL7 UJk0KovUvf5E865puSy0VZlc9y rZVvL Y76bxAYBCLRKAr/7nfTxx5J9Yi607T23cxXcbpWQ4uw04hXxGufIjDSqt94KGwlcf7309tsNg1x1VenII6XjjpPWWy/SThAWBCAAAQhII0aEN3L7xObMkXbaSbLHoiWAeEW8Rjs4YwnMs6z33htEq3NZs2dZHecuu4TarD17SsstF0vkxAEBCEAAAnkJeB9u76Rln9jrr0t77y3ZY9ESQLwiXqMdnNUOzLOsLnHlWdZc3yB550DXtnZqgFOkMAhAAAIQqCECzvt65pmQ/5XYzJnSAQdI9li0BBCviNdoB2c1AnNdVm/V6sVXDz3UsGKAc1l33TXMsno77GWXrUaUXBMCEIAABJpNYNy48HWafWIvvCD16SPZY9ESQLwiXqMdnC0ZmHe/Gj1auvnm3ItMO3aU vYNs6zksrbkneFaEIAABCpEwDvITJgQdpJJbMYMafhw6dZbK3RRmi0HAcQr4rUc46gm23A5v/Hjwyzrs8827IJnWb3ttWdZ99 fWdaavMkEDQEIQCAfgYkTQ16YfWLeCnHgwNxbIkIyGgKIV8RrNIOxpQJ54okgWO 4Q/rkk4ZXdV1Wz7K6Nuu667ZUVFwHAhCAAARalMDDD4eZ16uu v/L ncXXCDZY9ESQLwiXqMdnOUM7L33pBtvDB yX3utYcvOXd1nH moo8JCU qylpM bUEAAhCIkMAjj0jnnSfZJzZ5sjRypGSPRUsA8Yp4jXZwNjewL74IGwnccIP05z9L/jnbNtkkCFbPtLp6AAYBCEAAAq2EwNNPS6eeKtknliuVoJXgqKVuIl4Rr7U0XguK1YuvrrsuLL6aP7/hKW3bSgcfLB19tLTDDgU1yUEQgAAEIFBvBLw465hjJPvEnE/mBVz2WLQEEK I12gHZzGBLVwo3XJLmGWdPj33mdtvHwTrYYdJK65YTOscCwEIQAACdUfg5ZfDTIZ9Yp71cMqAPRYtAcQr4jXawdlUYN7pyiX6LFj9Tc nnzY8o1MnqXfvkBqw0UZNtcjfIQABCECg1RDItZuWF0Y8 WRYIIFFSwDxiniNdnDmC8zvNxasN90k/fvfDY/y9qxefHXkkSy qrmbS8AQgAAEWoqAt1F07ph9YldfLb34omSPRUsA8Yp4jXZwpgf28cehZrQrBrgMXy77wQ CYPVMa4cONdEtgoQABCAAgWoRcBmaTTeV7BO7/HLpX/ S7LFoCSBeEa/RDs6vvw5btHqG1Vu25qrJuuqqUq9eQbRuuWW0XSEwCEAAAhCIjcBHH0ldu0pz52aK1w8 kM49N7ZoiSeNAOIV8RrdC2L27FAtYOxYac6chuG5BuuPfxwE6377sfNVdDeQgCAAAQjUAgEvlFh55cwFE efL332mWSPRUsA8Yp4jWJw/u9/0m23hbQA74CVy/ztTp8 0hFHSKuvHkXYBAEBCEAAArVMwPuA 2u xH7zm1COxh6LlgDiFfFatcHp94tHHw2C9c47JQvYbOvYMZS2smjdeuuqhcqFIQABCECgHgm0aSO51qK97fTTpTXXDB6LlgDiFfFalcF56aXSZZdlphqlB LSe85l3XffqoTHRSEAAQhAoDUQaN E6rbcAAAWG0lEQVQ LNCyt514orThhsFj0RJAvCJeW3xweqbV arZts02oR6rZ1pXWaXFw KCEIAABCDQ2gi4GLh32LK39esnbbtt8Fi0BBCviNcWH5zPPSdZqNr8ftG3b8hjZROBFr8VXBACEIBA6ybQpYv08MOSvc05at27B49FSwDxinityuB0CSznvPo9AoMABCAAAQhUhcAmm4RajPa2Qw6RDjggeCxaAohXxGu0g5PAIAABCEAAAhUlsP/ oaard7mxuf6ivw60x6IlgHhFvEY7OAkMAhCAAAQgUFEC3h72kkvCNrE2rxS2eHUxcSxaAohXxGu0g5PAIAABCEAAAhUlsMce0llnSfa23XaTzjkneCxaAohXxGu0g5PAIAABCEAAAhUl0KOH9MtfSva27beXXMvRHouWAOIV8Rrt4CQwCEAAAhCAQEUJHHSQ5MLi9rYtt5Suvz54LFoCiFfEa7SDk8AgAAEIQAACFSWQXRoru/pARS9O46USQLwiXksdO5wHAQhAAAIQqG0C/ftLW20l2duy677Wdu/qNnrEK K1bgc3HYMABCAAAQg0SmDgQKlzZ mEE8Jha60leScdeyxaAohXxGu0g5PAIAABCEAAAhUlcOaZ0sorS/a2Dh2k118PHouWAOIV8Rrt4CQwCEAAAhCAQEUJXHCBtHixZG9zvVdvF9umTUUvS PNI4B4Rbw2bwRxNgQgAAEIQKBWCbgs1ty5oTyWbamlwt7lWNQEEK I16gHKMFBAAIQgAAEKkbgmmukv/1Nsl 0KKQL2GNRE0C8Il6jHqAEBwEIQAACEKgYgbFjpSlTJPsFC6QNNggei5oA4hXxGvUAJTgIQAACEIBAxQhMmCDdeqtk7/SB7bYLHouaAOIV8Rr1ACU4CEAAAhCAQMUIPPigdNdd0tVXS//8p/TTnwaPRU2gZPG6aNEiDR48WB9//HGqg926dVO/fv1S//ffRo4cqVmzZmkpJz9/Y nHZFOZMGGCHvQgktS fXsNGzZsySELFizQ0KFDtdgrAiX16dNHO 6445K/T506VWM95S8vEGyjIUOGqEMzylxMn/m tt5ktahvHMFBAAIQgAAEINBMAo8/Lg0eLNm/8IIFRvBY1ARKFq TJk3SWmutpbfffluzZ8/W3LlzddBBB2kr71QhacyYMerUqZN69OihadOmady4cTr00EO18847NwBi8Tl /HgNHDhQK620Ukqodu7cWaeddlrq2EGDBqljx46pny1yH3roodTv1l133dS1hw8frl69eqUErX9vSxe/xd4BxGuxxDgeAhCAAAQgUIMEZsyQjjlGsn/2WemKK6SbbqrBjrSukEsWrwkmi9h58 alfkzEqmdcPRM6YMAAtWvXTk8//bRuvfXW/2vv/kOrqv84jr Jfg1xqWmgRTGGxNZ/JvQFLQkNJDZB1D8UtT9C9kdNIymDhBIMVBwhg4EZ/bAlhP3Rj/3ngkAFCRsEuZEwpBUTcYgMU/sBfnl/xudydnZ 3XPOved87n0eENl2fnzO4/05n/u6Z597Jlu3bpX/6XwS3 INp/ojDahnz541d1DHxsYqwVbDqr0LqyF48 bN0tfXJ9evX6 EVW8Q1vXTLITXNGpsgwACCCCAgGMCly LdHWJ6P/6wS39ra/ z1JqgVzCq//O68jIiAwPD0tvb6/8/fffcuzYMXnkkUdk3rx5lakFVsUfRvX7GkD1Tu2OHTtMMLZB1k4F8N5d9QdfbYvedV27dq0Jt2kWwmsaNbZBAAEEEEDAMYHJSZ33KKL/f/utyCefzPzPUmqBXMLruXPnpL29vRJM9W7s6OioCa/6K357Z1Yl7LxYqxIUNr3hVaccTExMzJrHasOrTjPwTzEgvJa6v9E4BBBAAAEEyiMwPS3yxBMi v pUyJDQzP/s5RaIDS86oeu vv7ZXx8fNYJ9PT0VOa16joaHltaWky4tIu989rd3S2ff/656DZ6JzYovHLntdT9g8YhgAACCCDQ2AIPPCDy778iH30kcvHizP8spRbIdOdVP5Q1PT0tra2ts 6o2jmvixcvlgcffFC2b99ugvC6desqwderwpzXUvcRGocAAggggEDjCsyfPzNt4OOPRSYmRD78sHHPtUHOLHV4tVMDli9fLlNTU3OmAwwMDMhvv/0mr7zyiqE6ffq07Nu3z3yAy7/wtIEG6U2cBgIIIIAAAq4JPP64yE8/zTzvVe/Avvmma2fQdO1NHV71rutFvb3uWXSagD4aSxd9wsDg4KD8999/ZlqBPnmgra3N/Mw 09X7vFae89p0fY8TRgABBBBAoHiBjo6Z4Kof1nrsMZG33iq TbQgUiB1eM3iqvNcDx48KJs2bZr1xway7DPPbXnaQJ6a7AsBBBBAAIESC2zcKPLuu/qAehF9Vn1PT4kbS9NUoJDwqndZ9a5tlj8kUMvyEV5rqcu EUAAAQQQKJHA vUib7wx88cJNmwQ2bq1RI2jKUEChYTXspdCw2vShT8jm1SK9RBAAAEEECihwLZtM3 oYHBQ5PXXRV5 uYSNpEleAcJrQH/gzisXCQIIIIAAAk0i8NprIp2d heSRHbvFgn4S6BNIuHMaRJeCa/OdFYaigACCCCAQO4CfX0i998vMjAg8t13Ik8/nfsh2GG AoRXwmu PYq9IYAAAggg4JKAhtZffxX56iuRy5dFHn3UpdY3ZVsJr4TXpuz4nDQCCCCAAAJG4JtvRD77TOTnn0X  AMUBwQIr4RXB7opTUQAAQQQQKBGAvrM sOHRS5cILzWiDjv3RJeCa959yn2hwACCCCAgDsCt26JLFki8txzIj/ 6E67m7ilhFfCaxN3f04dAQQQQAABEXnxRZEXXhA5cAAOBwQIr4RXB7opTUQAAQQQQAABBGYECK EV64FBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGQHCK HVmc5KQxFAAAEEEEAAAcIr4ZWrAAEEEEAAAQQQcEaA8Ep4daaz0lAEEEAAAQQQQIDwSnjlKkAAAQQQQAABBJwRILwSXp3prDQUAQQQQAABBBAgvBJeuQoQQAABBBBAAAFnBAivhFdnOisNRQABBBBAAAEECK EV64CBBBAAAEEEEDAGYHU4fXOnTuyf/9 uXXrljnZlStXyq5duyonfuLECbl48WLl6/vuu092794tHR0dgThff/21nDlzxvxs4cKFcujQocp6N27ckAMHDsjdu3fN93bu3CmrVq2q/Pz8 fNy8uRJ8/XDDz8s7733nixatCh1EX4em5JnOxan3p4NEUAAAQQQQAABBGojkDq8Dg0NybJly2RyclJ //13 fPPP2XLli2yYsUK09J33nnHBMi33347tuUaPk dOmXWnT9/vgmqTz75pOzdu7eyryVLlpivNeT 8MMPZv9PPfWUOfaRI0dk27ZtJtDq93Xxht/YBvhWILxWK1b9 hhXb5b3FtQgb9F0 6MO6dzy3Ioa5KmZbl/UIJ1bnlu5VIPU4dWCaYi9evWq XLp0qXS1dUlN2/elPfff1/Wr19v/sUtGjhtONV1NaCePXvW3EEdGxurBFsNq/Yu7PPPPy bN2 Wvr4 uX79eiWseoOwrp9mcamAac6vDNtgXHwVqEHxNdAWUIfi60ANqEHxAsW3wKXrIJfw6r/zOjIyIp9  qn8888/phr37t2TDRs2mGDrX/xhVH uAfSLL76QHTt2mGBsg6ydCuC9u oPvtoWveu6du1aE27TLC4VMM35lWEbjIuvAjUovgaEV2pQDoHiW8F4RA2qEcglvJ47d07a29src141vB4/fly6u7tl9erV8sEHH8jt27fl1VdfrUwrsI0MCpve8HrhwgWZmJiYNY/VhledZuCfYkB4rab8xa3LQFWcvT0yNSi BoRXalAOgeJbwXhEDaoRCA2v oGs/v5 GR8fn7W/np6eSgDVdTQ8trS0mHBpFw2vw8PD0tvba36mX3/55ZcmyG7cuHHW/rjzWk25GmddBqria0kNiq8B4ZUalEOg FYwHlGDagQy3XnVJwpMT09La2vrrCcNXLlyxXz6f8 ePbJgwQITXnUawZo1awJ/lc c12pK1hjrMlAVX0dqUHwNCK/UoBwCxbeC8YgaVCOQOrzqB7VGR0dl fLlMjU1NSu82ru2nZ2dZu7p0aNH5dq1a ZpAW1tbXPax9MGqilZY6zLQFV8HalB8TUgvFKDcggU3wrGI2pQjUDq8Op/jqseVOe42g9lDQwMyC //FJpi3e6gX2mq/d5rTzntZqyub8uA1XxNaQGxdeA8EoNyiFQfCsYj6hBNQKpw2s1B/Gvq/NcDx48KJs2bZr1xway7DPPbbmI8tQM3hfGtTeOOwI1iBOqz8 pQ32co45CDahB8QLFt8Cl66CQ8Kp3WfWvb2X5QwK1LLNLBaylQy33jXEtdZPtmxokc6r1WtSh1sLx 6cG8Ua1XoMa1Fo4fv8u1aCQ8BpPWPwaWkQWBBBAwDWB1nkPyPRf/7rWbNqLAAIIyLMdixMpEF4TMbESAggggAACCCCAQBkECK9lqAJtQAABBBBAAAEEEEgkQHhNxMRKCCCAAAIIIIAAAmUQILyWoQq0AQEEEEAAAQQQQCCRAOE1ERMrIYAAAggggAACCJRBgPBahirQBgQQQAABBBBAAIFEAoTXREyshAACCCCAAAIIIFAGAcJrGapAGxBAAAEEEEAAAQQSCRBeEzGxEgIIIIAAAggggEAZBAivZaiC4224efOmHD58WG7cuGHOpKenR1asWFE5qzt37kh/f7 Mj49LS0uL7NmzR9ra2szPvT9buXKl7Nq1a47G0NCQfP/995Xv /fvOF9uzT9x4oT5s8u6 C2jaqDr223b29ult7fX1Mku3v3a7wWtl9uJOLyjqBp4nYOuk6ga LfFP7yTeMeLuP7sH0tGRkbk PHjc8YpezTvvsPGK4e7b25Nj6uBdQ4aq65cuSLHjh0zrw3 1wtdP2rb3E6gAXaUxTHuNT1urKoHH G1HsoNfAwdYAYHB2XLli2yYMECM7CcPn1a9u3bZ762L7pLly6Vrq6uwJ/rOjrYXb16dU541e Pjo7OCVQNTJrq1NRp2bJl5k2DHXi0JvZNhA42cTXQ2g0PD8dae/eVqrENulFcDbx9XF9YNCRpeLJv5OwLc1AN/LWhBsGdSJ0mJyfNWGPfsHV2dpqv/eNMWA30 tHwtHPnzjm18Y5t1CBdDdT95MmT5ibGQw89ZG5s2BqpvRpv377dBFf/ B 1bYMOK6lOK4tjktf0qLEqVYNTbER4TYHGJuEC/oHfO9homLUvKOvWrZt1dzYovIati3 8gPeFNWkNkoRX/77iW9K8a3hrEBSIgsJPWA3814d rYsNZc2rHH3mXrekNQgLr/56cS0k63X vut3jBp3/MbVbJusdc2xVhbHqDdzSW521EqY8For2Sbdr//Oa9DApAOQLt4pAkHh1d4Z0V/PnTlzxmzDr riO5b/zmvSGsSFV95MxNvbNfw1CAo6Qb9VCKuB3d/ChQtl9erVcunSpcApNslb2Phr u 8Jq1BNeE16O5548smP0N/DYLGkLA74HoU7zWiX tdWu Nj6htk7ey8dfM4hj021QVi3u9qLUq4bXWwk20/6BfVwe9QFcTXvXXd88884x5obb7X7VqFXecIvqV3zdpDeIGo7ifN1FXjz1Vfw2CXgCqCa/eOct68O7ubq6BmCr4fZPWICy86v7Onz9fmRKlNdY3Ed45/LEdo8lW8Ncg6DUiLID6v1/Ntk3GHHm6WRyDzO3Bin49ILzSy3MRqGYOXzXh1c6NsvNnw bG5nISju8kaI5f2DvkoBpEDUZRg5jjbLk2P6wGSe/6hdXAPwVBPyDJm7jw0gX176Q1CAuvejTvB/JeeumlSni141OuncnxnQXVIOmd16A3Gkm3dZwt1 ZncYy7q014zbVU7KwIgajBPul8y6BQGrRfwmv0C7b9UJZ3raQ1iBqM OBcsisr7EM8SedbBtUg6I1D0S8cyTSKWStsjEhag6jxzHtG1CC8vlHjdNy81ai5xHHbFtPjynnULI5JroGi z93XsvZ75xpVdidJu8JJPmke9hg5333zt2/6BeLqKcyJKlB2GCUpMbOdNgaNjQu4Kd92oD11/mudp540F2tGp6aM7sOm59nTyBJDZK8cDMWhXeJuBrEPW1Af6vgfVJK2Btx/5MKnOmkdWhoXP MqkHS8Z7wWodCcojaCdiLxD7jVY8U9SzXoOf26TZh4ZW5fslqF/QsVu 8yLjnvOpRwgajuF8fJWth468VVwMV8K4T9LziuA9s2euM57wG9ycdR7zPhNa1/B/yjKtB1Ker9QNaduF50 lroP3cWnrr4302qd37okWLZj16MWzbxh9hkp9hFsckr lRrxfJW5ltTe68ZvNjawQQQAABBBBAAIE6ChBe64jNoRBAAAEEEEAAAQSyCRBes/mxNQIIIIAAAggggEAdBQivdcTmUAgggAACCCCAAALZBAiv2fzYGgEEEEAAAQQQQKCOAoTXOmJzKAQQQAABBBBAAIFsAoTXbH5sjQACCCCAAAIIIFBHAcJrHbE5FAIIIIAAAggggEA2AcJrNj 2RgABBBBAAAEEEKijAOG1jtgcCgEEEEAAAQQQQCCbAOE1mx9bI4AAAggggAACCNRRgPBaR2wOhQACCCCAAAIIIJBNgPCazY tEUAAAQQQQAABBOooQHitIzaHQgABBBBAAAEEEMgmQHjN5sfWCCCAAAIIIIAAAnUUILzWEZtDIYAAAggggAACCGQTILxm82NrBBBAAAEEEEAAgToKEF7riM2hEEAAAQQQQAABBLIJ/B/MRo982v YYAAAAABJRU5ErkJggg==`
//	image := `data:image/jpeg;base64, `
//	b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, image)
//	if !b {
//		fmt.Println("regexp.MatchString")
//		return
//	}
//	ext := ".png"
//	uploadDir := "./static"
//	randStr := utils.GetRandStringNoSpecialChar(28)
//	fileName := randStr + ext
//	fpath := uploadDir + "/" + fileName
//
//	re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`)
//	base64Str := re.ReplaceAllString(image, "")
//	base64Str = strings.Replace(base64Str, " ", "", -1)
//
//	err = utils.SaveBase64ToFile(base64Str, fpath)
//	if err != nil {
//		return
//	}
//	fmt.Println("end")
//
//	defer os.Remove(fpath)
//
//	hzUploadDir := "static/images/"
//	savePath := hzUploadDir + time.Now().Format("200601/20060102/")
//	savePath += fileName
//	//上传到阿里云
//	err = services.UploadFileToAliyun(fileName, fpath, savePath)
//	if err != nil {
//		return
//	}
//	fileHost := "https://hzstatic.hzinsights.com/"
//
//	resourceUrl := fileHost + savePath
//	fmt.Println("resourceUrl:", resourceUrl)
//	utils.FileLog.Info("%s:", time.Now().Format(utils.FormatDateTime))
//	utils.FileLog.Info("end update oss ")
//	fmt.Println("end")
//}

// 判断文件是否存在
func IsFileExist(filename string) bool {
	_, err := os.Stat(filename)
	if os.IsNotExist(err) {
		return false
	}
	return true
}

// @Title 图片上传
// @Description 图片上传接口
// @Param   file   query   file  true       "文件"
// @Success 200 新增成功
// @router /image/uploadV2 [post]
func (this *ResourceController) UploadV2() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	businessType := this.Ctx.Request.Form.Get("business_type")
	//this.Ctx.Request
	fmt.Println("businessType:", businessType)
	fmt.Println(this.Ctx.Request.Form)
	fmt.Println("===========")
	br.Data = businessType

	f, h, err := this.GetFile("file")
	if err != nil {
		br.Msg = "获取资源信息失败"
		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
		return
	}

	fileData, e := ioutil.ReadAll(f)
	if e != nil {
		br.Msg = "上传失败"
		br.ErrMsg = "读取文件失败, Err: " + e.Error()
		return
	}
	pass := filetype.IsImage(fileData)
	if !pass {
		br.Msg = "文件格式有误"
		br.ErrMsg = "文件格式有误"
		return
	}

	ext := path.Ext(h.Filename)
	dateDir := time.Now().Format("20060102")
	uploadDir := utils.STATIC_DIR + "hongze/" + dateDir
	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
	if err != nil {
		br.Msg = "存储目录创建失败"
		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
		return
	}
	randStr := utils.GetRandStringNoSpecialChar(28)
	fileName := randStr + ext
	fpath := uploadDir + "/" + fileName
	defer f.Close() //关闭上传文件
	err = this.SaveToFile("file", fpath)
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}
	resourceUrl := ``
	//上传到阿里云 和 minio
	//if utils.ObjectStorageClient == "minio" {
	//	resourceUrl, err = services.UploadImgToMinIo(fileName, fpath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//} else {
	//	resourceUrl, err = services.UploadAliyunV2(fileName, fpath)
	//	if err != nil {
	//		br.Msg = "文件上传失败"
	//		br.ErrMsg = "文件上传失败，Err:" + err.Error()
	//		return
	//	}
	//}
	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resourceUrl, err = ossClient.UploadFile(fileName, fpath, "")
	if err != nil {
		br.Msg = "文件上传失败"
		br.ErrMsg = "文件上传失败，Err:" + err.Error()
		return
	}

	defer func() {
		os.Remove(fpath)
	}()

	item := new(models.Resource)
	item.ResourceUrl = resourceUrl
	item.ResourceType = 1
	item.CreateTime = time.Now()
	newId, err := models.AddResource(item)
	if err != nil {
		br.Msg = "资源上传失败"
		br.ErrMsg = "资源上传失败,Err:" + err.Error()
		return
	}
	resp := new(models.ResourceResp)
	resp.Id = newId
	resp.ResourceUrl = resourceUrl

	br.Msg = "上传成功"
	br.Ret = 200
	br.Success = true
	//br.Data = resp
	return
}

// @Title 获取STSToken
// @Description 获取STSToken
// @Success 200 获取成功
// @router /oss/get_sts_token [get]
func (this *ResourceController) OssSTSToken() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	ossClient := services.NewOssClient()
	if ossClient == nil {
		br.Msg = "上传失败"
		br.ErrMsg = "初始化OSS服务失败"
		return
	}
	resp, e := ossClient.GetUploadToken()
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取OSS上传Token失败, Err: " + e.Error()
		return
	}

	br.Data = resp
	br.Msg = "获取成功"
	br.Ret = 200
	br.Success = true

	//source, _ := this.GetInt("StorageSource")
	//
	//if source == utils.STORAGESOURCE_OSS {
	//	resp, err := services.GetOssSTSToken()
	//	if err != nil {
	//		br.Msg = "获取失败"
	//		br.ErrMsg = "获取STSToken失败, Err: " + err.Error()
	//		return
	//	}
	//	br.Data = resp
	//	br.Msg = "获取成功"
	//	br.Ret = 200
	//	br.Success = true
	//} else if source == utils.STORAGESOURCE_MINIO {
	//	resp, err := services.GetMinIOSTSToken()
	//	if err != nil {
	//		br.Msg = "获取失败"
	//		br.ErrMsg = "获取STSToken失败, Err: " + err.Error()
	//		return
	//	}
	//	br.Data = resp
	//	br.Msg = "获取成功"
	//	br.Ret = 200
	//	br.Success = true
	//}
}

// FileDownload
// @Title 文件下载
// @Description 文件下载
// @Param   FileUrl  query  string  true  "文件路径"
// @Success 200 Ret=200 操作成功
// @router /file/download [get]
func (this *ResourceAuthController) FileDownload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}
	//fileName := this.GetString("FileName")
	//fileName = strings.TrimSpace(fileName)
	//if fileName == "" {
	//	br.Msg = "参数有误"
	//	return
	//}
	fileEncode := this.GetString("FileUrl")
	fileEncode = strings.TrimSpace(fileEncode)
	if fileEncode == "" {
		br.Msg = "参数有误"
		return
	}
	fileByte, e := base64.StdEncoding.DecodeString(fileEncode)
	if e != nil {
		br.Msg = "下载失败"
		br.ErrMsg = "文件地址解析失败, Err: " + e.Error()
		return
	}
	fileUrl := string(fileByte)
	fileArr := strings.Split(fileUrl, "/")
	if len(fileArr) == 0 {
		br.Msg = "文件地址有误"
		return
	}
	fileName := fileArr[len(fileArr)-1]
	//fmt.Println(fileName)

	// 获取文件
	down, e := http.Get(fileUrl)
	if e != nil {
		br.Msg = "下载失败"
		br.ErrMsg = "文件下载失败, http get: " + e.Error()
		return
	}
	defer down.Body.Close()
	if down.StatusCode != http.StatusOK {
		br.Msg = "下载失败"
		br.ErrMsg = fmt.Sprintf("文件下载失败, http status: %d", down.StatusCode)
		return
	}

	// 生成本地文件
	localFilePath := fmt.Sprintf("%s%s", utils.GetRandStringNoSpecialChar(6), fileName)
	localFile, e := os.Create(localFilePath)
	if e != nil {
		br.Msg = "下载失败"
		br.ErrMsg = "生成本地文件失败, Err: " + e.Error()
		return
	}
	defer func() {
		if e = localFile.Close(); e != nil {
			fmt.Println("local file close err: ", e.Error())
		}
		if e = os.Remove(localFilePath); e != nil {
			fmt.Println("local file remove err: ", e.Error())
		}
	}()

	// 写入响应流
	//_, e = io.Copy(this.Ctx.ResponseWriter, down.Body)
	_, e = io.Copy(localFile, down.Body)
	if e != nil {
		br.Msg = "下载失败"
		br.ErrMsg = "复制文件资源失败, Err: " + e.Error()
		return
	}
	// 设置响应头
	//this.Ctx.ResponseWriter.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
	//this.Ctx.ResponseWriter.Header().Set("Content-Type", "application/octet-stream")

	br.Ret = 200
	br.Msg = "下载成功"
	br.Success = true
	this.Ctx.Output.Download(localFilePath, fileName)
}
