profiler dataclass

server
esea_info 2 years ago
parent 1a036210ac
commit 5c933a78fa
  1. 218
      app.py
  2. 7
      data/2/37/2023_7_10_14_15_31.csv
  3. BIN
      data/2/37/info.bin
  4. BIN
      data/2/37/sensor.bin
  5. BIN
      data/2023/03/20/37/info.bin
  6. BIN
      data/2023/03/20/37/sensor.bin
  7. 795
      myRamses.py
  8. 1279
      profiler copy.py
  9. 1762
      profiler.py
  10. 95
      receive.py
  11. 1
      retrieve.yml
  12. 163
      tcp_profiler.py

218
app.py

@ -8,73 +8,183 @@ from myconfig import DEVICE_ID ,FILE_MARK,YAML_FILE_NAME,CURRENT_DIR,DATA_DIR,CA
from myconfig import BEGIN_WAVELENGTH,END_WAVELENGTH,INTERVAL,ROWFACTOR
from Ramses import Ramses
from profiler import Profiler,ProfilerHandle
IP = ""
PORT = 7887
ADDRESS = (IP, PORT) # 绑定地址
if __name__ == "__main__":
log.info(f"******** HandHeld server initiate.... *********", __name__, "", "")
class MyApp(object):
def __init__(self,):
log.info(f"******** Awarms server initiate.... *********", __name__, "", "")
self.device_type = DeviceType.PROFILE.name
self.mycfg = MyConfig() # 传入 cfg retrieve 的yml文件
# 配置反演需要的参数 波长 间隔 , rowFactor
self.retrieve = self.mycfg.get_retrieve() # 读retrieve.yml
log.info(f"Retrieve: {self.retrieve}", __name__, "", "")
# log.info(f"syscfg: {device}", __name__, "", "")
self.mycfg.setDeviceType( DeviceType.PROFILE )
self.sensor_cfg = self.mycfg.read_yaml() # 读config.yml, 多个device_id 配置
log.info(f"Current Device: {self.device_type} ", __name__, "", "")
log.info(f"Sensor cfg: {self.sensor_cfg}", __name__, "", "")
self.cal_cfg = {}
cfgr = Configuration( )
cfgr.setDeviceType(self.device_type)
cfgr.setSystemCfgDict(self.sensor_cfg)
for k,v in self.sensor_cfg.items():
cfgr.setSystemCfgDict(v)
try:
cfgr.getCalConfiguration()
except Exception as e:
log.error(f"读取配置文件失败. \n {e}",__name__, "", "" )
raise
log.info(f"v: {cfgr.configuration}", __name__, "", "")
self.cal_cfg.update({k:cfgr.cal_configuration})
log.debug(f"cal_cfg: {self.cal_cfg}", __name__, "", "")
log.warning(f"cal_cfg 2: {self.cal_cfg[2].keys()}", __name__, "", "")
# log.warning(f"cal_cfg 3: {self.cal_cfg[3].keys()}", __name__, "", "")
log.info(f"传感器配置文件读取成功", __name__, "", "")
pass
def init_data_process(self, mode = 0):
''' 多个handle '''
self.profiler_handle = { }
for k,v in self.cal_cfg.items():
ph = ProfilerHandle( deviceid=k, cfg=self.sensor_cfg[k], calcfg=v, rtv=self.retrieve)
self.profiler_handle.update( {k:ph} )
def run_server(self,):
# 启动接受服务器
log.info(f"启动接受服务器, IP: {IP} , Port:{PORT} ", __name__, "", "")
#######################################
device_id = DEVICE_ID # 多个设备
device_type = DeviceType.PROFILE.name
mycfg = MyConfig()
server_ = MyThreadingTCPServer(ADDRESS, MyServer, calcfg=self.cal_cfg, retrieve = self.retrieve ,profiler_handle=self.profiler_handle )
# 配置反演需要的参数 波长 间隔
retrieve = mycfg.get_retrieve()
log.info(f"Retrieve: {retrieve}", __name__, "", "")
try:
server_.serve_forever()
except KeyboardInterrupt:
log.warning(" Ctrl+C 退出主程序 ",__name__, "", "")
server_.server_close()
except Exception as e:
log.info(" 系统异常, 如下: \n ",__name__, "", "")
log.info(e)
# log.info(f"syscfg: {device}", __name__, "", "")
mycfg.setDeviceType(device_type)
init_para = mycfg.read_yaml()
log.info(f"Current Device: {device_type} ", __name__, "", "")
log.info(f"Sensor: {init_para}", __name__, "", "")
pass
cal_cfg = {}
if __name__ == "__main__":
log.info(f"******** Yiwin Profiler server initiate.... *********", __name__, "", "")
app = MyApp()
app.init_data_process( )
app.run_server()
# IP = ""
# PORT = 7887
# ADDRESS = (IP, PORT) # 绑定地址
# device_id = DEVICE_ID # 多个设备
# device_type = DeviceType.PROFILE.name
# retrieve = {}
# cal_cfg ={}
# def get_sys_cfg():
# log.info(f"开始获得配置", __name__, "", "")
# device_id = DEVICE_ID # 多个设备
# device_type = DeviceType.PROFILE.name
# mycfg = MyConfig()
# # 配置反演需要的参数 波长 间隔
# retrieve = mycfg.get_retrieve()
# log.info(f"Retrieve: {retrieve}", __name__, "", "")
# # log.info(f"syscfg: {device}", __name__, "", "")
# mycfg.setDeviceType(device_type)
# init_para = mycfg.read_yaml()
# log.info(f"Current Device: {device_type} ", __name__, "", "")
# log.info(f"Sensor: {init_para}", __name__, "", "")
# cal_cfg = {}
cfgr = Configuration( )
cfgr.setDeviceType(device_type)
cfgr.setSystemCfgDict(init_para)
# cfgr = Configuration( )
# cfgr.setDeviceType(device_type)
# cfgr.setSystemCfgDict(init_para)
for k,v in init_para.items():
cfgr.setSystemCfgDict(v)
try:
cfgr.getCalConfiguration()
except Exception as e:
log.error(f"读取配置文件失败. \n {e}",__name__, "", "" )
raise
log.info(f"v: {cfgr.configuration}", __name__, "", "")
cal_cfg.update({k:cfgr.cal_configuration})
# log.warning(f"cal_cfg: {cal_cfg[2]}", __name__, "", "")
log.warning( f"cal_cfg 2: {cal_cfg[2].keys()}", __name__, "", "")
# log.warning( f"cal_cfg 2: {cal_cfg[2]}", __name__, "", "")
# log.warning( f"cal_cfg 3: {cal_cfg[3].keys()}", __name__, "", "")
log.info( f"传感器配置文件读取成功", __name__, "", "" )
# for k,v in init_para.items():
# cfgr.setSystemCfgDict(v)
# try:
# cfgr.getCalConfiguration()
# except Exception as e:
# log.error(f"读取配置文件失败. \n {e}",__name__, "", "" )
# raise
# log.info(f"v: {cfgr.configuration}", __name__, "", "")
# cal_cfg.update({k:cfgr.cal_configuration})
# # log.warning(f"cal_cfg: {cal_cfg[2]}", __name__, "", "")
# log.warning( f"cal_cfg 2: {cal_cfg[2].keys()}", __name__, "", "")
# # log.warning( f"cal_cfg 2: {cal_cfg[2]}", __name__, "", "")
# # log.warning( f"cal_cfg 3: {cal_cfg[3].keys()}", __name__, "", "")
# log.info( f"传感器配置文件读取成功", __name__, "", "" )
# def run_server():
# # 启动接受服务器
# log.info(f"启动接受服务器, IP: {IP} , Port:{PORT} ", __name__, "", "")
# server_ = MyThreadingTCPServer(ADDRESS, MyServer, cfg=cal_cfg, retrieve = retrieve )
# try:
# server_.serve_forever()
# except KeyboardInterrupt:
# log.warning(" Ctrl+C 退出主程序 ",__name__, "", "")
# server_.server_close()
# except Exception as e:
# log.info(" 系统异常, 如下: \n ",__name__, "", "")
# log.info(e)
# def deal_info_sensor_bin(infobin, sensor_bin):
# profiler = Profiler()
# profiler.setSyscfg( cal_cfg )
# profiler.setRetrieve(retrieve)
# profiler.setDeviceID(2)
# profiler.setMeasureID(37)
# ????????????
# 不同设备类型接收不同,修改receive.py
# 不同数据裂隙数据处理不同,修改AWRAMS.py
# 分支:服务器:处理不同的文件夹 awramse surface profile c
# 桌面: 服务器的, 读取标准trios文件处理的 -- 暂不考虑
# path_tuple = ( "data", 2, 37 )
# profiler.setOldFolder( path_tuple )
# # profiler.getInfoDict( )
# # profiler.transferFromOldFolder()
# # profiler.deleteOldFolder()
# # profiler.dealOneMeasurement_Profiler(profiler.new_folder)
# profiler.dealOneMeasurement_Profiler(profiler.old_folder)
# log.info(f" Complete Dealing one group.")
# if __name__ == "__main__":
# log.info(f"******** HandHeld server initiate.... *********", __name__, "", "")
# get_sys_cfg()
# run_server()
# profiler = Profiler()
# profiler.setSyscfg( cal_cfg )
# profiler.setRetrieve(retrieve)
# profiler.setDeviceID(2)
# profiler.setMeasureID(37)
# 启动接受服务器
log.info(f"启动接受服务器, IP: {IP} , Port:{PORT} ", __name__, "", "")
server_ = MyThreadingTCPServer(ADDRESS, MyServer, cfg=cal_cfg, retrieve = retrieve )
try:
server_.serve_forever()
except KeyboardInterrupt:
log.warning(" Ctrl+C 退出主程序 ",__name__, "", "")
server_.server_close()
except Exception as e:
log.info(" 系统异常, 如下: \n ",__name__, "", "")
log.info(e)
# path_tuple = ( "data", 2, 37 )
# profiler.setOldFolder( path_tuple )
# # profiler.getInfoDict( )
# # profiler.transferFromOldFolder()
# # profiler.deleteOldFolder()
# # profiler.dealOneMeasurement_Profiler(profiler.new_folder)
# profiler.dealOneMeasurement_Profiler(profiler.old_folder)
# log.info(f" Complete Dealing one group.")
# r= Ramses()

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -18,8 +18,8 @@ from tools.mypath import MyDir
from tools.mylogger import log
from pathlib import Path,PurePath
from myconfig import DATA_DIR,DeviceType
from profiler import Profiler
from profiler import Profiler,ProfilerHandle
# from myRamses import RamsesFactoryHandle,AirWater
IP = ""
PORT = 7887
@ -42,8 +42,9 @@ conn_pool = []
# save_path = Path
class MyTCPServer(TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, cfg=None, retrieve=None):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, cfg=None, calcfg=None, retrieve=None):
self.cfg = cfg
self.calcfg = calcfg
self.retrieve = retrieve
TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=True )
@ -185,33 +186,62 @@ class DealData:
def __init__(self) -> None:
self.device_id = None
self.devie_type = DeviceType.SURFACE.name
self.devie_type = DeviceType.PROFILE.name
self.measure_id = None
self.cfg = {}
self.profiler = None
self.calcfg = {}
self.profiler_hdl = None
pass
def deal(self, id: int, con: int, cfg:dict , retrieve) -> None: # 取字典中的 payload
def deal(self, id: int, con: int, calcfg:dict , retrieve) -> None: # 取字典中的 payload
log.info(f" 接收到数据开始处理数据 device_id {id} ")
self.device_id = id
self.measure_id = con
if self.device_id is None:
self.device_id = id
if self.cfg == {}:
self.cfg = cfg
self.cfg = calcfg
if self.calcfg == {}:
self.calcfg = calcfg
# self.cfg = cfg.get(self.device_id)
if self.profiler is None:
self.profiler = Profiler() ##处理数据
self.profiler.setSyscfg(self.cfg)
self.profiler.setRetrieve(retrieve)
self.profiler.setDeviceID(self.device_id)
self.profiler.setMeasureID(self.measure_id)
path_tuple = ( "data", str(id), str(con) )
self.profiler.setOldFolder( path_tuple )
self.profiler.getInfoDict( )
self.profiler.transferFromOldFolder()
self.profiler.deleteOldFolder()
self.profiler.dealOneMeasurement_Profiler(self.profiler.new_folder)
if self.profiler_hdl is None:
self.profiler_hdl = ProfilerHandle( self.device_id, self.cfg, self.calcfg, retrieve) ##处理数据
fpath = Path.cwd()
infopath = fpath.joinpath( 'data',self.device_id,self.measure_id,'info.bin')
sensorpath = fpath.joinpath( 'data',self.device_id,self.measure_id,'sensor.bin')
savedir = fpath.joinpath('data',self.device_id,self.measure_id )
self.profiler_hdl.set_ramses_number(3)
self.profiler_hdl.set_tilt_range(21.0)
self.profiler_hdl.read_info_path(infopath)
self.profiler_hdl.profiler.reset_profiler()
self.profiler_hdl.profiler.data.set_wavelength( ) # 设置波长
self.profiler_hdl.profiler.get_depth_offset()
self.profiler_hdl.read_sensor_path(sensorpath)
self.profiler_hdl.profiler.get_Ed0_kd()
self.profiler_hdl.profiler.get_Lu0_Ku()
self.profiler_hdl.profiler.get_Lw_Rs(self.profiler_hdl.retrieve["n_t_square"])
self.profiler_hdl.profiler.save(savedir)
# self.profiler_hdl.read_info_path(infopath)
# self.profiler_hdl.read_sensor_path(sensorpath)
# self.profiler_hdl.profiler.process_profiler()
# self.profiler.setSyscfg(self.cfg)
# self.profiler.setRetrieve(retrieve)
# self.profiler.setDeviceID(self.device_id)
# self.profiler.setMeasureID(self.measure_id)
# path_tuple = ( "data", str(id), str(con) )
# self.profiler.setOldFolder( path_tuple )
# self.profiler.getInfoDict( )
# self.profiler.transferFromOldFolder()
# self.profiler.deleteOldFolder()
# self.profiler.dealOneMeasurement_Profiler(self.profiler.new_folder)
log.info(f" Complete Dealing one group.")
# self.profiler.readOneFolder( )
@ -223,20 +253,22 @@ class DealData:
log.warning(f"not find file: {fpath} ")
return ret
ret = fpath.read_bytes()
# with open( fpath, 'rb') as file:
# ret = file.read()
# return ret
return ret
pass
@staticmethod
def decode_info(info: bytes) -> dict:
'''info 分为两部分 : 传感器部分, 深度 倾斜部分 '''
ret = {}
try:
temp = struct.unpack( "<BBBBBBHHHHHHIIHHHHHBBBHHIfffIIIII", info )
temp = struct.unpack("<BBBBBBHHHHHHIIHHHHHBBBHHIfff \
HHHBHBHHHHH \
HHHHHHBBBBBBBBBBBBBB",
info)
except Exception as e:
log.info( "decode info 有误, 收到info frame 字节有误" )
return ret
time_ = "20"+f"{temp[0]:02d}" + "-" + f"{temp[1]:02d}" + "-" + f"{temp[2]:02d}" + " " \
+ f"{temp[3]:02d}" + ":" + f"{temp[4]:02d}" + ":" + f"{temp[5]:02d}"
ret.update({"time": time_})
@ -275,6 +307,20 @@ class DealData:
ret.update({"Measure_Num": temp[31]}) # 33
ret.update({"Measure_Interval": temp[32]}) # 34
ret.update({"Measure_Repeat": temp[33]}) # 35
ret.update({"Byte11": temp[46]}) # 46
ret.update({"Byte12": temp[47]}) # 47
ret.update({"Byte13": temp[48]}) # 48
ret.update({"Byte14": temp[49]}) # 49
ret.update({"Byte15": temp[50]}) # 50
ret.update({"Byte16": temp[51]}) # 51
ret.update({"Byte17": temp[52]}) # 52
ret.update({"Byte18": temp[53]}) # 53
ret.update({"Byte19": temp[54]}) # 54
ret.update({"Byte20": temp[55]}) # 55
ret.update({"Byte21": temp[56]}) # 56
ret.update({"Byte22": temp[57]}) # 57
ret.update({"Byte23": temp[58]}) # 58
return ret
pass
@ -368,6 +414,7 @@ class MyServer(socketserver.BaseRequestHandler):
def setup(self) -> None:
log.debug(f"retrieve {self.server.retrieve}",__name__, "", "" )
self.cfg =self.server.cfg
self.calcfg =self.server.calcfg
self.retrieve =self.server.retrieve
self.sk: socket.socket = self.request
self.sensor = illumination_sensor(self.request)
@ -436,7 +483,7 @@ class MyServer(socketserver.BaseRequestHandler):
if data_["packet_con"] == data_["packet_all"]:
log.info(f'最后一帧数据已经收到并保存')
# id 为传感器测量id ,con 测量序号
self.dealData.deal(data_['id'], data_["con"], self.cfg, self.retrieve)
self.dealData.deal(data_['id'], data_["con"], self.cfg,self.calcfg, self.retrieve)
pass
if time.time() - self.begin_time > TIMEOUT_SECOND:

@ -2,3 +2,4 @@ beginWL: 350
endWL: 950
interval: 1
rowFactor: 0.026
n_t_square: 0.543

@ -18,7 +18,7 @@ class DataContent:
# 11 13 55 AA 0200 00 11 00 00 00 4F00 01 07
# id type-num 序号 17 字节数 包号 总
info_frame = "1703140E313518565D1E51D55605CCE812068CDDC347D0239515000000000000000000000064000000000000000000000000000000000000000000F450F450F4500600000300000000000000000000"
# "1707070c161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0c000808e41778cf83df450f450f4500000000000000000000000000000131123600020000000524844557691e700cb054c054a05a10001"
sensor_frame =[
# 11 13 55 AA 02 00 10 11 00 00 00 DA 06 02 07
'131123600020000000524844557691E700CB054C054A05A10001\
@ -138,6 +138,104 @@ class MyBuf:
return ret
pass
class ProfilerBuf:
'''一次测量三个传感器数据打一个包'''
def __init__(self,) -> None:
self.__buf = b''
self.__head = {}
self.__begin_sign = b'\x23'
self.__end_sign = b'\x0D'
self.send_head = b'\x11\x13\x55\xAA'
self.send_id = 2 # 2byte 地位在前
self.send_type = 0 # info 0 data 1 pic 2
self.send_num = 0 # 一次测量最多十六次平均
self.send_con = 0 # 总的测量序号 4byte ,16次平均算几次?每次算一个
self.send_size = 0 #字节数 2byte
self.send_packet_con = 0
self.send_packet_all = 0
self.repeat = 0 # 依据这个拆包
self.groups = 0
self.state = 0
def readFile2Buf(self, fpath) -> None:
with open(fpath,"rb") as f:
self.__buf = f.read()
pass
pass
def read_buf(self, size: int) -> bytes:
if size > self.__buf.__len__():
return b''
ret = self.__buf[0:size]
self.__buf = self.__buf[size:]
return ret
def write_buf(self, buf: bytes) -> None:
len = buf.__len__()
# logging.info(f'Received ID:{id} Size:{len}')
self.__buf = self.__buf+buf
def get_buf_size(self) -> int:
return self.__buf.__len__()
def back_bytes(self, buf: bytes) -> None:
self.__buf = buf+self.__buf
def reset_head(self) -> None:
self.__head = {}
def reset_buf(self) -> None:
self.__buf = b''
def get_info_cnt(self, mode= 0, len=0) -> None:
ret = b''
if mode == 0:
ret = self.read_buf(len)
else:
ret = self.read_buf(len)
return ret
def pack_info_send(self,):
length = 26
ret = self.self.read_buf(26)
id = self.send_id.to_bytes(2, byteorder='little')
self.send_type = 0
type_num = (self.send_type *16 + self.send_num).to_bytes(1,byteorder='little' ) # ??
con = self.send_con.to_bytes(4, byteorder='little')
size = length.to_bytes(2, byteorder='little')
packet_con = self.send_packet_con.to_bytes(1,byteorder='little' )
packet_all = self.send_packet_all.to_bytes(1,byteorder='little' )
ret = self.send_head + id + type_num + con + size + packet_con + packet_all +ret
self.send_packet_con += 1
# 取重复次数和测量间隔
return ret
def pack_handheld_send(self,):
length = 26+576+576+576
ret = self.read_buf(length)
id = self.send_id.to_bytes(2, byteorder='little')
self.send_type = 1
type_num = self.send_type << 4 + self.send_num # ??
con = self.send_con.to_bytes(4, byteorder='little')
size = length.to_bytes(2, byteorder='little')
packet_con = self.send_packet_con.to_bytes(1,byteorder='little' )
packet_all = self.send_packet_all.to_bytes(1,byteorder='little' )
ret = self.send_head + id + type_num + con + size + packet_con + packet_all +ret
self.send_con+=1 # 总测量序号+1
self.send_num += 1 # 是平均中的第几次
self.send_packet_con += 1
return ret
pass
def pack_end_send(self,):
ret = b'\x11\x13\x55\xAA\x02\x00\xFF\x11\x00\x00\x00\x00\x00\x00\x00'
return ret
pass
class TcpProfiler(object):
def __init__(self ):
super(TcpProfiler, self).__init__()
@ -181,7 +279,6 @@ class TcpProfiler(object):
except KeyboardInterrupt as e:
print(f" == ctrl +c , exit")
def send_info(self,):
buf = bytes.fromhex (INFO_HEADER+ DataContent.info_frame)
self.flag = False
@ -189,7 +286,6 @@ class TcpProfiler(object):
print(f"head ....{self.head.hex()}")
self.send_rcv(buf)
def send_data(self,):
buf = b''
buf = bytes.fromhex (DATA_HEADER+ DataContent.sensor_frame[0])
@ -205,30 +301,73 @@ class TcpProfiler(object):
# print(f"head ....{self.head.hex()} ")
# self.send_rcv(buf)
def send_profiler_frame(self,num):
'''一次三个传感器数据作为一帧'''
buf = b''
buf = bytes.fromhex (DATA_HEADER+ DataContent.sensor_frame[0])
self.flag = False
self.head = buf[:15]
print(f"head ....{self.head.hex()}")
self.send_rcv(buf)
for i in range( num ):
i = i%256
print( "sensorframe..." )
buf = bytes.fromhex ( DataContent.sensor_frame[i] )
self.flag = False
self.head = buf[:15]
print(f"head ....{self.head.hex()} ")
self.send_rcv(buf)
def send_end_frame(self,):
buf = bytes.fromhex (DataContent.end_frame)
self.flag = False
self.head = buf[:15]
print(f"head ....{self.head.hex()}")
self.send_rcv(buf)
def send_protocol_head(self,):
pass
if __name__ == '__main__':
pass
# print( bytes.fromhex (DataContent.info_frame) )
tp = TcpProfiler()
tp.connect()
th = TcpProfiler()
th.connect()
try :
while True:
tp.send_info()
send_num = 10;
tp.send_data()
try :
th.send_info()
print("send info frame...")
time.sleep( 10)
except KeyboardInterrupt as e:
print(e)
tp.send_end_frame()
try :
th.send_data()
print("send sensor frame...")
time.sleep( 10)
except KeyboardInterrupt as e:
print(e)
time.sleep( 10)
try :
th.send_end_frame()
print("send end frame...")
time.sleep( 10)
except KeyboardInterrupt as e:
print(e)
tp.disconnect( )
th.disconnect( )
# with open("info.bin","rb") as f:
# d = f.read()
# print(d.hex())
'''
131123600020000000524844557691e700cb054c054a05a10001
23a000300700000a07fd062a073707440750074d074c07530759075a07610765076a07720790079107a407c3070709be0aac0abf080f080808270849089e0880094f0bb70f2a190123a000300600005223cd28242b3830e235813be9401b46675a3181c68d5c7916715d74c676617658742e71b26c9c674363da5f1c5e0160f164df66a262f85ad153764e4f4c014d0123a00030050000ea4d8c4d314df44d3c4fc250e453ba5e4486b8c5bcecc4d29a96436bfa56734e4b4a55473446364a845140582a5a9c55a54d91465440303c1b3fde5783718e700123a00030040000dc565046c140f63d21392e32d12b5b28a226f3253525662366219e20dd1fb11e971dc51c2f1c901b921a6419c21882185818e418181b401dec1c1d1a3917f7150123a00030030000ee153316f516ca176e18b218ca18b118701845186a1730155913e51314153015e1146c1420147d13c11208128c1128113011bf121614db12f70f3b0ee50d320e0123a00030020000fd0d3c0d930c470c0d0cb80b710b1e0bcd0a920a560a1f0a000a140a460a3e0ad0097a096c095f092109b60870085f0834082b081c0808080b08dd07b90795070123a000300100007007620755074a0740074c074607460748074a07500758075d0757074f0743075f0756075f0758074f073f07240745076207770756073f072a070907e606d6060123a00030000000f3060f07250722072e07200703070b07ec06ff0619073e07590734071807190719070a07e106dd06f006ec061b072f073e073e07220725070b07f806c806de060123a000300700000a07fd062a073707440750074d074c07530759075a07610765076a07720790079107a407c3070709be0aac0abf080f080808270849089e0880094f0bb70f2a190123a000300600005223cd28242b3830e235813be9401b46675a3181c68d5c7916715d74c676617658742e71b26c9c674363da5f1c5e0160f164df66a262f85ad153764e4f4c014d0123a00030050000ea4d8c4d314df44d3c4fc250e453ba5e4486b8c5bcecc4d29a96436bfa56734e4b4a55473446364a845140582a5a9c55a54d91465440303c1b3fde5783718e700123a00030040000dc565046c140f63d21392e32d12b5b28a226f3253525662366219e20dd1fb11e971dc51c2f1c901b921a6419c21882185818e418181b401dec1c1d1a3917f7150123a00030030000ee153316f516ca176e18b218ca18b118701845186a1730155913e51314153015e1146c1420147d13c11208128c1128113011bf121614db12f70f3b0ee50d320e0123a00030020000fd0d3c0d930c470c0d0cb80b710b1e0bcd0a920a560a1f0a000a140a460a3e0ad0097a096c095f092109b60870085f0834082b081c0808080b08dd07b90795070123a000300100007007620755074a0740074c074607460748074a07500758075d0757074f0743075f0756075f0758074f073f07240745076207770756073f072a070907e606d6060123a00030000000f3060f07250722072e07200703070b07ec06ff0619073e07590734071807190719070a07e106dd06f006ec061b072f073e073e07220725070b07f806c806de060123a000300700000a07fd062a073707440750074d074c07530759075a07610765076a07720790079107a407c3070709be0aac0abf080f080808270849089e0880094f0bb70f2a190123a000300600005223cd28242b3830e235813be9401b46675a3181c68d5c7916715d74c676617658742e71b26c9c674363da5f1c5e0160f164df66a262f85ad153764e4f4c014d0123a00030050000ea4d8c4d314df44d3c4fc250e453ba5e4486b8c5bcecc4d29a96436bfa56734e4b4a55473446364a845140582a5a9c55a54d91465440303c1b3fde5783718e700123a00030040000dc565046c140f63d21392e32d12b5b28a226f3253525662366219e20dd1fb11e971dc51c2f1c901b921a6419c21882185818e418181b401dec1c1d1a3917f7150123a00030030000ee153316f516ca176e18b218ca18b118701845186a1730155913e51314153015e1146c1420147d13c11208128c1128113011bf121614db12f70f3b0ee50d320e0123a00030020000fd0d3c0d930c470c0d0cb80b710b1e0bcd0a920a560a1f0a000a140a460a3e0ad0097a096c095f092109b60870085f0834082b081c0808080b08dd07b90795070123a000300100007007620755074a0740074c074607460748074a07500758075d0757074f0743075f0756075f0758074f073f07240745076207770756073f072a070907e606d6060123a00030000000f3060f07250722072e07200703070b07ec06ff0619073e07590734071807190719070a07e106dd06f006ec061b072f073e073e07220725070b07f806c806de
1707070c161800000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0c000808e41778cf83df450f450f4500000000000000000000000000000131123600020000000524844557691e700cb054c054a05a10001
'''
Loading…
Cancel
Save