环境配置:Windows 10 + PHP Version 7.3.4
ImageMagick版本:
ImageMagick 拓展安装:http://pecl.php.net/package/imagick
注意:把扩展包中的“CORE_*.dll” 这些dll文件 放到 你的php.exe同级目录下
参考资料:
PHP手册:图像处理(ImageMagick)
代码示例:
<?php
set_time_limit(0);
function mb_str_split($str,$mb_str_length = 10){
$arr = preg_split('/(?<!^)(?!$)/u', $str);
$arr = array_chunk($arr,$mb_str_length);
$str = [];
foreach($arr as $value){
$str[] = implode('',$value);
}
$str = implode("\n",$str);
return ['convert_str' => $str,'convert_lines' => count($arr)];
}
$orderContent = file_get_contents('e:/order.txt');
$orderContent = json_decode($orderContent,true);
$textSize = 14;// 字体大小
$hangGao = $textSize + 2;// 文字每行高度=字体大小+2
$image = new Imagick();
$draw = new ImagickDraw();
$testColor = new ImagickPixel('#000000');
$imgBackground = new ImagickPixel('#FFFFFF'); // Transparent
/* Font properties */
$draw->setFont('Microsoft-YaHei-Light-&-Microsoft-YaHei-UI-Light');// 调用 Imagick::queryFonts() 查看
$draw->setFontSize($textSize);
$draw->setFillColor($testColor);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
$draw->setStrokeWidth(5);
$heightTop = 90;// 文件顶部高度
// 2 * $textSize + 30:表格表头和尾部的字体高度 + 30 空隙
// $orderContent['product_number'] *($hangGao * 3 + 10 ):SKU的行数 * (3倍字体高度 + 10的空隙)
$heightTable = 3 * $textSize + 30 + $orderContent['product_number'] * ($hangGao * 3 + 10 );
$heightBottomSpace = 100;// 100的留白,便于书写
$image->newImage(1200, $heightTop + $heightTable + $heightBottomSpace, $imgBackground);
// X轴偏移量
$columnIndex_X_0 = 50;
$columnIndex_X_1 = $columnIndex_X_0 + 95;// 图片规格是50X50
$columnIndex_X_2 = $columnIndex_X_1 + 65;// SKU
$columnIndex_X_3 = $columnIndex_X_2 + 110;// 包装类型
$columnIndex_X_4 = $columnIndex_X_3 + 80;// 产品名称
$columnIndex_X_5 = $columnIndex_X_4 + 210;// 下单数量
$columnIndex_X_6 = $columnIndex_X_5 + 60;// 单价
$columnIndex_X_7 = $columnIndex_X_6 + 80;// 运费
$columnIndex_X_8 = $columnIndex_X_7 + 70;// 优惠额
$columnIndex_X_9 = $columnIndex_X_8 + 70;// 入库数量
$columnIndex_X_10 = $columnIndex_X_9 + 50;// 不良品数量
$columnIndex_X_11 = $columnIndex_X_10 + 60;// 入库人
$columnIndex_X_12 = $columnIndex_X_11 + 85;// 入库时间
$line_space_width = 3;// 内容与线的空隙
$line_offset_x_left = 40;// 横线X轴起始坐标(左边距40)
$line_offset_x_right = 1160;// 横线X轴终止坐标(右边距40)
$offset_y = 50;// 起始Y轴偏移量(控制画笔纵向移动)
// 顶部
$draw->setFontSize(25);
$draw->annotation(520, $offset_y, '采购单');
$draw->setFontSize($textSize);
$offset_y += 25;
$draw->annotation($line_offset_x_left, $offset_y, '日期:'.$orderContent['create_time']);
$draw->annotation(550, $offset_y, '供应商:'.$orderContent['supplier_name']);
$offset_y += 15;
$draw->annotation($line_offset_x_left, $offset_y, '采购员:'.$orderContent['buyer_name']);
$draw->annotation(550, $offset_y, '收货地址:'.$orderContent['address']);
// 表头部分
$offset_y += 5;
$titleHeader = [0 => [' PO','产品图片',' SKU',' 包装类型',"\t\t\t\t\t\t产品名称","下单数量",'单价','运费','优惠额',"入库\n数量","不良品\n数量",'入库人','入库时间']];
$line_offset_y_top = $offset_y;// 竖线Y轴起始坐标
$line_offset_y_bottom = 0;// 竖线Y轴终止坐标
foreach($titleHeader as $key => $titleNameList){
$columnIndex = 0;
// (划线)表头上的横线
$draw->line($line_offset_x_left, $offset_y, $line_offset_x_right, $offset_y);
// 表头
foreach ($titleNameList as $key2 =>$titleName){
$offset_x = 'columnIndex_X_'.$columnIndex;
$draw->annotation($$offset_x, $hangGao + $offset_y, $titleName);
$columnIndex ++;
}
}
// 表格内容
$offset_y += $hangGao * 2 + 10;
foreach($orderContent['data'] as $key => $orderItemVal){
if($key == 0){
// (划线)
$draw->line($line_offset_x_left, $offset_y, $line_offset_x_right, $offset_y);
}
$columnIndex = 0;
$convertLines = 1;// 一行内容中文本最大占用行数
for($i = 0;$i <= 12;$i ++ ){// 12.表格总共12列
$offset_x = 'columnIndex_X_'.$i;
$valueName = '';
switch ($i){
case 0:
$valueName = $orderItemVal['purchase_number'];
break;
case 1:
$url = $orderItemVal['product_img_url'];
$glasses = new Imagick();
$glasses->readImageBlob(file_get_contents('http://yibaistore.yibainetwork.com/end/upload/image/Thumb_no_logo/1711220216828/1711220216828-1.jpg'));
$glasses->resizeImage(50, 50, 1, 0, true);
$image->compositeImage($glasses, Imagick::COMPOSITE_DEFAULT, $$offset_x, $hangGao * ($key) + $offset_y + 5);
break;
case 2:
$valueName = $orderItemVal['sku'];
break;
case 3:
$valueName = $orderItemVal['purchase_packaging'];
$convertResult = mb_str_split($valueName,6);// 6.每行只展示6个汉字
$valueName = $convertResult['convert_str'];
break;
case 4:
$convertResult = mb_str_split($orderItemVal['product_name'],14);
$valueName = $convertResult['convert_str'];
$convertLines = $convertResult['convert_lines'];
if($convertLines < 3) $convertLines = 3;// 控制最低高度,由产品名称和图片高度决定
break;
case 5:
$valueName = $orderItemVal['purchase_amount'];
break;
case 6:
$valueName = $orderItemVal['purchase_unit_price'];
break;
case 7:
$valueName = $orderItemVal['freight'];
break;
case 8:
$valueName = $orderItemVal['discount'];
break;
case 9:
$valueName = $orderItemVal['instock_qty'];
break;
case 10:
$valueName = $orderItemVal['bad_qty'];
break;
case 11:
$valueName = $orderItemVal['instock_user_name'];
$convertResult = mb_str_split($valueName,3);
$valueName = $convertResult['convert_str'];
break;
case 12:
$valueName = $orderItemVal['instock_date'];
$valueName = str_replace(' ',"\n",$valueName);
break;
}
if($i == 1) continue;
$draw->annotation($$offset_x, $hangGao * ($key + 1) + $offset_y + $line_space_width, $valueName);
}
if($convertLines > 1){
$offset_y += $textSize * ($convertLines);// Y周偏移量
}
$innerOffsetY = $hangGao * ($key + 1) + $offset_y + $line_space_width;
// (划线)
$draw->line($line_offset_x_left, $innerOffsetY, $line_offset_x_right, $innerOffsetY);// 每一行的下划线
}
$line_offset_y_bottom = $innerOffsetY;// 竖线Y轴实际终止坐标
$offset_y = $line_offset_y_bottom + $textSize + 5;
// (划线)表格Y轴竖线
for($i = 0;$i <= 12;$i ++ ) {// 12.表格总共12列
$offset_x = 'columnIndex_X_'.$i;
if($i == 0){
$draw->line($line_offset_x_left, $line_offset_y_top, $line_offset_x_left, $offset_y);// 每一行的下划线
}elseif($i == 12){
$draw->line($$offset_x - $line_space_width, $line_offset_y_top, $$offset_x - $line_space_width, $line_offset_y_bottom);// 每一行的下划线
$draw->line($line_offset_x_right, $line_offset_y_top, $line_offset_x_right, $offset_y);// 每一行的下划线
}else{
if($i == 1 or $i == 11){
$draw->line($$offset_x - $line_space_width, $line_offset_y_top, $$offset_x - $line_space_width, $line_offset_y_bottom);// 每一行的下划线
}else{
$draw->line($$offset_x - $line_space_width, $line_offset_y_top, $$offset_x - $line_space_width, $offset_y);// 每一行的下划线
}
}
}
// 尾部
$draw->annotation($columnIndex_X_2, $offset_y - $line_space_width, ' 产品总数');
$draw->annotation($columnIndex_X_3, $offset_y - $line_space_width, $orderContent['product_number']);
$draw->annotation($columnIndex_X_4, $offset_y - $line_space_width, ' 总数量');
$draw->annotation($columnIndex_X_5, $offset_y - $line_space_width, $orderContent['total']);
$draw->annotation($columnIndex_X_6, $offset_y - $line_space_width, $orderContent['total_price']);
$draw->annotation($columnIndex_X_7, $offset_y - $line_space_width, $orderContent['total_freight']);
$draw->annotation($columnIndex_X_8, $offset_y - $line_space_width, $orderContent['total_discount']);
$draw->annotation($columnIndex_X_9, $offset_y - $line_space_width, ' RMB');
$draw->line($line_offset_x_left, $offset_y, $line_offset_x_right, $offset_y);// 每一行的下划线
// 输出图片文件
$image->flattenImages();
$image->setImageFormat('png');
$image->drawImage($draw);
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImageBlob();
exit;
order.txt 文件内容:
base_decode 解压后放入order.txt文件即可
eyJwcm9kdWN0X251bWJlciI6MTAsInRvdGFsIjo1MiwidG90YWxfcHJpY2UiOiIxODIwLjAwMCIsInN1cHBsaWVyX25hbWUiOiJcdTVlN2ZcdTVkZGVcdTUzNGVcdTUzNDdcdTY3MGRcdTk5NzBcdTY3MDlcdTk2NTBcdTUxNmNcdTUzZjgiLCJidXllcl9uYW1lIjoiXHU2NzRlXHU4NDBkMjA3MjEyIiwiY3JlYXRlX3RpbWUiOiIyMDIyLTEwLTE4IDE0OjM4OjU2IiwiYWRkcmVzcyI6Ilx1NWU3Zlx1NGUxY1x1NzcwMSBcdTRlMWNcdTgzOWVcdTVlMDIgIFx1ODY0ZVx1OTVlOFx1OTU0NyBcdTY1YjBcdTgwNTRcdTc5M2VcdTUzM2FcdTlhZDhcdTc5ZDFcdTRlMDBcdThkZWZcdTRlYmZcdTZjZjBcdTc1MzVcdTdlYmZcdWZmMDhcdTY2MTNcdTRmNzBcdTdmNTFcdTdlZGNcdTU2ZmRcdTUxODVcdTRlZDNcdWZmMDkiLCJkYXRhIjpbeyJpZCI6IjEyNTA0OTc4IiwicHVyY2hhc2VfbnVtYmVyIjoiUEZCMTEyOTA4MjAiLCJza3UiOiIxNzExMjIwMjE2ODE1IiwicHJvZHVjdF9pbWdfdXJsIjoiaHR0cDpcL1wvcHJvZHVjdC55aWJhaW5ldHdvcmsuY29tXC9lbmRcL3VwbG9hZDNcL2ltYWdlXC9UaHVtYl9ub19sb2dvXC8xNzExMjIwMjE2ODE1XC8xNzExMjIwMjE2ODE1LTEuanBnIiwicHJvZHVjdF9uYW1lIjoiXHVmZjA4XHU2NzBkXHU4OGM1XHU3ZWM0XHVmZjA5XHU2NWY2XHU1YzFhXHU0ZjExXHU5NWYyXHU0ZmVlXHU4ZWFiXHU2NjNlXHU3NjI2XHU2YjI3XHU3ZjhlXHU1OTczXHU4OGM1XHU4ZmRlXHU0ZjUzXHU4OGU0XHU5ZWQxXHU4MjcyWFhMIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6OSwiaW5zdG9ja19xdHkiOiI5IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1ODRkZFx1Nzk2NVx1NjU4NyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTk6NTE6MzMiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5NzkiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MjYiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MjZcLzE3MTEyMjAyMTY4MjYtMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTUxOWJcdTdlZmZcdTgyNzJTIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NywiaW5zdG9ja19xdHkiOiI3IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1ODRkZFx1Nzk2NVx1NjU4NyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6MDE6MTEiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODAiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MTQiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkXC9pbWFnZVwvVGh1bWJfbm9fbG9nb1wvMTcxMTIyMDIxNjgxNFwvMTcxMTIyMDIxNjgxNC0xLmpwZyIsInByb2R1Y3RfbmFtZSI6Ilx1ZmYwOFx1NjcwZFx1ODhjNVx1N2VjNFx1ZmYwOVx1NjVmNlx1NWMxYVx1NGYxMVx1OTVmMlx1NGZlZVx1OGVhYlx1NjYzZVx1NzYyNlx1NmIyN1x1N2Y4ZVx1NTk3M1x1ODhjNVx1OGZkZVx1NGY1M1x1ODhlNFx1OWVkMVx1ODI3MlhMIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NywiaW5zdG9ja19xdHkiOiI3IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1OTBiOVx1NTNlY1x1NjU4YyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6NDA6NTAiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODEiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MjciLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MjdcLzE3MTEyMjAyMTY4MjctMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTUxOWJcdTdlZmZcdTgyNzJNIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NSwiaW5zdG9ja19xdHkiOiI1IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1ODRkZFx1Nzk2NVx1NjU4NyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6MDA6MjkiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODIiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MTMiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MTNcLzE3MTEyMjAyMTY4MTMtMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTllZDFcdTgyNzJMIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NSwiaW5zdG9ja19xdHkiOiI1IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1N2ZjMVx1NTkyOVx1NjY3NiIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6MjA6MzAiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODMiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MTIiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MTJcLzE3MTEyMjAyMTY4MTItMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTllZDFcdTgyNzJNIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NSwiaW5zdG9ja19xdHkiOiI1IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1ODRkZFx1Nzk2NVx1NjU4NyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6MDA6MjkiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODQiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MTEiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MTFcLzE3MTEyMjAyMTY4MTEtMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTllZDFcdTgyNzJTIiwicHVyY2hhc2VfdW5pdF9wcmljZSI6IjM1LjAwMCIsInB1cmNoYXNlX2Ftb3VudCI6NSwiaW5zdG9ja19xdHkiOiI1IiwiYmFkX3F0eSI6IjAiLCJpbnN0b2NrX3VzZXJfbmFtZSI6Ilx1ODRkZFx1Nzk2NVx1NjU4NyIsImluc3RvY2tfZGF0ZSI6IjIwMjItMTAtMTkgMTc6MDA6NTAiLCJmcmVpZ2h0IjoiMC4wMDAiLCJkaXNjb3VudCI6IjAuMDAwIiwibGFiZWxfcGRmIjoiIiwiYmFyY29kZV9wZGYiOiIiLCJwdXJjaGFzZV9wYWNrYWdpbmciOiJQRVx1ODg4Ylx1NTMwNVx1ODhjNSIsIm5vX2luc3RvY2tfcXR5IjowfSx7ImlkIjoiMTI1MDQ5ODUiLCJwdXJjaGFzZV9udW1iZXIiOiJQRkIxMTI5MDgyMCIsInNrdSI6IjE3MTEyMjAyMTY4MzAiLCJwcm9kdWN0X2ltZ191cmwiOiJodHRwOlwvXC9wcm9kdWN0LnlpYmFpbmV0d29yay5jb21cL2VuZFwvdXBsb2FkM1wvaW1hZ2VcL1RodW1iX25vX2xvZ29cLzE3MTEyMjAyMTY4MzBcLzE3MTEyMjAyMTY4MzAtMS5qcGciLCJwcm9kdWN0X25hbWUiOiJcdWZmMDhcdTY3MGRcdTg4YzVcdTdlYzRcdWZmMDlcdTY1ZjZcdTVjMWFcdTRmMTFcdTk1ZjJcdTRmZWVcdThlYWJcdTY2M2VcdTc2MjZcdTZiMjdcdTdmOGVcdTU5NzNcdTg4YzVcdThmZGVcdTRmNTNcdTg4ZTRcdTUxOWJcdTdlZmZcdTgyNzJYWEwiLCJwdXJjaGFzZV91bml0X3ByaWNlIjoiMzUuMDAwIiwicHVyY2hhc2VfYW1vdW50IjozLCJpbnN0b2NrX3F0eSI6IjMiLCJiYWRfcXR5IjoiMCIsImluc3RvY2tfdXNlcl9uYW1lIjoiXHU5MGI5XHU1M2VjXHU2NThjIiwiaW5zdG9ja19kYXRlIjoiMjAyMi0xMC0xOSAxNzo0MDoyMSIsImZyZWlnaHQiOiIwLjAwMCIsImRpc2NvdW50IjoiMC4wMDAiLCJsYWJlbF9wZGYiOiIiLCJiYXJjb2RlX3BkZiI6IiIsInB1cmNoYXNlX3BhY2thZ2luZyI6IlBFXHU4ODhiXHU1MzA1XHU4OGM1Iiwibm9faW5zdG9ja19xdHkiOjB9LHsiaWQiOiIxMjUwNDk4NiIsInB1cmNoYXNlX251bWJlciI6IlBGQjExMjkwODIwIiwic2t1IjoiMTcxMTIyMDIxNjgyOSIsInByb2R1Y3RfaW1nX3VybCI6Imh0dHA6XC9cL3Byb2R1Y3QueWliYWluZXR3b3JrLmNvbVwvZW5kXC91cGxvYWRcL2ltYWdlXC9UaHVtYl9ub19sb2dvXC8xNzExMjIwMjE2ODI5XC8xNzExMjIwMjE2ODI5LTEuanBnIiwicHJvZHVjdF9uYW1lIjoiXHVmZjA4XHU2NzBkXHU4OGM1XHU3ZWM0XHVmZjA5XHU2NWY2XHU1YzFhXHU0ZjExXHU5NWYyXHU0ZmVlXHU4ZWFiXHU2NjNlXHU3NjI2XHU2YjI3XHU3ZjhlXHU1OTczXHU4OGM1XHU4ZmRlXHU0ZjUzXHU4OGU0XHU1MTliXHU3ZWZmXHU4MjcyWEwiLCJwdXJjaGFzZV91bml0X3ByaWNlIjoiMzUuMDAwIiwicHVyY2hhc2VfYW1vdW50IjozLCJpbnN0b2NrX3F0eSI6IjMiLCJiYWRfcXR5IjoiMCIsImluc3RvY2tfdXNlcl9uYW1lIjoiXHU3ZmMxXHU1OTI5XHU2Njc2IiwiaW5zdG9ja19kYXRlIjoiMjAyMi0xMC0xOSAxNzoyMDowNiIsImZyZWlnaHQiOiIwLjAwMCIsImRpc2NvdW50IjoiMC4wMDAiLCJsYWJlbF9wZGYiOiIiLCJiYXJjb2RlX3BkZiI6IiIsInB1cmNoYXNlX3BhY2thZ2luZyI6IlBFXHU4ODhiXHU1MzA1XHU4OGM1Iiwibm9faW5zdG9ja19xdHkiOjB9LHsiaWQiOiIxMjUwNDk4NyIsInB1cmNoYXNlX251bWJlciI6IlBGQjExMjkwODIwIiwic2t1IjoiMTcxMTIyMDIxNjgyOCIsInByb2R1Y3RfaW1nX3VybCI6Imh0dHA6XC9cL3Byb2R1Y3QueWliYWluZXR3b3JrLmNvbVwvZW5kXC91cGxvYWRcL2ltYWdlXC9UaHVtYl9ub19sb2dvXC8xNzExMjIwMjE2ODI4XC8xNzExMjIwMjE2ODI4LTEuanBnIiwicHJvZHVjdF9uYW1lIjoiXHVmZjA4XHU2NzBkXHU4OGM1XHU3ZWM0XHVmZjA5XHU2NWY2XHU1YzFhXHU0ZjExXHU5NWYyXHU0ZmVlXHU4ZWFiXHU2NjNlXHU3NjI2XHU2YjI3XHU3ZjhlXHU1OTczXHU4OGM1XHU4ZmRlXHU0ZjUzXHU4OGU0XHU1MTliXHU3ZWZmXHU4MjcyTCIsInB1cmNoYXNlX3VuaXRfcHJpY2UiOiIzNS4wMDAiLCJwdXJjaGFzZV9hbW91bnQiOjMsImluc3RvY2tfcXR5IjoiMyIsImJhZF9xdHkiOiIwIiwiaW5zdG9ja191c2VyX25hbWUiOiJcdTkwYjlcdTUzZWNcdTY1OGMiLCJpbnN0b2NrX2RhdGUiOiIyMDIyLTEwLTE5IDE3OjQxOjExIiwiZnJlaWdodCI6IjAuMDAwIiwiZGlzY291bnQiOiIwLjAwMCIsImxhYmVsX3BkZiI6IiIsImJhcmNvZGVfcGRmIjoiIiwicHVyY2hhc2VfcGFja2FnaW5nIjoiUEVcdTg4OGJcdTUzMDVcdTg4YzUiLCJub19pbnN0b2NrX3F0eSI6MH1dLCJ0b3RhbF9mcmVpZ2h0IjoiMC4wMDAiLCJ0b3RhbF9kaXNjb3VudCI6IjAuMDAwIn0=