2023-04-08 00:56:20 +00:00
|
|
|
#pragma once
|
|
|
|
#include "commondef.h"
|
|
|
|
#include "ImageApplyHeaders.h"
|
|
|
|
#include "CSizedetect.h"
|
2023-04-23 03:50:17 +00:00
|
|
|
#include "CorrectParam.h"
|
2023-04-08 00:56:20 +00:00
|
|
|
#include <vector>
|
|
|
|
#include <map>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
static std::map<TwSS, Size> papersize{
|
|
|
|
{A3, Size{297, 420}},
|
|
|
|
{A4, Size{210, 297}},
|
|
|
|
{A5, Size{148, 210}},
|
|
|
|
{A6, Size{105, 148}},
|
|
|
|
{B4, Size{250, 353}},
|
|
|
|
{B5, Size{176, 250}},
|
|
|
|
{B6, Size{125, 176}},
|
2023-04-23 03:50:17 +00:00
|
|
|
{MaxSize, Size{297, 1040}},
|
2023-04-08 00:56:20 +00:00
|
|
|
{USStatement, Size{297, (long)(420 * 1.5)}},
|
|
|
|
{USLetter, Size{216, 279}},
|
|
|
|
{USLegal, Size{216, 356}},
|
|
|
|
{USLedger, Size{279, 432}},
|
|
|
|
{None, Size{297, 420}},
|
|
|
|
{K8, Size{270, 390}},
|
|
|
|
{K16, Size{190, 270}},
|
|
|
|
{Trigeminy, Size{270, 560}},
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class IImageHandler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~IImageHandler() {}
|
2023-05-02 01:50:55 +00:00
|
|
|
virtual void add_image(void *data, int width, int height, int type,int scannnum,unsigned int fpgaversion=0x00090001) = 0;
|
2023-04-08 00:56:20 +00:00
|
|
|
virtual void config_procparams(HGImgProcParms params) = 0;
|
|
|
|
virtual void add_scanevent(HGIntInfo status) = 0;
|
|
|
|
virtual void clear() = 0;
|
|
|
|
virtual bool done() = 0;
|
2023-04-23 03:50:17 +00:00
|
|
|
virtual bool is_limit() = 0;
|
2023-04-08 00:56:20 +00:00
|
|
|
virtual void Set_ratio(u32 h_ratio,u32 v_ratio) = 0;
|
|
|
|
ImgStatus getimgstatus() { return m_imgstatus;}
|
|
|
|
void resetimgstatus() { m_imgstatus={.status=NO_error,.sannum=0};}
|
|
|
|
Size GetPaperSize(std::uint32_t paperType, float dpi, int orentation)
|
|
|
|
{
|
|
|
|
if (papersize.find((TwSS)paperType) != papersize.end() && (dpi > 99 && dpi < 601))
|
|
|
|
{
|
|
|
|
Size resize{2338, 3307};
|
|
|
|
if (orentation == 0)
|
|
|
|
{
|
|
|
|
resize.x = papersize[(TwSS)paperType].x * dpi / 25.4;
|
|
|
|
resize.y = papersize[(TwSS)paperType].y * dpi / 25.4;
|
|
|
|
return resize;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
resize.y = papersize[(TwSS)paperType].x * dpi / 25.4;
|
|
|
|
resize.x = papersize[(TwSS)paperType].y * dpi / 25.4;
|
|
|
|
return resize;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Size{2338, 3307};
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_scanconfig(HGScanConfig config)
|
|
|
|
{
|
|
|
|
m_scanconfig = config;
|
|
|
|
}
|
2023-04-23 03:50:17 +00:00
|
|
|
|
2023-04-08 00:56:20 +00:00
|
|
|
bool set_config(GScanCap config) {
|
|
|
|
|
2023-05-02 01:50:55 +00:00
|
|
|
m_hgimgconfig = config;
|
2023-04-23 03:50:17 +00:00
|
|
|
if(config.resolution_dst<300.0f)
|
|
|
|
m_hgimgconfig.resolution_native = 200.0f;
|
2023-05-02 01:50:55 +00:00
|
|
|
else if(config.resolution_dst < 500.0f)
|
2023-04-23 03:50:17 +00:00
|
|
|
m_hgimgconfig.resolution_native = 300.0f;
|
|
|
|
else
|
|
|
|
m_hgimgconfig.resolution_native = 600.0f;
|
2023-05-02 01:50:55 +00:00
|
|
|
|
2023-04-08 00:56:20 +00:00
|
|
|
m_ials.clear();
|
|
|
|
if(m_dog.get())
|
|
|
|
{
|
|
|
|
if(m_hgimgconfig.dogeardistabce>=10 && m_hgimgconfig.dogeardistabce <=300)
|
|
|
|
m_dog->setDistance(m_hgimgconfig.dogeardistabce);
|
|
|
|
else
|
2023-04-23 03:50:17 +00:00
|
|
|
m_dog->setDistance(70);
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
|
|
|
if(config.fillhole.is_fillhole)
|
|
|
|
{
|
2023-05-02 01:50:55 +00:00
|
|
|
if((config.fillholeratio_down+config.fillholeratio_up+config.fillholeratio_left+config.fillholeratio_right)>0)
|
2023-04-23 03:50:17 +00:00
|
|
|
{
|
|
|
|
m_ials.push_back(std::shared_ptr<CImageApply>(new CImageApplyOutHole(
|
|
|
|
25.0f,
|
|
|
|
{config.fillholeratio_up/100.0f,config.fillholeratio_down/100.0f,config.fillholeratio_left/100.0f,config.fillholeratio_right/100.0f},
|
|
|
|
50.0)));
|
2023-05-02 01:50:55 +00:00
|
|
|
printf(" \nconfig.fillholeratio -----");
|
2023-04-23 03:50:17 +00:00
|
|
|
}
|
|
|
|
else if(config.fillhole.fillholeratio > 0){
|
|
|
|
float ratio=config.fillhole.fillholeratio/100.0;
|
|
|
|
m_ials.push_back(std::shared_ptr<CImageApply>(new CImageApplyOutHole(25.0f,{ratio,ratio,ratio,ratio},50.0)));
|
|
|
|
}
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
2023-05-02 01:50:55 +00:00
|
|
|
bool islongcustomcrop = config.papertype == 52;
|
2023-04-08 00:56:20 +00:00
|
|
|
//bool isautocrop = config.papertype == TwSS::None;
|
|
|
|
Size fixedSize;
|
2023-05-02 01:50:55 +00:00
|
|
|
printf(" \nconfig.fillholeratio_down=%d", config.fillholeratio_down);
|
|
|
|
printf(" \nconfig.fillholeratio_up=%d", config.fillholeratio_up);
|
|
|
|
printf(" \nconfig.fillholeratio_left=%d", config.fillholeratio_left);
|
|
|
|
printf(" \nconfig.fillholeratio_right=%d", config.fillholeratio_right);
|
2023-04-08 00:56:20 +00:00
|
|
|
printf(" \nconfig.papertype=%d", config.papertype);
|
|
|
|
printf(" \nconfig.AutoCrop_threshold=%d", config.AutoCrop_threshold);
|
|
|
|
printf(" \nconfig.autodescrew=%d", config.autodescrew);
|
|
|
|
printf(" \nconfig.automaticcolor=%d", config.automaticcolor);
|
|
|
|
printf(" \nconfig.brightness=%f", config.brightness);
|
|
|
|
printf(" \nconfig.contrast=%f", config.contrast);
|
|
|
|
printf(" \nconfig.detachnoise=%d", config.detachnoise);
|
|
|
|
printf(" \nconfig.en_fold=%d", config.en_fold);
|
|
|
|
printf(" \nconfig.en_sizecheck=%d", config.en_sizecheck);
|
|
|
|
printf(" \nconfig.enhance_color=%d", config.enhance_color);
|
|
|
|
printf(" \nconfig.fillbackground=%d", config.fillbackground);
|
|
|
|
printf(" \nconfig.filter=%d", config.filter);
|
2023-05-02 01:50:55 +00:00
|
|
|
printf(" \nconfig.HsvFilterType=%d", config.HsvFilterType);
|
2023-04-08 00:56:20 +00:00
|
|
|
printf(" \nconfig.fillhole.is_fillhole=%d", config.fillhole.is_fillhole);
|
|
|
|
printf(" \nconfig.gamma=%f", config.gamma);
|
|
|
|
printf(" \nconfig.hardwarecaps.capturepixtype=%d", config.hardwarecaps.capturepixtype);
|
|
|
|
printf(" \nconfig.hardwarecaps.en_doublefeed=%d", config.hardwarecaps.en_doublefeed);
|
|
|
|
printf(" \nconfig.hsvcorrect=%d", config.hsvcorrect);
|
|
|
|
printf(" \nconfig.imageRotateDegree=%d", config.imageRotateDegree);
|
|
|
|
printf(" \nconfig.indent=%d", config.indent);
|
|
|
|
printf(" \nconfig.is_autocontrast=%d", config.is_autocontrast);
|
|
|
|
printf(" \nconfig.is_autocrop=%d", config.is_autocrop);
|
|
|
|
printf(" \nconfig.is_autodiscradblank_normal=%d", config.is_autodiscradblank_normal);
|
|
|
|
printf(" \nconfig.is_autodiscradblank_vince=%d", config.is_autodiscradblank_vince);
|
|
|
|
printf(" \nconfig.is_autotext=%d", config.is_autotext);
|
|
|
|
printf(" \nconfig.is_backrotate180=%d", config.is_backrotate180);
|
|
|
|
printf(" \nconfig.is_convex=%d", config.is_convex);
|
|
|
|
printf(" \nconfig.is_duplex=%d", config.is_duplex);
|
|
|
|
printf(" \nconfig.is_switchfrontback=%d", config.is_switchfrontback);
|
|
|
|
printf(" \nconfig.is_dogeardetection=%d", config.is_dogeardetection);
|
|
|
|
printf(" \nconfig.fillhole.multi_output_red=%d", config.multi_output_red);
|
|
|
|
printf(" \nconfig.noise=%d", config.noise);
|
|
|
|
printf(" \nconfig.hardwarecaps.paperAlign=%d", config.paperAlign);
|
|
|
|
printf(" \nconfig.hardwarecaps.pixtype=%d", config.pixtype);
|
2023-04-23 03:50:17 +00:00
|
|
|
printf(" \nconfig.resolution_dst=%f", config.resolution_dst);
|
|
|
|
printf(" \nconfig.resolution_native=%f", config.resolution_native);
|
2023-04-08 00:56:20 +00:00
|
|
|
printf(" \nconfig.scannum=%d", config.scannum);
|
2023-05-02 01:50:55 +00:00
|
|
|
printf(" \nconfig.sharpen=%d", config.sharpen);
|
2023-04-08 00:56:20 +00:00
|
|
|
printf(" \nconfig.is_dogeardetection=%d", config.is_dogeardetection);
|
2023-04-23 03:50:17 +00:00
|
|
|
fixedSize = GetPaperSize(config.papertype, m_hgimgconfig.resolution_native, config.paperAlign);
|
|
|
|
printf( " \n fixedSize x %d fixedSize y %d ",fixedSize.x,fixedSize.y);
|
2023-05-02 01:50:55 +00:00
|
|
|
// m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : config.is_autocrop,
|
|
|
|
// config.autodescrew, config.fillbackground, cv::Size(fixedSize.x, fixedSize.y), config.is_convex,false,config.AutoCrop_threshold,config.noise,config.indent)));
|
2023-04-08 00:56:20 +00:00
|
|
|
|
|
|
|
if (config.is_autodiscradblank_normal || config.is_autodiscradblank_vince)
|
|
|
|
{
|
2023-04-23 03:50:17 +00:00
|
|
|
if (config.is_autodiscradblank_normal)
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyDiscardBlank(40, 30, config.discardblank_percent, 200)));
|
2023-04-08 00:56:20 +00:00
|
|
|
else
|
2023-04-23 03:50:17 +00:00
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyDiscardBlank(40, 30, config.discardblank_percent * 15 / 10, 150)));
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : config.is_autocrop,
|
2023-04-23 03:50:17 +00:00
|
|
|
config.autodescrew, config.fillbackground, cv::Size(fixedSize.x, fixedSize.y), config.is_convex,config.isfillcolor,config.AutoCrop_threshold,config.noise,config.indent,config.normalCrop,config.HsvFilterType == 0)));
|
2023-04-08 00:56:20 +00:00
|
|
|
|
|
|
|
//自定义裁切
|
|
|
|
if(config.cropRect.enable &&!config.is_autocrop)
|
|
|
|
{
|
|
|
|
printf("\n 自定义裁切");
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyCustomCrop(cv::Rect(config.cropRect.x,config.cropRect.y,config.cropRect.width,config.cropRect.height))));
|
|
|
|
}
|
2023-04-23 03:50:17 +00:00
|
|
|
|
2023-05-02 01:50:55 +00:00
|
|
|
if((config.pixtype == 2)&&(config.is_colorcast))
|
|
|
|
{
|
|
|
|
printf("\n 色偏");
|
|
|
|
m_ials.push_back(m_colorcast);
|
|
|
|
}
|
2023-04-08 00:56:20 +00:00
|
|
|
|
2023-05-02 01:50:55 +00:00
|
|
|
if (config.fadeback && config.pixtype > 0)// && config.pixtype == 2
|
2023-04-23 03:50:17 +00:00
|
|
|
{
|
|
|
|
printf("\n 除底色");
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyFadeBackGroudColor(50,0,config.fadebackrange)));
|
|
|
|
}
|
2023-04-08 00:56:20 +00:00
|
|
|
// if (config.customGamma.enable)
|
|
|
|
// {
|
|
|
|
// m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyCustomGamma(imgparams.customGamma.table, imgparams.customGamma.tableLength)));
|
|
|
|
// }
|
|
|
|
|
|
|
|
//filter 0 r 1 g 2 b 3 none enhance color 0 none 1 r 2 g 3 b
|
|
|
|
if (config.filter != 3 || config.enhance_color)
|
|
|
|
{
|
|
|
|
int channel = 0; //filter none r g b enhance none r g b
|
|
|
|
if (config.filter != 3)
|
|
|
|
{
|
|
|
|
channel = config.filter;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
channel = config.enhance_color + 4;
|
|
|
|
}
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyChannel(static_cast<CImageApplyChannel::Channel>(channel))));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (config.brightness != 0 || config.contrast != 0 || config.gamma != 1.0)
|
|
|
|
{
|
|
|
|
double aa = (254 / 2000.0) * config.brightness + 0.5;
|
|
|
|
int bright = ceil(aa); //[-127,128] 0.128=256.0/2000.0
|
|
|
|
int contrast = 0.0; //= (int)(config.contrast * 0.036);;//[-36,36] 0.036=72.0/2000.0;
|
|
|
|
if (config.contrast < 0.0) // 暂不修改对比度,彩色文稿色偏
|
|
|
|
contrast = (int)(config.contrast * 0.036);
|
|
|
|
else
|
|
|
|
contrast = (int)(config.contrast * 0.018);
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyAdjustColors(bright, contrast, config.gamma)));
|
|
|
|
}
|
|
|
|
//答题卡除红
|
2023-04-23 03:50:17 +00:00
|
|
|
if ((config.hsvcorrect|| config.HsvFilterType!=0)&& config.pixtype==2)
|
2023-04-08 00:56:20 +00:00
|
|
|
{
|
|
|
|
printf("\n 答题卡除红");
|
2023-04-23 03:50:17 +00:00
|
|
|
CImageApplyHSVCorrect::CorrectOption hsv;//= config.hsvcorrect?CImageApplyHSVCorrect::CorrectOption::Red_Removal:
|
|
|
|
if(config.hsvcorrect)
|
|
|
|
hsv = CImageApplyHSVCorrect::CorrectOption::Red_Removal;
|
|
|
|
else
|
|
|
|
hsv = CImageApplyHSVCorrect::CorrectOption::FXB_Color_Cast;
|
|
|
|
|
|
|
|
m_ials.push_back(shared_ptr<CImageApplyHSVCorrect>(new CImageApplyHSVCorrect(hsv)));
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
|
|
|
//防止渗透
|
|
|
|
if (config.refuseInflow)
|
|
|
|
{
|
|
|
|
printf("\n 防止渗透");
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyRefuseInflow()));
|
|
|
|
}
|
|
|
|
//色彩校正
|
|
|
|
if (config.colorCorrection && config.pixtype != 0)
|
|
|
|
{
|
|
|
|
printf("\n 色彩校正");
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyAutoContrast()));
|
|
|
|
}
|
|
|
|
//除摩尔纹 除网纹
|
|
|
|
if (config.textureRemove ||config.removeMorr)
|
|
|
|
{
|
|
|
|
printf("\n 除摩尔纹 除网纹");
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyTextureRemoval()));
|
|
|
|
}
|
|
|
|
//锐化
|
|
|
|
if (config.sharpen)
|
|
|
|
{
|
|
|
|
CImageApplyFilter::FilterMode sb = (CImageApplyFilter::FilterMode)config.sharpen;
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyFilter(sb)));
|
|
|
|
}
|
|
|
|
//自动颜色识别
|
|
|
|
// if (config.automaticcolor)
|
|
|
|
// m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyColorRecognition(config.automaticcolortype==1? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray:CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono)));
|
|
|
|
//缩放
|
|
|
|
if (config.resolution_dst != config.resolution_native)
|
|
|
|
{
|
|
|
|
CImageApplyResize *apply;
|
|
|
|
bool islongcustomcrop = false;
|
|
|
|
if (config.papertype == 52 || config.normalCrop)
|
|
|
|
islongcustomcrop = true;
|
|
|
|
if (config.is_autocrop || islongcustomcrop)
|
|
|
|
{
|
2023-04-23 03:50:17 +00:00
|
|
|
double ratio = config.resolution_dst /m_hgimgconfig.resolution_native; //
|
2023-04-08 00:56:20 +00:00
|
|
|
apply = new CImageApplyResize(CImageApplyResize::ResizeType::RATIO, cv::Size(0, 0), ratio, ratio);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Size dSize = GetPaperSize(config.papertype, config.resolution_dst, config.paperAlign);
|
|
|
|
apply = new CImageApplyResize(CImageApplyResize::ResizeType::DSIZE, cv::Size(dSize.x, dSize.y), 1.0, 1.0);
|
|
|
|
}
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(apply));
|
|
|
|
}
|
|
|
|
//二值化
|
|
|
|
if (config.pixtype == 0) //threshold
|
|
|
|
{
|
|
|
|
if(config.errorExtention)
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::ERROR_DIFFUSION)));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyResize(CImageApplyResize::ResizeType::RATIO,cv::Size(0,0),600.0/(double(config.resolution_dst)),600.0/(double(config.resolution_dst)))));
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY,30,37,19)));
|
|
|
|
//m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyResize(CImageApplyResize::ResizeType::RATIO,cv::Size(0,0),(double(config.resolution_dst))/600.0,(double(config.resolution_dst))/600.0)));
|
|
|
|
}
|
|
|
|
|
|
|
|
//黑白降噪优化
|
|
|
|
if (config.detachnoise.is_detachnoise)
|
|
|
|
{
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyDetachNoise(config.detachnoise.detachnoise)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (config.en_fold)
|
|
|
|
{
|
2023-04-23 03:50:17 +00:00
|
|
|
if(!(config.fold_concatmode >=0 && config.fold_concatmode <3))
|
|
|
|
config.fold_concatmode = 0;
|
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyConcatenation(CImageApplyConcatenation::ConcatMode(config.fold_concatmode), cv::Scalar(255, 255, 255))));
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (config.imageRotateDegree != 0.0 || config.is_backrotate180)
|
|
|
|
{
|
2023-05-02 01:50:55 +00:00
|
|
|
CImageApplyRotation::RotationType type;
|
|
|
|
if (config.imageRotateDegree > 89.0f && config.imageRotateDegree < 91.0f)
|
|
|
|
type = CImageApplyRotation::RotationType::Rotate_90_clockwise;
|
|
|
|
else if (config.imageRotateDegree > 269.0f && config.imageRotateDegree < 271.0f)
|
|
|
|
type = CImageApplyRotation::RotationType::Rotate_90_anti_clockwise;
|
|
|
|
else if (config.imageRotateDegree > 179.0f && config.imageRotateDegree < 181.0f)
|
|
|
|
type = CImageApplyRotation::RotationType::Rotate_180;
|
|
|
|
else
|
|
|
|
type = CImageApplyRotation::RotationType::Invalid;
|
2023-04-08 00:56:20 +00:00
|
|
|
|
2023-05-02 01:50:55 +00:00
|
|
|
m_ials.push_back(shared_ptr<CImageApply>(new CImageApplyRotation(type, config.is_backrotate180, config.resolution_dst, NULL)));
|
2023-04-08 00:56:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
GScanCap m_hgimgconfig;
|
|
|
|
HGScanConfig m_scanconfig;
|
|
|
|
ImgStatus m_imgstatus;
|
|
|
|
std::vector<std::shared_ptr<CImageApply>> m_ials;
|
|
|
|
std::shared_ptr<CImageApplyDogEarDetection> m_dog;
|
|
|
|
std::shared_ptr<CSizedetect> m_sizedetect;
|
2023-05-02 01:50:55 +00:00
|
|
|
std::shared_ptr<CImageApplyColorCastCorrect> m_colorcast;
|
2023-04-08 00:56:20 +00:00
|
|
|
};
|