diff options
| author | lijia <[email protected]> | 2021-06-03 18:33:10 +0800 |
|---|---|---|
| committer | lijia <[email protected]> | 2021-06-03 18:33:10 +0800 |
| commit | ead1db681251a35909d62f7b072a7c5670f0731e (patch) | |
| tree | 1aa9af0533e7efc4aa245e6c01f4081d13e72e7e | |
| parent | 6c51a6738bf003ed5cf43e0c46584834661b1b5f (diff) | |
TSG-6589, 修复L2TP解析层在udp流close时解析IP原始包崩溃的BUG.v4.2.37
| -rw-r--r-- | bin/etc/sapp.toml | 27 | ||||
| -rw-r--r-- | cmake/Package.cmake | 2 | ||||
| -rw-r--r-- | include/private/sapp_declaration.h | 2 | ||||
| -rw-r--r-- | include/private/stream_internal.h | 1 | ||||
| -rw-r--r-- | src/common/sapp_log.c | 38 | ||||
| -rw-r--r-- | src/config/cmd_args.c | 22 | ||||
| -rw-r--r-- | src/config/config_parse.cpp | 1516 | ||||
| -rw-r--r-- | src/dealpkt/deal_udp.c | 6 | ||||
| -rw-r--r-- | src/inner_plug/l2tp_protocol_plug.c | 3 |
9 files changed, 927 insertions, 690 deletions
diff --git a/bin/etc/sapp.toml b/bin/etc/sapp.toml index 3178385..9785c82 100644 --- a/bin/etc/sapp.toml +++ b/bin/etc/sapp.toml @@ -1,24 +1,24 @@ ################################################################################################### -# NOTE: -# The format of this file is toml (https://github.com/cktan/tomlc99) -# to make vim editor display colorful and human readable, -# you can create a symbolic links named sapp.ini to sapp.toml, ln -sf sapp.toml sapp.ini +# NOTE: # +# The format of this file is toml (https://github.com/cktan/tomlc99) # +# to make vim editor display colorful and human readable, # +# you can create a symbolic links named sapp.ini to sapp.toml, ln -sf sapp.toml sapp.ini # ################################################################################################### [SYSTEM] -instance_name = "sapp_v4.2" + instance_name = "sapp_v4.2" [CPU] -worker_threads=1 -send_only_threads_max=0 + worker_threads=1 + send_only_threads_max=0 ### note, bind_mask, if you do not want to bind thread to special CPU core, keep it empty as [] ### there are two different grammars: ### toml array format: bind_mask=[1,2,3,4,5,11,12,13,14,15] ### MESA_load_profile range format: bind_mask="1-5,11-15" -bind_mask=[] + bind_mask=[] [MEM] -dictator_enable=1 + dictator_enable=1 [PACKET_IO] [overlay_tunnel_definition] @@ -58,7 +58,7 @@ dictator_enable=1 inject_mode_single_gateway_src_mac="00:11:22:77:88:99" inject_mode_single_gateway_dst_mac="00:11:22:33:44:55" - dumpfile_sleep_time_before_exit=3 + dumpfile_sleep_time_before_exit=0 ### note, depolyment.mode options: [mirror, inline, transparent] [packet_io.depolyment] @@ -86,7 +86,6 @@ dictator_enable=1 tcp_drop_pure_ack_pkt=0 tcp_syn_option_parse_enabled=1 skip_not_ip_layer_over_eth=0 - reverse_ethernet_addr=1 [DUPLICATE_PKT] [dup_pkt.traffic.original] @@ -146,7 +145,7 @@ dictator_enable=1 symbol_conflict_enabled=0 [profiling.log] - level=30 + level=20 interval=5 [profiling.log.local] @@ -187,7 +186,8 @@ dictator_enable=1 [tools.pkt_dump.udp] command_port=12345 - + pkt_dump_ratio=30 + [tools.pkt_dump.storage] ### note, file path must be double quotation mark extension, for example, path="/dev/shm/pkt_dump" path="/dev/shm/pkt_dump" @@ -205,7 +205,6 @@ dictator_enable=1 ### note: ### These configurations format is complex and difficult to describe with toml grammar, ### so, create a independent secondary config file to description specific information. -### relative path, will add prefix with cmd args --config-root-dir, use default ./etc/ without --config-root-dir args. [SECONDARY_CONFIG_LINK] cfg_file_sapp_log="etc/sapp_log.conf" diff --git a/cmake/Package.cmake b/cmake/Package.cmake index 32647a8..eaa269f 100644 --- a/cmake/Package.cmake +++ b/cmake/Package.cmake @@ -70,7 +70,7 @@ set(CPACK_RPM_EXECUTABLE_USER_FILELIST "%config(noreplace) ${CMAKE_INSTALL_PREFI "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/vlan_flipping_map.conf" "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/stream_compare_layer.conf" "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/necessary_plug_list.conf" - ) + "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/etc/sapp_log.conf") # Must uninstall the debug package before install release package set(CPACK_RPM_PACKAGE_CONFLICTS ${MY_RPM_NAME_PREFIX}) diff --git a/include/private/sapp_declaration.h b/include/private/sapp_declaration.h index ba1e87c..905f143 100644 --- a/include/private/sapp_declaration.h +++ b/include/private/sapp_declaration.h @@ -83,7 +83,7 @@ int sapp_parse_cmd_args(int argc, char *argv[]); int sapp_parse_config(void); void sapp_init_breakpad_mini(void); void sapp_segv_generate(void); -void sapp_generate_example_config(const char *filename); +void sapp_generate_example_config(const char *filename, const char *version); void sapp_cla_override_cfg_file(void); void sapp_global_val_sanity_check(void); void *sapp_time_event_thread(void *arg); diff --git a/include/private/stream_internal.h b/include/private/stream_internal.h index 0620b16..3fc8b93 100644 --- a/include/private/stream_internal.h +++ b/include/private/stream_internal.h @@ -402,6 +402,7 @@ void sapp_update_config_root_dir(const char *cfg_root_dir); void sapp_update_data_root_dir(const char *data_root_dir); int sapp_is_absolute_path(const char *filename); +void sapp_printf_colorful(int level, const char *format, ...); #ifdef __cplusplus } diff --git a/src/common/sapp_log.c b/src/common/sapp_log.c index 493a34e..215361d 100644 --- a/src/common/sapp_log.c +++ b/src/common/sapp_log.c @@ -7,6 +7,44 @@ extern "C" { #include "support/tomlc99_wrap.h" +void sapp_printf_colorful(int level, const char *format, ...) +{ + va_list ap; + char local_log_content_buff[XATTR_SIZE_MAX]; + const char *log_color_start = ""; + const char *log_color_end = ""; + + va_start(ap, format); + vsnprintf(local_log_content_buff, sizeof(local_log_content_buff), format, ap); + va_end(ap); + + switch(level) + { + case RLOG_LV_DEBUG: + log_color_start = "\033[33m"; + log_color_end = "\033[0m"; + break; + + case RLOG_LV_INFO: + log_color_start = "\033[1;33m"; + log_color_end = "\033[0m"; + break; + + case RLOG_LV_FATAL: + log_color_start = "\033[1;31;40m"; + log_color_end = "\033[0m"; + break; + + default: + break; + } + + fprintf(stdout, "%s%s%s", log_color_start, local_log_content_buff, log_color_end); + + return; +} + + /* print_sw, file_sw: 0:�����; diff --git a/src/config/cmd_args.c b/src/config/cmd_args.c index 1890bc7..6fcaec9 100644 --- a/src/config/cmd_args.c +++ b/src/config/cmd_args.c @@ -120,13 +120,13 @@ static const sapp_cmd_args_usage_t cmd_args_usage[] = {"-h", "help", "no",NULL, "show help message"}, {"-p", "dumpfile-speed", "required",dumpfile_speed_check, "\n \t\ttop-speed\tprocess packets as fast as possible, this is default behavior\n\t\ttimestamp\tprocess packets as pcap embedded timestamp interval"}, {"-r", "dumpfile-file", "required",NULL, "read packets from which pcap file"}, - {"-t", "test-config", "optional",NULL, "check validity of the configuration file, support level t1,t2,t3"}, + {"-t", "test-config", "no",NULL, "check validity of the configuration file"}, {"-v", "version", "no",NULL, "show platform version"}, {NULL, NULL, NULL,NULL,NULL} }; /* ��ֻ̬��ȫ�ֱ������Է����κδ����, ������sapp_global_val�� */ -static const char *sapp_cla_short_options = "dhgvc:C:D:e:r:p:f:t::"; +static const char *sapp_cla_short_options = "dhgvc:C:D:e:r:p:f:t"; /* ��ֻ̬��ȫ�ֱ������Է����κδ����, ������sapp_global_val�� */ static const struct option sapp_cla_long_options[] = @@ -142,7 +142,7 @@ static const struct option sapp_cla_long_options[] = {"dumpfile-speed", required_argument, NULL, 'p'}, {"example-config", required_argument, NULL, 'e'}, {"coredump", no_argument, NULL, 'g'}, - {"test-config", optional_argument, NULL, 't'}, + {"test-config", no_argument, NULL, 't'}, {NULL, 0, NULL, 0} }; @@ -451,7 +451,6 @@ int sapp_parse_cmd_args(int argc, char *argv[]) int option_array_index; int test_config_flag = 0; - char *test_config_option_value = NULL; while(1){ c = getopt_long(argc, argv, sapp_cla_short_options, sapp_cla_long_options, &opt_index); @@ -493,7 +492,7 @@ int sapp_parse_cmd_args(int argc, char *argv[]) break; case 'e': - sapp_generate_example_config(optarg); + sapp_generate_example_config(optarg, sapp_git_ver); exit(1); break; @@ -528,17 +527,6 @@ int sapp_parse_cmd_args(int argc, char *argv[]) case 't': test_config_flag = 1; - if(optarg != NULL){ - if((strcmp(optarg, "1") != 0) - && (strcmp(optarg, "2") != 0) - && (strcmp(optarg, "3") != 0)){ - printf("option -t --test-config only support level [t1,t2,t3]\n"); - exit(1); - } - test_config_option_value = sapp_strdup(optarg); - }else{ - test_config_option_value = sapp_strdup("1"); //default is t1 - } continue; case '?': /* invalid or unknown option */ @@ -590,7 +578,7 @@ int sapp_parse_cmd_args(int argc, char *argv[]) } if(test_config_flag != 0){ - ret = sapp_config_check(atoi(test_config_option_value)); + ret = sapp_config_check(); exit(ret); } diff --git a/src/config/config_parse.cpp b/src/config/config_parse.cpp index 82a23fa..1b3ae6d 100644 --- a/src/config/config_parse.cpp +++ b/src/config/config_parse.cpp @@ -11,12 +11,14 @@ extern "C" { extern int g_overlay_layer_set[__ADDR_TYPE_MAX][SAPP_SUPPORT_LAYER_NUM_MAX]; - +#define SAPP_CFG_OBSOLETE_FLAG 99999999 typedef struct __sapp_config_check{ int global_id; - int depend_id; /* 1:����IJ���, ����ȱʧ; 0:��ѡ��, ����û��, ��Ӱ��sapp���幦��; >= 1000:����δ����, ȡ�����������ò����Ƿ���, ����transparentģʽ��������packet_io.external.interface */ + int depend_id; /* 1:����IJ���, ��������������, Ҳ����ȱʧ; 0:��ѡ��, ����û��, ��Ӱ��sapp���幦��; >=1000:����δ����, ȡ�����������ò����Ƿ���, ����transparentģʽ��������packet_io.external.interface */ + int err_log_level; /* 10,20,30, ������־�ȼ� */ const char *section; const char *cfg_key; + const char *depend_cfg_value; /* ����depend_id>1000ʱ��Ч, ��ʾ����������ֵ����Ԥ�ȶ���ʱ, �ż�鵱ǰ�����Ƿ�Ϸ�, ����mirroģʽ�¸�������Ҫ��� packet_io.external.interface */ int (*cfg_value_check_fun)(const struct __sapp_config_check *sapp_cfg_check_attr, int this_cfg_id, int depend_cfg_id, const char *cfg_value, const void *range_array, int array_num); char *cfg_value; /* NULL is not found */ const void *expect_range_array; /* ���ڼ�����ֵ�Ŀ�ѡ��Χ����, �������͵IJ�ͬ������int *, ������char **���� */ @@ -32,14 +34,23 @@ typedef struct{ static const char *sapp_cfg_get_value_from_attr_by_id(const sapp_config_check_t *sapp_cfg_check_attr,int cfg_global_id); static const char *sapp_cfg_get_value_from_attr_by_section_key(const sapp_config_check_t *sapp_cfg_check_attr, const char *section, const char *key); +static int cfg_value_check_inject_mode(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num); static int g_interger_range_array[65536]; /* һ��int�͵�����, ��ֵ�±����ֵһ��, �� g_interger_range_array[0]=0, g_interger_range_array[1]=1, �����ж���ֵ������Χ�Ϸ��� */ + static int cfg_value_check_integer_range(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num) { int i; - int raw_int_value = atoi(raw_cfg_value); - const int *integer_array = (int *)expect_range_array; + int raw_int_value; + const int *integer_array; + + if(NULL == raw_cfg_value){ + return -1; + } + + raw_int_value = atoi(raw_cfg_value); + integer_array = (int *)expect_range_array; for(i = 0; i < array_num; i++){ if(integer_array[i] == raw_int_value){ @@ -53,7 +64,13 @@ static int cfg_value_check_integer_range(const sapp_config_check_t *sapp_cfg_che static int cfg_value_check_string_range(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num) { int i; - char **string_array = (char **)expect_range_array; + char **string_array; + + if(NULL == raw_cfg_value){ + return -1; + } + + string_array = (char **)expect_range_array; for(i = 0; i < array_num; i++){ if((strncmp(string_array[i], raw_cfg_value, strlen(raw_cfg_value)) == 0) @@ -65,13 +82,27 @@ static int cfg_value_check_string_range(const sapp_config_check_t *sapp_cfg_chec return -1; } +static int cfg_value_check_string_non_null(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num) +{ + if(NULL == raw_cfg_value){ + return -1; + } + + return 0; +} + static int cfg_value_check_worker_threads(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num) { - int cfg_value = atoi(raw_cfg_value); + int cfg_value_int; + + if(NULL == raw_cfg_value){ + return -1; + } + cfg_value_int = atoi(raw_cfg_value); int cur_sys_cpu_num = get_nprocs(); - if(cfg_value <= 0 || cur_sys_cpu_num < cfg_value){ + if(cfg_value_int <= 0 || cur_sys_cpu_num < cfg_value_int){ //printf("\033[33m[Warning]sapp.toml->CPU.worker_threads=%d more than current available processors:%d\033[0m\n", sapp_global_val->config.cpu.worker_threads, cur_sys_cpu_num); //sapp_runtime_log(RLOG_LV_INFO, "[Warning]sapp.toml->CPU.worker_threads=%d more than current available processors:%d", sapp_global_val->config.cpu.worker_threads, cur_sys_cpu_num); return -1; @@ -102,7 +133,7 @@ static int cfg_value_check_bind_mask(const sapp_config_check_t *sapp_cfg_check_a } if(0 == bind_mask_array_num){ - return 0; /* ����������, ������CPU */ + return 0; /* ����������, ������CPU,������� */ } const char *raw_cfg_worker_threads_value = sapp_cfg_get_value_from_attr_by_id(sapp_cfg_check_attr, depend_cfg_id); @@ -132,7 +163,7 @@ static int cfg_value_check_stream_id_base_time(const sapp_config_check_t *sapp_c struct tm local_tm; if(NULL == raw_cfg_value || strlen(raw_cfg_value) <= 0){ - return 0; /* ����ΪNULL */ + return 0; /* ����ΪNULL,������� */ } if(strptime(raw_cfg_value, "%Y-%m-%d %H:%M:%S", &local_tm) == NULL){ @@ -149,6 +180,8 @@ static int cfg_value_check_stream_id_base_time(const sapp_config_check_t *sapp_c } + + static const char *cfg_chk_value_overlay_mode[2] = {"none", "vxlan"}; static const char *cfg_chk_value_pcap_capture_direction[3] = {"in", "out", "inout"}; static const char *cfg_chk_value_inject_pkt_mode[4] = {"sys_route", "vxlan_by_inline_device", "raw_ethernet_single_gateway", "raw_ethernet_multi_gateway"}; @@ -159,144 +192,255 @@ static const char *cfg_chk_value_pkt_dump_mode[2] = {"storage", "udp_socket"}; static const sapp_config_check_t g_sapp_cfg_check_attr[] = { - {1000,0,"SYSTEM", "instance_name", NULL, NULL, NULL, 0}, + {1000,0,RLOG_LV_INFO,"SYSTEM", "instance_name", NULL,NULL, NULL, NULL, 0}, - {2001,1,"CPU", "worker_threads", cfg_value_check_worker_threads, NULL, NULL, 0}, - {2002,0,"CPU", "send_only_threads_max", NULL, NULL, NULL, 0}, - {2003,2001,"CPU", "bind_mask", cfg_value_check_bind_mask, NULL, NULL, 0}, + {2001,1,RLOG_LV_FATAL,"CPU", "worker_threads", NULL,cfg_value_check_worker_threads, NULL, NULL, 0}, + {2002,0,RLOG_LV_DEBUG, "CPU", "send_only_threads_max", NULL,NULL, NULL, NULL, 0}, + {2003,2001,RLOG_LV_FATAL,"CPU", "bind_mask", "",cfg_value_check_bind_mask, NULL, NULL, 0}, - {3001,0,"MEM", "dictator_enable", cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, /* ֻ����0��1, ���Ծ���ǰ2��Ԫ�� */ + {3001,0, RLOG_LV_INFO,"MEM", "dictator_enable", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, /* ֻ����0��1, ���Ծ���ǰ2��Ԫ�� */ - {4000,0,"PACKET_IO", NULL, NULL, NULL, NULL, 0}, + {4000,0,RLOG_LV_DEBUG,"PACKET_IO", NULL, NULL, NULL,NULL, NULL, 0}, - {4101,1,"overlay_tunnel_definition", "l2_l3_tunnel_support", cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, - {4102,4101,"overlay_tunnel_definition", "overlay_mode", cfg_value_check_string_range, NULL, cfg_chk_value_overlay_mode, 2}, + {4101,1,RLOG_LV_INFO,"overlay_tunnel_definition", "l2_l3_tunnel_support", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, + {4102,4101,RLOG_LV_INFO,"overlay_tunnel_definition", "overlay_mode", "1",cfg_value_check_string_range, NULL, cfg_chk_value_overlay_mode, 2}, - {4201,0,"packet_io.feature", "inbound_route_dir", cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, - {4202,0,"packet_io.feature", "BSD_packet_filter", NULL, NULL, NULL, 0}, - {4203,0,"packet_io.feature", "pcap_capture_direction", cfg_value_check_string_range, NULL, cfg_chk_value_pcap_capture_direction, 3}, - {4204,0,"packet_io.feature", "inject_pkt_mode", cfg_value_check_string_range, NULL, cfg_chk_value_inject_pkt_mode, 4}, - {4205,4204,"packet_io.feature", "inject_mode_inline_device_sport", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {4206,4204,"packet_io.feature", "inject_mode_single_gateway_device", NULL, NULL, NULL, 0}, - {4207,4204,"packet_io.feature", "inject_mode_single_gateway_src_mac", NULL, NULL, NULL, 0}, - {4208,4204,"packet_io.feature", "inject_mode_single_gateway_dst_mac", NULL, NULL, NULL, 0}, - {4209,0,"packet_io.feature", "dumpfile_sleep_time_before_exit", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - - {4301,1,"packet_io.depolyment", "mode", cfg_value_check_string_range, NULL, cfg_chk_value_depolyment_mode, 3}, - {4302,1,"packet_io.internal.interface", "type", cfg_value_check_string_range, NULL, cfg_chk_value_interface_type, 2}, - {4303,1,"packet_io.internal.interface", "name", NULL, NULL, NULL, 0}, - {4304,4301,"packet_io.external.interface", "type", cfg_value_check_string_range, NULL, cfg_chk_value_interface_type, 2}, - {4305,4301,"packet_io.external.interface", "name", NULL, NULL, NULL, 0}, - {4306,0,"packet_io.polling", "enabled", cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, - {4307,0,"packet_io.polling", "polling_priority", cfg_value_check_integer_range, NULL, g_interger_range_array, 100}, - - {4401,0,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL, NULL, NULL, 0}, - {4402,0,"PROTOCOL_FEATURE", "ipv6_send_packet_enabled", NULL, NULL, NULL, 0}, - {4403,0,"PROTOCOL_FEATURE", "tcp_drop_pure_ack_pkt", NULL, NULL, NULL, 0}, - {4404,0,"PROTOCOL_FEATURE", "tcp_syn_option_parse_enabled", NULL, NULL, NULL, 0}, - {4405,0,"PROTOCOL_FEATURE", "skip_not_ip_layer_over_eth", NULL, NULL, NULL, 0}, - {4406,0,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL, NULL, NULL, 0}, - {4407,0,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL, NULL, NULL, 0}, - {4408,0,"PROTOCOL_FEATURE", "reverse_ethernet_addr", NULL, NULL, NULL, 0}, - - {4501,0,"dup_pkt.traffic.original", "original_ipv4_tcp_enabled", NULL, NULL, NULL, 0}, - {4502,0,"dup_pkt.traffic.original", "original_ipv4_udp_enabled", NULL, NULL, NULL, 0}, - {4503,0,"dup_pkt.traffic.inject", "inject_all_enabled", NULL, NULL, NULL, 0}, - {4504,0,"dup_pkt.parameters", "bloom_capacity", NULL, NULL, NULL, 0}, - {4505,0,"dup_pkt.parameters", "bloom_error_rate", NULL, NULL, NULL, 0}, - {4506,0,"dup_pkt.parameters", "bloom_timeout", NULL, NULL, NULL, 0}, - - {5001,0,"STREAM", "stream_id_base_time", cfg_value_check_stream_id_base_time, NULL, NULL, 0}, + {4201,0,RLOG_LV_INFO,"packet_io.feature", "inbound_route_dir", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, + {4202,0,RLOG_LV_DEBUG,"packet_io.feature", "BSD_packet_filter", NULL,NULL, NULL, NULL, 0}, + {4203,0,RLOG_LV_DEBUG,"packet_io.feature", "pcap_capture_direction", NULL,cfg_value_check_string_range, NULL, cfg_chk_value_pcap_capture_direction, 3}, + {4204,4301,RLOG_LV_INFO,"packet_io.feature", "inject_pkt_mode", "mirror",cfg_value_check_string_range, NULL, cfg_chk_value_inject_pkt_mode, 4}, + {4205,4204,RLOG_LV_INFO,"packet_io.feature", "inject_mode_inline_device_sport", "vxlan_by_inline_device",cfg_value_check_inject_mode, NULL, g_interger_range_array, 65535}, + {4206,4204,RLOG_LV_INFO,"packet_io.feature", "inject_mode_single_gateway_device", "raw_ethernet_single_gateway",cfg_value_check_inject_mode, NULL, NULL, 0}, + {4207,4204,RLOG_LV_INFO,"packet_io.feature", "inject_mode_single_gateway_src_mac", "raw_ethernet_single_gateway",cfg_value_check_inject_mode, NULL, NULL, 0}, + {4208,4204,RLOG_LV_INFO,"packet_io.feature", "inject_mode_single_gateway_dst_mac", "raw_ethernet_single_gateway",cfg_value_check_inject_mode, NULL, NULL, 0}, + {4209,0,RLOG_LV_DEBUG,"packet_io.feature", "dumpfile_sleep_time_before_exit", NULL, cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + + {4301,1,RLOG_LV_FATAL,"packet_io.depolyment", "mode", NULL,cfg_value_check_string_range, NULL, cfg_chk_value_depolyment_mode, 3}, + {4302,1,RLOG_LV_FATAL,"packet_io.internal.interface", "type", NULL,cfg_value_check_string_range, NULL, cfg_chk_value_interface_type, 2}, + {4303,1,RLOG_LV_FATAL,"packet_io.internal.interface", "name", NULL,cfg_value_check_string_non_null, NULL, NULL, 0}, + {4304,4301,RLOG_LV_FATAL,"packet_io.external.interface", "type", "transparent",cfg_value_check_string_range, NULL, cfg_chk_value_interface_type, 2}, + {4305,4301,RLOG_LV_FATAL,"packet_io.external.interface", "name", "transparent",cfg_value_check_string_non_null, NULL, NULL, 0}, + {4306,0,RLOG_LV_DEBUG,"packet_io.polling", "enabled", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, + {4307,0,RLOG_LV_DEBUG,"packet_io.polling", "polling_priority", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 100}, + + {4401,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL,NULL, NULL, NULL, 0}, + {4402,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "ipv6_send_packet_enabled", NULL,NULL, NULL, NULL, 0}, + {4403,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "tcp_drop_pure_ack_pkt", NULL,NULL, NULL, NULL, 0}, + {4404,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "tcp_syn_option_parse_enabled", NULL,NULL, NULL, NULL, 0}, + {4405,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "skip_not_ip_layer_over_eth", NULL,NULL, NULL, NULL, 0}, + {4406,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL,NULL, NULL, NULL, 0}, + {4407,0,RLOG_LV_DEBUG,"PROTOCOL_FEATURE", "ipv6_decapsulation_enabled", NULL,NULL, NULL, NULL, 0}, + + {4501,0,RLOG_LV_INFO,"dup_pkt.traffic.original", "original_ipv4_tcp_enabled", NULL,NULL, NULL, NULL, 0}, + {4502,0,RLOG_LV_INFO,"dup_pkt.traffic.original", "original_ipv4_udp_enabled", NULL,NULL, NULL, NULL, 0}, + {4503,0,RLOG_LV_INFO,"dup_pkt.traffic.inject", "inject_all_enabled", NULL,NULL, NULL, NULL, 0}, + {4504,0,RLOG_LV_INFO,"dup_pkt.parameters", "bloom_capacity", NULL,NULL, NULL, NULL, 0}, + {4505,0,RLOG_LV_INFO,"dup_pkt.parameters", "bloom_error_rate", NULL,NULL, NULL, NULL, 0}, + {4506,0,RLOG_LV_INFO,"dup_pkt.parameters", "bloom_timeout", NULL,NULL, NULL, NULL, 0}, + + {5001,0,RLOG_LV_INFO,"STREAM", "stream_id_base_time", NULL,cfg_value_check_stream_id_base_time, NULL, NULL, 0}, - {5101,1,"stream.tcp", "max", NULL, NULL, NULL, 0}, - {5102,1,"stream.tcp", "timeout", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {5103,1,"stream.tcp", "syn_mandatory", cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, - {5104,0,"stream.tcp", "reorder_pkt_max", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {5105,0,"stream.tcp", "analyse_option_enabled", NULL, NULL, NULL, 0}, - {5106,0,"stream.tcp", "tuple4_reuse_time_interval", NULL, NULL, NULL, 0}, - {5107,0,"stream.tcp", "meaningful_statistics_minimum_pkt", NULL, NULL, NULL, 0}, - {5108,0,"stream.tcp", "meaningful_statistics_minimum_byte", NULL, NULL, NULL, 0}, - - {5201,0,"stream.tcp.inject", "link_mss", NULL, NULL, NULL, 0}, - {5202,0,"stream.tcp.inject.rst", "auto_remedy", NULL, NULL, NULL, 0}, - {5203,5202,"stream.tcp.inject.rst", "number", cfg_value_check_integer_range, NULL, g_interger_range_array, 10}, - {5204,0,"stream.tcp.inject.rst", "signature_enabled", NULL, NULL, NULL, 0}, - {5205,5204,"stream.tcp.inject.rst", "signature_seed1", NULL, NULL, NULL, 0}, - {5206,5204,"stream.tcp.inject.rst", "signature_seed2", NULL, NULL, NULL, 0}, - {5207,5202,"stream.tcp.inject.rst", "remedy_kill_tcp_by_inline_device", NULL, NULL, NULL, 0}, - - {5301,1,"stream.udp", "max", NULL, NULL, NULL, 0}, - {5302,1,"stream.udp", "timeout", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {5303,0,"stream.udp", "meaningful_statistics_minimum_pkt", NULL, NULL, NULL, 0}, - {5304,0,"stream.udp", "meaningful_statistics_minimum_byte", NULL, NULL, NULL, 0}, - - {6000,0,"PROFILING", NULL, NULL, NULL, NULL, 0}, - {6101,0,"profiling.pkt_latency", "enabled", NULL, NULL, NULL, 0}, - {6102,6101,"profiling.pkt_latency", "threshold", NULL, NULL, NULL, 0}, - - {6201,0,"profiling.sanity_check", "raw_pkt_broken_enabled", NULL, NULL, NULL, 0}, - {6202,0,"profiling.sanity_check", "symbol_conflict_enabled", NULL, NULL, NULL, 0}, - - {6301,1,"profiling.log", "level", NULL, NULL, NULL, 0}, - {6302,0,"profiling.log", "interval", NULL, NULL, NULL, 0}, + {5101,1,RLOG_LV_FATAL,"stream.tcp", "max", NULL,NULL, NULL, NULL, 0}, + {5102,1,RLOG_LV_FATAL,"stream.tcp", "timeout", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {5103,1,RLOG_LV_FATAL,"stream.tcp", "syn_mandatory", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 2}, + {5104,1,RLOG_LV_FATAL,"stream.tcp", "reorder_pkt_max", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {5105,0,RLOG_LV_INFO,"stream.tcp", "analyse_option_enabled", NULL,NULL, NULL, NULL, 0}, + {5106,0,RLOG_LV_INFO,"stream.tcp", "tuple4_reuse_time_interval", NULL,NULL, NULL, NULL, 0}, + {5107,0,RLOG_LV_INFO,"stream.tcp", "meaningful_statistics_minimum_pkt", NULL,NULL, NULL, NULL, 0}, + {5108,0,RLOG_LV_INFO,"stream.tcp", "meaningful_statistics_minimum_byte", NULL,NULL, NULL, NULL, 0}, + + {5201,0,RLOG_LV_INFO,"stream.tcp.inject", "link_mss", NULL,NULL, NULL, NULL, 0}, + {5202,0,RLOG_LV_INFO,"stream.tcp.inject.rst", "auto_remedy", NULL,NULL, NULL, NULL, 0}, + {5203,0,RLOG_LV_INFO,"stream.tcp.inject.rst", "number", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 10}, + {5204,0,RLOG_LV_INFO,"stream.tcp.inject.rst", "signature_enabled", NULL,NULL, NULL, NULL, 0}, + {5205,5204,RLOG_LV_INFO,"stream.tcp.inject.rst", "signature_seed1", "1",NULL, NULL, NULL, 0}, + {5206,5204,RLOG_LV_INFO,"stream.tcp.inject.rst", "signature_seed2", "1",NULL, NULL, NULL, 0}, + {5207,5202,RLOG_LV_INFO,"stream.tcp.inject.rst", "remedy_kill_tcp_by_inline_device", "1",NULL, NULL, NULL, 0}, + + {5301,1,RLOG_LV_FATAL,"stream.udp", "max", NULL, NULL, NULL, NULL, 0}, + {5302,1,RLOG_LV_FATAL,"stream.udp", "timeout", NULL,cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {5303,0,RLOG_LV_INFO,"stream.udp", "meaningful_statistics_minimum_pkt", NULL,NULL, NULL, NULL, 0}, + {5304,0,RLOG_LV_INFO,"stream.udp", "meaningful_statistics_minimum_byte", NULL,NULL, NULL, NULL, 0}, + + {6000,0,RLOG_LV_DEBUG,"PROFILING", NULL,NULL, NULL, NULL, NULL, 0}, + {6101,0,RLOG_LV_DEBUG,"profiling.pkt_latency", "enabled", NULL,NULL, NULL, NULL, 0}, + {6102,6101,RLOG_LV_DEBUG,"profiling.pkt_latency", "threshold", "1",NULL, NULL, NULL, 0}, + + {6201,0,RLOG_LV_DEBUG,"profiling.sanity_check", "raw_pkt_broken_enabled", NULL,NULL, NULL, NULL, 0}, + {6202,0,RLOG_LV_DEBUG,"profiling.sanity_check", "symbol_conflict_enabled", NULL,NULL, NULL, NULL, 0}, + + {6301,1,RLOG_LV_FATAL,"profiling.log", "level", NULL,NULL, NULL, NULL, 0}, + {6302,0,RLOG_LV_INFO,"profiling.log", "interval", NULL,NULL, NULL, NULL, 0}, - {6401,0,"profiling.log.local", "enabled", NULL, NULL, NULL, 0}, - {6402,0,"profiling.log.local", "file_truncate_enabled", NULL, NULL, NULL, 0}, + {6401,0,RLOG_LV_INFO,"profiling.log.local", "enabled", NULL, NULL, NULL, 0}, + {6402,0,RLOG_LV_INFO,"profiling.log.local", "file_truncate_enabled", NULL, NULL, NULL, 0}, - {6501,0,"profiling.log.remote", "enabled", NULL, NULL, NULL, 0}, - {6502,6501,"profiling.log.remote", "server_ip", NULL, NULL, NULL, 0}, - {6503,6501,"profiling.log.remote", "server_port", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {6501,0,RLOG_LV_INFO,"profiling.log.remote", "enabled", NULL,NULL, NULL, NULL, 0}, + {6502,6501,RLOG_LV_INFO,"profiling.log.remote", "server_ip", "1",NULL, NULL, NULL, 0}, + {6503,6501,RLOG_LV_INFO,"profiling.log.remote", "server_port", "1",cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {6601,0,"profiling.log.remote.field_stat2", "metric_type", NULL, NULL, NULL, 0}, - {6602,0,"profiling.log.remote.field_stat2", "app_name", NULL, NULL, NULL, 0}, + {6601,0,RLOG_LV_INFO,"profiling.log.remote.field_stat2", "metric_type", NULL,NULL, NULL, NULL, 0}, + {6602,0,RLOG_LV_INFO,"profiling.log.remote.field_stat2", "app_name", NULL, NULL, NULL, NULL, 0}, - {6701,0,"profiling.log.prometheus", "prometheus_enabled", NULL, NULL, NULL, 0}, - {6702,6701,"profiling.log.prometheus", "prometheus_port", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {6703,6701,"profiling.log.prometheus", "prometheus_url_path", NULL, NULL, NULL, 0}, + {6701,0,RLOG_LV_INFO,"profiling.log.prometheus", "prometheus_enabled", NULL, NULL, NULL, NULL, 0}, + {6702,6701,RLOG_LV_INFO,"profiling.log.prometheus", "prometheus_port", "1",cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {6703,6701,RLOG_LV_INFO,"profiling.log.prometheus", "prometheus_url_path", "1",NULL, NULL, NULL, 0}, - {7000,0,"TOOLS", NULL, NULL, NULL, NULL, 0}, + {7000,0,RLOG_LV_DEBUG,"TOOLS", NULL, NULL, NULL, NULL, NULL, 0}, - {7101,0,"tools.pkt_dump", "enabled", NULL, NULL, NULL, 0}, - {7102,7101,"tools.pkt_dump", "mode", cfg_value_check_string_range, NULL, cfg_chk_value_pkt_dump_mode, 2}, - {7103,0,"tools.pkt_dump", "BSD_packet_filter", NULL, NULL, NULL, 0}, + {7101,0,RLOG_LV_FATAL,"tools.pkt_dump", "enabled", NULL, NULL, NULL, NULL, 0}, + {7102,7101,RLOG_LV_FATAL,"tools.pkt_dump", "mode", "1", cfg_value_check_string_range, NULL, cfg_chk_value_pkt_dump_mode, 2}, + {7103,0,RLOG_LV_DEBUG,"tools.pkt_dump", "BSD_packet_filter", NULL, NULL, NULL, NULL, 0}, - {7201,0,"tools.pkt_dump.threads", "all_threads_enabled", NULL, NULL, NULL, 0}, - {7202,0,"tools.pkt_dump.threads", "dump_thread_id", NULL, NULL, NULL, 0}, + {7201,0,RLOG_LV_DEBUG,"tools.pkt_dump.threads", "all_threads_enabled", NULL, NULL, NULL, NULL, 0}, + {7202,0,RLOG_LV_DEBUG,"tools.pkt_dump.threads", "dump_thread_id", NULL, NULL, NULL, NULL, 0}, - {7301,0,"tools.pkt_dump.udp", "command_port", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, - {7302,0,"tools.pkt_dump.udp", "pkt_dump_ratio", NULL, NULL, NULL, 0}, + {7301,7102,RLOG_LV_FATAL,"tools.pkt_dump.udp", "command_port", "udp_socket", cfg_value_check_integer_range, NULL, g_interger_range_array, 65535}, + {7302,7102,RLOG_LV_DEBUG,"tools.pkt_dump.udp", "pkt_dump_ratio", "udp_socket",NULL, NULL, NULL, 0}, - {7401,0,"tools.pkt_dump.storage", "path", NULL, NULL, NULL, 0}, - {7402,0,"tools.pkt_dump.storage", "file_size_max_per_thread", NULL, NULL, NULL, 0}, - - {8001,0,"breakpad", "disable_coredump", NULL, NULL, NULL, 0}, - {8002,0,"breakpad", "enable_breakpad", NULL, NULL, NULL, 0}, - {8003,8002,"breakpad", "breakpad_minidump_dir", NULL, NULL, NULL, 0}, - {8004,0,"breakpad", "enable_breakpad_upload", NULL, NULL, NULL, 0}, - {8005,8004,"breakpad", "breakpad_upload_url", NULL, NULL, NULL, 0}, - - {9001,1,"SECONDARY_CONFIG_LINK", "cfg_file_sapp_log", NULL, NULL, NULL, 0}, - {9002,1,"SECONDARY_CONFIG_LINK", "cfg_file_plug_list", NULL, NULL, NULL, 0}, - {9003,0,"SECONDARY_CONFIG_LINK", "cfg_file_project_list", NULL, NULL, NULL, 0}, - {9004,1,"SECONDARY_CONFIG_LINK", "cfg_file_entrylist", NULL, NULL, NULL, 0}, - {9005,0,"SECONDARY_CONFIG_LINK", "cfg_file_send_raw_pkt", NULL, NULL, NULL, 0}, - {9006,4301,"SECONDARY_CONFIG_LINK", "cfg_file_vxlan_sport_map", NULL, NULL, NULL, 0}, - {9007,4301,"SECONDARY_CONFIG_LINK", "cfg_file_inline_device", NULL, NULL, NULL, 0}, - {9008,0,"SECONDARY_CONFIG_LINK", "cfg_file_necessary_plug_list", NULL, NULL, NULL, 0}, - {9009,0,"SECONDARY_CONFIG_LINK", "cfg_file_stream_compare_layer", NULL, NULL, NULL, 0}, - {9010,4301,"SECONDARY_CONFIG_LINK", "cfg_file_vlan_flipping", NULL, NULL, NULL, 0}, - {9011,0,"SECONDARY_CONFIG_LINK", "cfg_file_asymmetric_addr_layer", NULL, NULL, NULL, 0}, + {7401,7102,RLOG_LV_FATAL,"tools.pkt_dump.storage", "path", "storage",NULL, NULL, NULL, 0}, + {7402,7102,RLOG_LV_INFO,"tools.pkt_dump.storage", "file_size_max_per_thread", "storage",NULL, NULL, NULL, 0}, + + {8001,0,RLOG_LV_DEBUG,"breakpad", "disable_coredump", NULL,NULL, NULL, NULL, 0}, + {8002,0,RLOG_LV_DEBUG,"breakpad", "enable_breakpad", NULL,NULL, NULL, NULL, 0}, + {8003,8002,RLOG_LV_DEBUG,"breakpad", "breakpad_minidump_dir", "1",NULL, NULL, NULL, 0}, + {8004,0,RLOG_LV_DEBUG,"breakpad", "enable_breakpad_upload", NULL,NULL, NULL, NULL, 0}, + {8005,8004,RLOG_LV_DEBUG,"breakpad", "breakpad_upload_url", "1",NULL, NULL, NULL, 0}, + + {9001,1,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_sapp_log", NULL,NULL, NULL, NULL, 0}, + {9002,1,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_plug_list", NULL,NULL, NULL, NULL, 0}, + {9003,0,RLOG_LV_DEBUG, "SECONDARY_CONFIG_LINK", "cfg_file_project_list", NULL,NULL, NULL, NULL, 0}, + {9004,1,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_entrylist", NULL,NULL, NULL, NULL, 0}, + {9005,0,RLOG_LV_DEBUG, "SECONDARY_CONFIG_LINK", "cfg_file_send_raw_pkt", NULL,NULL, NULL, NULL, 0}, + {9006,4301,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_vxlan_sport_map", "inline",NULL, NULL, NULL, 0}, + {9007,4301,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_inline_device", "inline",NULL, NULL, NULL, 0}, + {9008,0,RLOG_LV_DEBUG, "SECONDARY_CONFIG_LINK", "cfg_file_necessary_plug_list", NULL,NULL, NULL, NULL, 0}, + {9009,0,RLOG_LV_DEBUG, "SECONDARY_CONFIG_LINK", "cfg_file_stream_compare_layer", NULL,NULL, NULL, NULL, 0}, + {9010,4301,RLOG_LV_FATAL,"SECONDARY_CONFIG_LINK", "cfg_file_vlan_flipping", "inline",NULL, NULL, NULL, 0}, + {9011,0,RLOG_LV_DEBUG, "SECONDARY_CONFIG_LINK", "cfg_file_asymmetric_addr_layer", NULL,NULL, NULL, NULL, 0}, - {9101,1,"SECONDARY_DATA_LINK", "data_file_sysinfo_log", NULL, NULL, NULL, 0}, - {9102,6501,"SECONDARY_DATA_LINK", "data_file_field_stat_log", NULL, NULL, NULL, 0}, - {9103,4301,"SECONDARY_DATA_LINK", "data_file_inline_keepalive_log", NULL, NULL, NULL, 0}, + {9101,1,RLOG_LV_INFO,"SECONDARY_DATA_LINK", "data_file_sysinfo_log", NULL,NULL, NULL, NULL, 0}, + {9102,6501,RLOG_LV_DEBUG, "SECONDARY_DATA_LINK", "data_file_field_stat_log", "1",NULL, NULL, NULL, 0}, + {9103,4301,RLOG_LV_DEBUG, "SECONDARY_DATA_LINK", "data_file_inline_keepalive_log", "inline",NULL, NULL, NULL, 0}, + + + /* ��������ʷ���������ֹ�������, Ҳ�������,Ҳ���㲻֧��,����澯��Ϣ��ʾ���������� */ + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"overlay_tunnel_definition","stream_compare_layer_cfg_file",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"overlay_tunnel_definition","vlan_flipping_cfg_file",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"overlay_tunnel_definition","asymmetric_presence_layer_cfg_file",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"overlay_tunnel_definition","asymmetric_addr_layer_cfg_file",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"overlay_tunnel_definition","prune_inject_layer_cfg_file",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"PROTOCOL_FEATURE","treat_vlan_as_mac_in_mac",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"PROTOCOL_FEATURE","reverse_ethernet_addr",NULL, NULL, NULL,NULL, 0}, + + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"DUPLICATE_PKT","duplicate_pkt_distinguish",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"DUPLICATE_PKT","bloom_capacity",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"DUPLICATE_PKT","bloom_error_rate",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"DUPLICATE_PKT","bloom_timeout",NULL, NULL, NULL,NULL, 0}, + + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"profiling.log.local","log_file_name",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"profiling.log.local","log_conf_name",NULL, NULL, NULL,NULL, 0}, + + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"SPECIAL_CONFIG_LINK","project_list_path",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"SPECIAL_CONFIG_LINK","plugin_path",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"SPECIAL_CONFIG_LINK","entrylist_path",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"SPECIAL_CONFIG_LINK","send_raw_pkt_path",NULL, NULL, NULL,NULL, 0}, + {SAPP_CFG_OBSOLETE_FLAG,0,RLOG_LV_INFO,"SPECIAL_CONFIG_LINK","vxlan_sport_service_map_path",NULL, NULL, NULL,NULL, 0}, + - {-1,-1,NULL,NULL,NULL, NULL, NULL, 0} + {-1,-1,RLOG_LV_DEBUG,NULL,NULL,NULL, NULL, NULL,NULL, 0} }; static const int g_sapp_cfg_check_attr_num = sizeof(g_sapp_cfg_check_attr)/sizeof(sapp_config_check_t) - 1; /* ����и�������, ȫ��NULL */ + +static int cfg_get_index_by_cfg_id(int expect_cfg_id) +{ + int i; + + for(i = 0; g_sapp_cfg_check_attr[i].global_id != -1; i++){ + if(g_sapp_cfg_check_attr[i].global_id == expect_cfg_id){ + return i; + } + } + + return -1; +} + + +static int cfg_get_index_by_depend_id(int expect_depend_id) +{ + int i; + + for(i = 0; g_sapp_cfg_check_attr[i].global_id != -1; i++){ + if(g_sapp_cfg_check_attr[i].global_id == expect_depend_id){ + return i; + } + } + + return -1; +} + +static int cfg_get_index_by_key_name(const char *keyname) +{ + int i; + + for(i = 0; g_sapp_cfg_check_attr[i].global_id != -1; i++){ + if((g_sapp_cfg_check_attr[i].cfg_key != NULL) + &&(strncasecmp(g_sapp_cfg_check_attr[i].cfg_key, keyname, strlen(g_sapp_cfg_check_attr[i].cfg_key)) == 0) + &&(strncasecmp(g_sapp_cfg_check_attr[i].cfg_key, keyname, strlen(keyname)) == 0)){ + return i; + } + } + + return -1; +} + + +static int cfg_value_check_inject_mode(const sapp_config_check_t *sapp_cfg_check_attr,int this_cfg_id,int depend_cfg_id, const char *raw_cfg_value, const void *expect_range_array, int array_num) +{ + int depend_cfg_index; + const char *depend_cfg_value; + int this_cfg_index, expect_cfg_index; + + this_cfg_index = cfg_get_index_by_cfg_id(this_cfg_id); + depend_cfg_index = cfg_get_index_by_depend_id(depend_cfg_id); + depend_cfg_value = sapp_cfg_check_attr[depend_cfg_index].cfg_value; + + /* raw_cfg_value������NULL, ��ʱӦ�����ж�depend_cfg_value, �������������, ��̫�����ǿ� */ + + if(strncasecmp(depend_cfg_value, "vxlan_by_inline_device", strlen("vxlan_by_inline_device")) == 0){ + expect_cfg_index = cfg_get_index_by_key_name("inject_mode_inline_device_sport"); + if((NULL == sapp_cfg_check_attr[expect_cfg_index].cfg_value ) && (this_cfg_index == expect_cfg_index)){ + printf("\033[1;31;40m[Error]sapp.toml->inject_pkt_mode value is 'vxlan_by_inline_device', but not found '%s'!\033[0m\n", "inject_mode_inline_device_sport"); + return -1; + } + } + + if(strncasecmp(depend_cfg_value, "raw_ethernet_single_gateway", strlen("raw_ethernet_single_gateway")) == 0){ + expect_cfg_index = cfg_get_index_by_key_name("inject_mode_single_gateway_device"); + if((NULL == sapp_cfg_check_attr[expect_cfg_index].cfg_value ) && (this_cfg_index == expect_cfg_index)){ + printf("\033[1;31;40m[Error]sapp.toml->inject_pkt_mode value is 'raw_ethernet_single_gateway', but not found '%s'!\033[0m\n", "inject_mode_single_gateway_device"); + return -1; + } + + expect_cfg_index = cfg_get_index_by_key_name("inject_mode_single_gateway_src_mac"); + if((NULL == sapp_cfg_check_attr[expect_cfg_index].cfg_value ) && (this_cfg_index == expect_cfg_index)){ + printf("\033[1;31;40m[Error]sapp.toml->inject_pkt_mode value is 'raw_ethernet_single_gateway', but not found '%s'!\033[0m\n", "inject_mode_single_gateway_src_mac"); + return -1; + } + + expect_cfg_index = cfg_get_index_by_key_name("inject_mode_single_gateway_dst_mac"); + if((NULL == sapp_cfg_check_attr[expect_cfg_index].cfg_value ) && (this_cfg_index == expect_cfg_index)){ + printf("\033[1;31;40m[Error]sapp.toml->inject_pkt_mode value is 'raw_ethernet_single_gateway', but not found '%s'!\033[0m\n", "inject_mode_single_gateway_dst_mac"); + return -1; + } + } + + return 0; +} + static const char *sapp_cfg_get_value_from_attr_by_id(const sapp_config_check_t *sapp_cfg_check_attr,int cfg_global_id) { int i; @@ -337,488 +481,493 @@ static const unsigned char sample_sapp_toml[] = 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x0A,0x23,0x20,0x4E,0x4F,0x54,0x45,0x3A,0x0A,0x23,0x20,0x20,0x20, -0x20,0x54,0x68,0x65,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x20,0x6F,0x66,0x20,0x74, -0x68,0x69,0x73,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x73,0x20,0x74,0x6F,0x6D,0x6C, -0x20,0x28,0x68,0x74,0x74,0x70,0x73,0x3A,0x2F,0x2F,0x67,0x69,0x74,0x68,0x75,0x62, -0x2E,0x63,0x6F,0x6D,0x2F,0x63,0x6B,0x74,0x61,0x6E,0x2F,0x74,0x6F,0x6D,0x6C,0x63, -0x39,0x39,0x29,0x0A,0x23,0x20,0x20,0x20,0x20,0x74,0x6F,0x20,0x6D,0x61,0x6B,0x65, -0x20,0x76,0x69,0x6D,0x20,0x65,0x64,0x69,0x74,0x6F,0x72,0x20,0x64,0x69,0x73,0x70, -0x6C,0x61,0x79,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x66,0x75,0x6C,0x20,0x61,0x6E,0x64, -0x20,0x68,0x75,0x6D,0x61,0x6E,0x20,0x72,0x65,0x61,0x64,0x61,0x62,0x6C,0x65,0x2C, -0x20,0x0A,0x23,0x20,0x20,0x20,0x20,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x63, -0x72,0x65,0x61,0x74,0x65,0x20,0x61,0x20,0x73,0x79,0x6D,0x62,0x6F,0x6C,0x69,0x63, -0x20,0x6C,0x69,0x6E,0x6B,0x73,0x20,0x6E,0x61,0x6D,0x65,0x64,0x20,0x73,0x61,0x70, -0x70,0x2E,0x69,0x6E,0x69,0x20,0x74,0x6F,0x20,0x73,0x61,0x70,0x70,0x2E,0x74,0x6F, -0x6D,0x6C,0x2C,0x20,0x6C,0x6E,0x20,0x2D,0x73,0x66,0x20,0x73,0x61,0x70,0x70,0x2E, -0x74,0x6F,0x6D,0x6C,0x20,0x73,0x61,0x70,0x70,0x2E,0x69,0x6E,0x69,0x0A,0x23,0x23, +0x23,0x23,0x23,0x0A,0x23,0x20,0x4E,0x4F,0x54,0x45,0x3A,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x0A,0x23,0x20,0x20,0x20,0x20,0x54,0x68,0x65, +0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x20,0x6F,0x66,0x20,0x74,0x68,0x69,0x73,0x20, +0x66,0x69,0x6C,0x65,0x20,0x69,0x73,0x20,0x74,0x6F,0x6D,0x6C,0x20,0x28,0x68,0x74, +0x74,0x70,0x73,0x3A,0x2F,0x2F,0x67,0x69,0x74,0x68,0x75,0x62,0x2E,0x63,0x6F,0x6D, +0x2F,0x63,0x6B,0x74,0x61,0x6E,0x2F,0x74,0x6F,0x6D,0x6C,0x63,0x39,0x39,0x29,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x0A,0x23,0x20,0x20,0x20, +0x20,0x74,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x20,0x76,0x69,0x6D,0x20,0x65,0x64,0x69, +0x74,0x6F,0x72,0x20,0x64,0x69,0x73,0x70,0x6C,0x61,0x79,0x20,0x63,0x6F,0x6C,0x6F, +0x72,0x66,0x75,0x6C,0x20,0x61,0x6E,0x64,0x20,0x68,0x75,0x6D,0x61,0x6E,0x20,0x72, +0x65,0x61,0x64,0x61,0x62,0x6C,0x65,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x0A, +0x23,0x20,0x20,0x20,0x20,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x63,0x72,0x65, +0x61,0x74,0x65,0x20,0x61,0x20,0x73,0x79,0x6D,0x62,0x6F,0x6C,0x69,0x63,0x20,0x6C, +0x69,0x6E,0x6B,0x73,0x20,0x6E,0x61,0x6D,0x65,0x64,0x20,0x73,0x61,0x70,0x70,0x2E, +0x69,0x6E,0x69,0x20,0x74,0x6F,0x20,0x73,0x61,0x70,0x70,0x2E,0x74,0x6F,0x6D,0x6C, +0x2C,0x20,0x6C,0x6E,0x20,0x2D,0x73,0x66,0x20,0x73,0x61,0x70,0x70,0x2E,0x74,0x6F, +0x6D,0x6C,0x20,0x73,0x61,0x70,0x70,0x2E,0x69,0x6E,0x69,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x23,0x0A,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x0A,0x0A,0x5B,0x53,0x59,0x53,0x54,0x45,0x4D,0x5D,0x0A,0x69,0x6E,0x73,0x74, -0x61,0x6E,0x63,0x65,0x5F,0x6E,0x61,0x6D,0x65,0x20,0x3D,0x20,0x22,0x73,0x61,0x70, -0x70,0x5F,0x76,0x34,0x2E,0x32,0x22,0x0A,0x0A,0x5B,0x43,0x50,0x55,0x5D,0x0A,0x77, -0x6F,0x72,0x6B,0x65,0x72,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x73,0x3D,0x31,0x0A, -0x73,0x65,0x6E,0x64,0x5F,0x6F,0x6E,0x6C,0x79,0x5F,0x74,0x68,0x72,0x65,0x61,0x64, -0x73,0x5F,0x6D,0x61,0x78,0x3D,0x30,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65, -0x2C,0x20,0x62,0x69,0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x2C,0x20,0x69,0x66,0x20, -0x79,0x6F,0x75,0x20,0x64,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x77,0x61,0x6E,0x74,0x20, -0x74,0x6F,0x20,0x62,0x69,0x6E,0x64,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x74, -0x6F,0x20,0x73,0x70,0x65,0x63,0x69,0x61,0x6C,0x20,0x43,0x50,0x55,0x20,0x63,0x6F, -0x72,0x65,0x2C,0x20,0x6B,0x65,0x65,0x70,0x20,0x69,0x74,0x20,0x65,0x6D,0x70,0x74, -0x79,0x20,0x61,0x73,0x20,0x5B,0x5D,0x0A,0x23,0x23,0x23,0x20,0x74,0x68,0x65,0x72, -0x65,0x20,0x61,0x72,0x65,0x20,0x74,0x77,0x6F,0x20,0x64,0x69,0x66,0x66,0x65,0x72, -0x65,0x6E,0x74,0x20,0x67,0x72,0x61,0x6D,0x6D,0x61,0x72,0x73,0x3A,0x0A,0x23,0x23, -0x23,0x20,0x74,0x6F,0x6D,0x6C,0x20,0x61,0x72,0x72,0x61,0x79,0x20,0x66,0x6F,0x72, -0x6D,0x61,0x74,0x3A,0x20,0x62,0x69,0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x3D,0x5B, -0x31,0x2C,0x32,0x2C,0x33,0x2C,0x34,0x2C,0x35,0x2C,0x31,0x31,0x2C,0x31,0x32,0x2C, -0x31,0x33,0x2C,0x31,0x34,0x2C,0x31,0x35,0x5D,0x0A,0x23,0x23,0x23,0x20,0x4D,0x45, -0x53,0x41,0x5F,0x6C,0x6F,0x61,0x64,0x5F,0x70,0x72,0x6F,0x66,0x69,0x6C,0x65,0x20, -0x72,0x61,0x6E,0x67,0x65,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x62,0x69, -0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x3D,0x22,0x31,0x2D,0x35,0x2C,0x31,0x31,0x2D, -0x31,0x35,0x22,0x0A,0x62,0x69,0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x3D,0x5B,0x5D, -0x0A,0x0A,0x5B,0x4D,0x45,0x4D,0x5D,0x0A,0x64,0x69,0x63,0x74,0x61,0x74,0x6F,0x72, -0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x3D,0x31,0x0A,0x0A,0x5B,0x50,0x41,0x43,0x4B, -0x45,0x54,0x5F,0x49,0x4F,0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B,0x6F,0x76,0x65,0x72, -0x6C,0x61,0x79,0x5F,0x74,0x75,0x6E,0x6E,0x65,0x6C,0x5F,0x64,0x65,0x66,0x69,0x6E, -0x69,0x74,0x69,0x6F,0x6E,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C, -0x20,0x73,0x69,0x6E,0x63,0x65,0x20,0x32,0x30,0x32,0x30,0x2D,0x31,0x30,0x2D,0x30, -0x31,0x2C,0x20,0x4C,0x32,0x2D,0x4C,0x33,0x20,0x74,0x75,0x6E,0x6E,0x65,0x6C,0x28, -0x56,0x4C,0x41,0x4E,0x2C,0x4D,0x50,0x4C,0x53,0x2C,0x50,0x50,0x50,0x4F,0x45,0x2C, -0x65,0x74,0x63,0x2E,0x29,0x20,0x69,0x73,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73, -0x20,0x61,0x6E,0x64,0x20,0x6F,0x66,0x66,0x6C,0x6F,0x61,0x64,0x20,0x62,0x79,0x20, -0x6D,0x72,0x74,0x75,0x6E,0x6E,0x61,0x74,0x2C,0x20,0x09,0x0A,0x23,0x23,0x23,0x20, -0x61,0x66,0x74,0x65,0x72,0x20,0x32,0x30,0x32,0x30,0x2D,0x31,0x30,0x2D,0x30,0x31, -0x2C,0x20,0x73,0x61,0x70,0x70,0x20,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x20,0x4C, -0x32,0x2D,0x4C,0x33,0x20,0x74,0x75,0x6E,0x6E,0x65,0x6C,0x28,0x56,0x4C,0x41,0x4E, -0x2C,0x4D,0x50,0x4C,0x53,0x2C,0x50,0x50,0x50,0x4F,0x45,0x2C,0x65,0x74,0x63,0x2E, -0x29,0x20,0x77,0x69,0x74,0x68,0x6F,0x75,0x74,0x20,0x6D,0x72,0x74,0x75,0x6E,0x6E, -0x61,0x74,0x2E,0x0A,0x20,0x20,0x20,0x20,0x6C,0x32,0x5F,0x6C,0x33,0x5F,0x74,0x75, -0x6E,0x6E,0x65,0x6C,0x5F,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x3D,0x30,0x0A,0x0A, -0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E, -0x61,0x6C,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x69,0x73,0x20,0x5B,0x6E,0x6F,0x6E, -0x65,0x2C,0x20,0x76,0x78,0x6C,0x61,0x6E,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6F,0x76, -0x65,0x72,0x6C,0x61,0x79,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x6E,0x6F,0x6E,0x65,0x0A, -0x09,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F, -0x2E,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F, -0x74,0x65,0x2C,0x20,0x75,0x73,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x70,0x72, -0x65,0x73,0x65,0x6E,0x74,0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x20,0x6F,0x72, -0x20,0x6F,0x75,0x74,0x62,0x6F,0x75,0x6E,0x64,0x20,0x64,0x69,0x72,0x65,0x63,0x74, -0x69,0x6F,0x6E,0x20,0x76,0x61,0x6C,0x75,0x65,0x2C,0x0A,0x23,0x23,0x23,0x20,0x62, -0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x69,0x74,0x20,0x63,0x6F,0x6D,0x65,0x73,0x20, -0x66,0x72,0x6F,0x6D,0x20,0x54,0x68,0x69,0x72,0x64,0x20,0x70,0x61,0x72,0x74,0x79, -0x20,0x64,0x65,0x76,0x69,0x63,0x65,0x2C,0x20,0x73,0x6F,0x20,0x69,0x74,0x20,0x6E, -0x65,0x65,0x64,0x73,0x20,0x74,0x6F,0x20,0x62,0x65,0x20,0x73,0x70,0x65,0x63,0x69, -0x66,0x69,0x65,0x64,0x20,0x6D,0x61,0x6E,0x75,0x61,0x6C,0x6C,0x79,0x2C,0x0A,0x23, -0x23,0x23,0x20,0x69,0x66,0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F, -0x75,0x74,0x65,0x5F,0x64,0x69,0x72,0x3D,0x31,0x2C,0x20,0x74,0x68,0x65,0x6E,0x20, -0x6F,0x75,0x74,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64, -0x69,0x72,0x3D,0x30,0x2C,0x20,0x76,0x69,0x63,0x65,0x20,0x76,0x65,0x72,0x73,0x61, -0x2C,0x0A,0x23,0x23,0x23,0x20,0x69,0x6E,0x20,0x6F,0x74,0x68,0x65,0x72,0x20,0x77, -0x6F,0x72,0x64,0x73,0x2C,0x20,0x6F,0x75,0x74,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72, -0x6F,0x75,0x74,0x65,0x5F,0x64,0x69,0x72,0x20,0x3D,0x20,0x31,0x20,0x5E,0x20,0x69, -0x6E,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64,0x69,0x72, -0x3B,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F, -0x75,0x74,0x65,0x5F,0x64,0x69,0x72,0x3D,0x31,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E, -0x6F,0x74,0x65,0x2C,0x20,0x42,0x53,0x44,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F, -0x66,0x69,0x6C,0x74,0x65,0x72,0x2C,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x64, -0x6F,0x20,0x6E,0x6F,0x74,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F,0x20,0x73,0x65, -0x74,0x20,0x61,0x6E,0x79,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x20,0x72,0x75,0x6C, -0x65,0x2C,0x20,0x6B,0x65,0x65,0x70,0x20,0x69,0x74,0x20,0x65,0x6D,0x70,0x74,0x79, -0x20,0x61,0x73,0x20,0x22,0x22,0x0A,0x20,0x20,0x20,0x20,0x42,0x53,0x44,0x5F,0x70, -0x61,0x63,0x6B,0x65,0x74,0x5F,0x66,0x69,0x6C,0x74,0x65,0x72,0x3D,0x22,0x22,0x0A, -0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x73,0x61,0x6D,0x65,0x20, -0x61,0x73,0x20,0x74,0x63,0x70,0x64,0x75,0x6D,0x70,0x20,0x2D,0x51,0x2F,0x2D,0x50, -0x20,0x61,0x72,0x67,0x2C,0x20,0x70,0x6F,0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x76, -0x61,0x6C,0x75,0x65,0x73,0x20,0x61,0x72,0x65,0x20,0x60,0x69,0x6E,0x27,0x2C,0x20, -0x60,0x6F,0x75,0x74,0x27,0x20,0x61,0x6E,0x64,0x20,0x60,0x69,0x6E,0x6F,0x75,0x74, -0x27,0x2C,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20,0x69,0x73,0x20,0x22,0x69, -0x6E,0x22,0x0A,0x20,0x20,0x20,0x20,0x70,0x63,0x61,0x70,0x5F,0x63,0x61,0x70,0x74, -0x75,0x72,0x65,0x5F,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x6F,0x6E,0x3D,0x22,0x69, -0x6E,0x22,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x64,0x65, -0x70,0x6F,0x6C,0x79,0x6D,0x65,0x6E,0x74,0x2E,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x70, -0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x5B,0x73,0x79,0x73,0x5F,0x72,0x6F,0x75,0x74, -0x65,0x2C,0x20,0x76,0x78,0x6C,0x61,0x6E,0x5F,0x62,0x79,0x5F,0x69,0x6E,0x6C,0x69, -0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x2C,0x20,0x72,0x61,0x77,0x5F,0x65, -0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67, -0x61,0x74,0x65,0x77,0x61,0x79,0x2C,0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65, -0x72,0x6E,0x65,0x74,0x5F,0x6D,0x75,0x6C,0x74,0x69,0x5F,0x67,0x61,0x74,0x65,0x77, -0x61,0x79,0x5D,0x0A,0x23,0x23,0x23,0x20,0x73,0x79,0x73,0x5F,0x72,0x6F,0x75,0x74, -0x65,0x3A,0x20,0x73,0x65,0x6E,0x64,0x20,0x69,0x70,0x28,0x69,0x70,0x76,0x36,0x29, -0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x20,0x62,0x79,0x20,0x73,0x79,0x73,0x74,0x65, -0x6D,0x20,0x72,0x6F,0x75,0x74,0x65,0x20,0x74,0x61,0x62,0x6C,0x65,0x2C,0x20,0x74, -0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20,0x6D, -0x6F,0x64,0x65,0x20,0x69,0x6E,0x20,0x6D,0x69,0x72,0x72,0x6F,0x72,0x20,0x6D,0x6F, -0x64,0x65,0x3B,0x0A,0x23,0x23,0x23,0x20,0x76,0x78,0x6C,0x61,0x6E,0x5F,0x62,0x79, -0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3A,0x20, -0x65,0x6E,0x63,0x61,0x70,0x73,0x75,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E, -0x6A,0x65,0x63,0x74,0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x20,0x77,0x69,0x74,0x68, -0x20,0x76,0x78,0x6C,0x61,0x6E,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E, -0x20,0x73,0x65,0x6E,0x64,0x20,0x74,0x6F,0x20,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x20, -0x64,0x65,0x76,0x69,0x63,0x65,0x20,0x62,0x79,0x20,0x75,0x64,0x70,0x20,0x73,0x6F, -0x63,0x6B,0x65,0x74,0x2E,0x0A,0x23,0x23,0x23,0x20,0x72,0x61,0x77,0x5F,0x65,0x74, -0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61, -0x74,0x65,0x77,0x61,0x79,0x3A,0x20,0x73,0x65,0x6E,0x64,0x20,0x6C,0x61,0x79,0x65, -0x72,0x32,0x20,0x65,0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x20,0x70,0x61,0x63,0x6B, -0x65,0x74,0x20,0x74,0x6F,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x67, -0x61,0x74,0x65,0x77,0x61,0x79,0x20,0x69,0x6E,0x20,0x73,0x61,0x6D,0x65,0x20,0x62, -0x72,0x6F,0x61,0x64,0x63,0x61,0x73,0x74,0x20,0x64,0x6F,0x6D,0x61,0x69,0x6E,0x2E, -0x20,0x0A,0x23,0x23,0x23,0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E, -0x65,0x74,0x5F,0x6D,0x75,0x6C,0x74,0x69,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79, +0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x0A,0x0A,0x5B,0x53,0x59,0x53,0x54,0x45,0x4D, +0x5D,0x0A,0x09,0x69,0x6E,0x73,0x74,0x61,0x6E,0x63,0x65,0x5F,0x6E,0x61,0x6D,0x65, +0x20,0x3D,0x20,0x22,0x73,0x61,0x70,0x70,0x5F,0x76,0x34,0x2E,0x32,0x22,0x0A,0x0A, +0x5B,0x43,0x50,0x55,0x5D,0x0A,0x09,0x77,0x6F,0x72,0x6B,0x65,0x72,0x5F,0x74,0x68, +0x72,0x65,0x61,0x64,0x73,0x3D,0x31,0x0A,0x09,0x73,0x65,0x6E,0x64,0x5F,0x6F,0x6E, +0x6C,0x79,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x73,0x5F,0x6D,0x61,0x78,0x3D,0x30, +0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x62,0x69,0x6E,0x64,0x5F, +0x6D,0x61,0x73,0x6B,0x2C,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x64,0x6F,0x20, +0x6E,0x6F,0x74,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F,0x20,0x62,0x69,0x6E,0x64, +0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x74,0x6F,0x20,0x73,0x70,0x65,0x63,0x69, +0x61,0x6C,0x20,0x43,0x50,0x55,0x20,0x63,0x6F,0x72,0x65,0x2C,0x20,0x6B,0x65,0x65, +0x70,0x20,0x69,0x74,0x20,0x65,0x6D,0x70,0x74,0x79,0x20,0x61,0x73,0x20,0x5B,0x5D, +0x0A,0x23,0x23,0x23,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x74, +0x77,0x6F,0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x67,0x72,0x61, +0x6D,0x6D,0x61,0x72,0x73,0x3A,0x0A,0x23,0x23,0x23,0x20,0x74,0x6F,0x6D,0x6C,0x20, +0x61,0x72,0x72,0x61,0x79,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x62,0x69, +0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x3D,0x5B,0x31,0x2C,0x32,0x2C,0x33,0x2C,0x34, +0x2C,0x35,0x2C,0x31,0x31,0x2C,0x31,0x32,0x2C,0x31,0x33,0x2C,0x31,0x34,0x2C,0x31, +0x35,0x5D,0x0A,0x23,0x23,0x23,0x20,0x4D,0x45,0x53,0x41,0x5F,0x6C,0x6F,0x61,0x64, +0x5F,0x70,0x72,0x6F,0x66,0x69,0x6C,0x65,0x20,0x72,0x61,0x6E,0x67,0x65,0x20,0x66, +0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x62,0x69,0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B, +0x3D,0x22,0x31,0x2D,0x35,0x2C,0x31,0x31,0x2D,0x31,0x35,0x22,0x0A,0x09,0x62,0x69, +0x6E,0x64,0x5F,0x6D,0x61,0x73,0x6B,0x3D,0x5B,0x5D,0x0A,0x0A,0x5B,0x4D,0x45,0x4D, +0x5D,0x0A,0x09,0x64,0x69,0x63,0x74,0x61,0x74,0x6F,0x72,0x5F,0x65,0x6E,0x61,0x62, +0x6C,0x65,0x3D,0x31,0x0A,0x0A,0x5B,0x50,0x41,0x43,0x4B,0x45,0x54,0x5F,0x49,0x4F, +0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B,0x6F,0x76,0x65,0x72,0x6C,0x61,0x79,0x5F,0x74, +0x75,0x6E,0x6E,0x65,0x6C,0x5F,0x64,0x65,0x66,0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E, +0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x73,0x69,0x6E,0x63, +0x65,0x20,0x32,0x30,0x32,0x30,0x2D,0x31,0x30,0x2D,0x30,0x31,0x2C,0x20,0x4C,0x32, +0x2D,0x4C,0x33,0x20,0x74,0x75,0x6E,0x6E,0x65,0x6C,0x28,0x56,0x4C,0x41,0x4E,0x2C, +0x4D,0x50,0x4C,0x53,0x2C,0x50,0x50,0x50,0x4F,0x45,0x2C,0x65,0x74,0x63,0x2E,0x29, +0x20,0x69,0x73,0x20,0x70,0x72,0x6F,0x63,0x65,0x73,0x73,0x20,0x61,0x6E,0x64,0x20, +0x6F,0x66,0x66,0x6C,0x6F,0x61,0x64,0x20,0x62,0x79,0x20,0x6D,0x72,0x74,0x75,0x6E, +0x6E,0x61,0x74,0x2C,0x20,0x09,0x0A,0x23,0x23,0x23,0x20,0x61,0x66,0x74,0x65,0x72, +0x20,0x32,0x30,0x32,0x30,0x2D,0x31,0x30,0x2D,0x30,0x31,0x2C,0x20,0x73,0x61,0x70, +0x70,0x20,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x20,0x4C,0x32,0x2D,0x4C,0x33,0x20, +0x74,0x75,0x6E,0x6E,0x65,0x6C,0x28,0x56,0x4C,0x41,0x4E,0x2C,0x4D,0x50,0x4C,0x53, +0x2C,0x50,0x50,0x50,0x4F,0x45,0x2C,0x65,0x74,0x63,0x2E,0x29,0x20,0x77,0x69,0x74, +0x68,0x6F,0x75,0x74,0x20,0x6D,0x72,0x74,0x75,0x6E,0x6E,0x61,0x74,0x2E,0x0A,0x20, +0x20,0x20,0x20,0x6C,0x32,0x5F,0x6C,0x33,0x5F,0x74,0x75,0x6E,0x6E,0x65,0x6C,0x5F, +0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x3D,0x30,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E, +0x6F,0x74,0x65,0x2C,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x20,0x76,0x61, +0x6C,0x75,0x65,0x20,0x69,0x73,0x20,0x5B,0x6E,0x6F,0x6E,0x65,0x2C,0x20,0x76,0x78, +0x6C,0x61,0x6E,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6F,0x76,0x65,0x72,0x6C,0x61,0x79, +0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x6E,0x6F,0x6E,0x65,0x0A,0x09,0x0A,0x20,0x20,0x20, +0x20,0x5B,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x66,0x65,0x61,0x74, +0x75,0x72,0x65,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x75, +0x73,0x65,0x64,0x20,0x74,0x6F,0x20,0x72,0x65,0x70,0x72,0x65,0x73,0x65,0x6E,0x74, +0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x20,0x6F,0x72,0x20,0x6F,0x75,0x74,0x62, +0x6F,0x75,0x6E,0x64,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x6F,0x6E,0x20,0x76, +0x61,0x6C,0x75,0x65,0x2C,0x0A,0x23,0x23,0x23,0x20,0x62,0x65,0x63,0x61,0x75,0x73, +0x65,0x20,0x69,0x74,0x20,0x63,0x6F,0x6D,0x65,0x73,0x20,0x66,0x72,0x6F,0x6D,0x20, +0x54,0x68,0x69,0x72,0x64,0x20,0x70,0x61,0x72,0x74,0x79,0x20,0x64,0x65,0x76,0x69, +0x63,0x65,0x2C,0x20,0x73,0x6F,0x20,0x69,0x74,0x20,0x6E,0x65,0x65,0x64,0x73,0x20, +0x74,0x6F,0x20,0x62,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x65,0x64,0x20, +0x6D,0x61,0x6E,0x75,0x61,0x6C,0x6C,0x79,0x2C,0x0A,0x23,0x23,0x23,0x20,0x69,0x66, +0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64, +0x69,0x72,0x3D,0x31,0x2C,0x20,0x74,0x68,0x65,0x6E,0x20,0x6F,0x75,0x74,0x62,0x6F, +0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64,0x69,0x72,0x3D,0x30,0x2C, +0x20,0x76,0x69,0x63,0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x2C,0x0A,0x23,0x23,0x23, +0x20,0x69,0x6E,0x20,0x6F,0x74,0x68,0x65,0x72,0x20,0x77,0x6F,0x72,0x64,0x73,0x2C, +0x20,0x6F,0x75,0x74,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F, +0x64,0x69,0x72,0x20,0x3D,0x20,0x31,0x20,0x5E,0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E, +0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64,0x69,0x72,0x3B,0x0A,0x20,0x20,0x20, +0x20,0x69,0x6E,0x62,0x6F,0x75,0x6E,0x64,0x5F,0x72,0x6F,0x75,0x74,0x65,0x5F,0x64, +0x69,0x72,0x3D,0x31,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20, +0x42,0x53,0x44,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x66,0x69,0x6C,0x74,0x65, +0x72,0x2C,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x64,0x6F,0x20,0x6E,0x6F,0x74, +0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F,0x20,0x73,0x65,0x74,0x20,0x61,0x6E,0x79, +0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x20,0x72,0x75,0x6C,0x65,0x2C,0x20,0x6B,0x65, +0x65,0x70,0x20,0x69,0x74,0x20,0x65,0x6D,0x70,0x74,0x79,0x20,0x61,0x73,0x20,0x22, +0x22,0x0A,0x20,0x20,0x20,0x20,0x42,0x53,0x44,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74, +0x5F,0x66,0x69,0x6C,0x74,0x65,0x72,0x3D,0x22,0x22,0x0A,0x0A,0x23,0x23,0x23,0x20, +0x6E,0x6F,0x74,0x65,0x2C,0x20,0x73,0x61,0x6D,0x65,0x20,0x61,0x73,0x20,0x74,0x63, +0x70,0x64,0x75,0x6D,0x70,0x20,0x2D,0x51,0x2F,0x2D,0x50,0x20,0x61,0x72,0x67,0x2C, +0x20,0x70,0x6F,0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x76,0x61,0x6C,0x75,0x65,0x73, +0x20,0x61,0x72,0x65,0x20,0x60,0x69,0x6E,0x27,0x2C,0x20,0x60,0x6F,0x75,0x74,0x27, +0x20,0x61,0x6E,0x64,0x20,0x60,0x69,0x6E,0x6F,0x75,0x74,0x27,0x2C,0x20,0x64,0x65, +0x66,0x61,0x75,0x6C,0x74,0x20,0x69,0x73,0x20,0x22,0x69,0x6E,0x22,0x0A,0x20,0x20, +0x20,0x20,0x70,0x63,0x61,0x70,0x5F,0x63,0x61,0x70,0x74,0x75,0x72,0x65,0x5F,0x64, +0x69,0x72,0x65,0x63,0x74,0x69,0x6F,0x6E,0x3D,0x22,0x69,0x6E,0x22,0x0A,0x0A,0x23, +0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x64,0x65,0x70,0x6F,0x6C,0x79,0x6D, +0x65,0x6E,0x74,0x2E,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x73, +0x3A,0x20,0x5B,0x73,0x79,0x73,0x5F,0x72,0x6F,0x75,0x74,0x65,0x2C,0x20,0x76,0x78, +0x6C,0x61,0x6E,0x5F,0x62,0x79,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65, +0x76,0x69,0x63,0x65,0x2C,0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E, +0x65,0x74,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61, +0x79,0x2C,0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F, +0x6D,0x75,0x6C,0x74,0x69,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5D,0x0A,0x23, +0x23,0x23,0x20,0x73,0x79,0x73,0x5F,0x72,0x6F,0x75,0x74,0x65,0x3A,0x20,0x73,0x65, +0x6E,0x64,0x20,0x69,0x70,0x28,0x69,0x70,0x76,0x36,0x29,0x20,0x70,0x61,0x63,0x6B, +0x65,0x74,0x20,0x62,0x79,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x72,0x6F,0x75, +0x74,0x65,0x20,0x74,0x61,0x62,0x6C,0x65,0x2C,0x20,0x74,0x68,0x69,0x73,0x20,0x69, +0x73,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20,0x6D,0x6F,0x64,0x65,0x20,0x69, +0x6E,0x20,0x6D,0x69,0x72,0x72,0x6F,0x72,0x20,0x6D,0x6F,0x64,0x65,0x3B,0x0A,0x23, +0x23,0x23,0x20,0x76,0x78,0x6C,0x61,0x6E,0x5F,0x62,0x79,0x5F,0x69,0x6E,0x6C,0x69, +0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3A,0x20,0x65,0x6E,0x63,0x61,0x70, +0x73,0x75,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x20, +0x70,0x61,0x63,0x6B,0x65,0x74,0x20,0x77,0x69,0x74,0x68,0x20,0x76,0x78,0x6C,0x61, +0x6E,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E,0x20,0x73,0x65,0x6E,0x64, +0x20,0x74,0x6F,0x20,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x20,0x64,0x65,0x76,0x69,0x63, +0x65,0x20,0x62,0x79,0x20,0x75,0x64,0x70,0x20,0x73,0x6F,0x63,0x6B,0x65,0x74,0x2E, +0x0A,0x23,0x23,0x23,0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E,0x65, +0x74,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79, 0x3A,0x20,0x73,0x65,0x6E,0x64,0x20,0x6C,0x61,0x79,0x65,0x72,0x32,0x20,0x65,0x74, 0x68,0x65,0x72,0x6E,0x65,0x74,0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x20,0x74,0x6F, -0x20,0x6D,0x75,0x6C,0x74,0x69,0x70,0x6C,0x65,0x20,0x67,0x61,0x74,0x65,0x77,0x61, +0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x67,0x61,0x74,0x65,0x77,0x61, 0x79,0x20,0x69,0x6E,0x20,0x73,0x61,0x6D,0x65,0x20,0x62,0x72,0x6F,0x61,0x64,0x63, -0x61,0x73,0x74,0x20,0x64,0x6F,0x6D,0x61,0x69,0x6E,0x2E,0x20,0x0A,0x20,0x20,0x20, -0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65, -0x3D,0x73,0x79,0x73,0x5F,0x72,0x6F,0x75,0x74,0x65,0x0A,0x0A,0x23,0x23,0x23,0x20, -0x6E,0x6F,0x74,0x65,0x2C,0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69, -0x67,0x20,0x69,0x73,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x69,0x66,0x20,0x69,0x6E, -0x6A,0x65,0x63,0x74,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x3D,0x76, -0x78,0x6C,0x61,0x6E,0x5F,0x62,0x79,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64, -0x65,0x76,0x69,0x63,0x65,0x2C,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x75,0x64,0x70, -0x20,0x73,0x6F,0x63,0x6B,0x65,0x74,0x20,0x73,0x72,0x63,0x20,0x70,0x6F,0x72,0x74, -0x2E,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64, -0x65,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x5F, -0x73,0x70,0x6F,0x72,0x74,0x3D,0x35,0x34,0x37,0x38,0x39,0x0A,0x0A,0x23,0x23,0x23, -0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66, -0x69,0x67,0x20,0x69,0x73,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x69,0x66,0x20,0x69, -0x6E,0x6A,0x65,0x63,0x74,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x3D, -0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x73,0x69,0x6E, -0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x2E,0x0A,0x20,0x20,0x20, -0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E, -0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x64,0x65,0x76,0x69, -0x63,0x65,0x3D,0x22,0x65,0x74,0x68,0x31,0x22,0x0A,0x23,0x23,0x23,0x20,0x69,0x6E, -0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65, -0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x73,0x72,0x63,0x5F,0x6D,0x61,0x63, -0x20,0x68,0x61,0x73,0x20,0x6C,0x6F,0x77,0x65,0x72,0x20,0x70,0x72,0x69,0x6F,0x72, -0x69,0x74,0x79,0x20,0x74,0x68,0x61,0x6E,0x20,0x67,0x65,0x74,0x20,0x73,0x6D,0x61, -0x63,0x20,0x66,0x72,0x6F,0x6D,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F, -0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61, -0x79,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A, -0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F, -0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x73,0x72,0x63,0x5F,0x6D,0x61,0x63,0x3D, -0x22,0x30,0x30,0x3A,0x31,0x31,0x3A,0x32,0x32,0x3A,0x37,0x37,0x3A,0x38,0x38,0x3A, -0x39,0x39,0x22,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D, +0x61,0x73,0x74,0x20,0x64,0x6F,0x6D,0x61,0x69,0x6E,0x2E,0x20,0x0A,0x23,0x23,0x23, +0x20,0x72,0x61,0x77,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x6D,0x75, +0x6C,0x74,0x69,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x3A,0x20,0x73,0x65,0x6E, +0x64,0x20,0x6C,0x61,0x79,0x65,0x72,0x32,0x20,0x65,0x74,0x68,0x65,0x72,0x6E,0x65, +0x74,0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x20,0x74,0x6F,0x20,0x6D,0x75,0x6C,0x74, +0x69,0x70,0x6C,0x65,0x20,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x20,0x69,0x6E,0x20, +0x73,0x61,0x6D,0x65,0x20,0x62,0x72,0x6F,0x61,0x64,0x63,0x61,0x73,0x74,0x20,0x64, +0x6F,0x6D,0x61,0x69,0x6E,0x2E,0x20,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65, +0x63,0x74,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x73,0x79,0x73,0x5F, +0x72,0x6F,0x75,0x74,0x65,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C, +0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x69,0x73,0x20, +0x76,0x61,0x6C,0x69,0x64,0x20,0x69,0x66,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F, +0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x3D,0x76,0x78,0x6C,0x61,0x6E,0x5F, +0x62,0x79,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65, +0x2C,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x75,0x64,0x70,0x20,0x73,0x6F,0x63,0x6B, +0x65,0x74,0x20,0x73,0x72,0x63,0x20,0x70,0x6F,0x72,0x74,0x2E,0x0A,0x20,0x20,0x20, +0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x69,0x6E,0x6C, +0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x5F,0x73,0x70,0x6F,0x72,0x74, +0x3D,0x35,0x34,0x37,0x38,0x39,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65, +0x2C,0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x69,0x73, +0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x69,0x66,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74, +0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x3D,0x3D,0x72,0x61,0x77,0x5F,0x65, +0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67, +0x61,0x74,0x65,0x77,0x61,0x79,0x2E,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65, +0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67, +0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3D,0x22,0x65, +0x74,0x68,0x31,0x22,0x0A,0x23,0x23,0x23,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F, +0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65, +0x77,0x61,0x79,0x5F,0x73,0x72,0x63,0x5F,0x6D,0x61,0x63,0x20,0x68,0x61,0x73,0x20, +0x6C,0x6F,0x77,0x65,0x72,0x20,0x70,0x72,0x69,0x6F,0x72,0x69,0x74,0x79,0x20,0x74, +0x68,0x61,0x6E,0x20,0x67,0x65,0x74,0x20,0x73,0x6D,0x61,0x63,0x20,0x66,0x72,0x6F, +0x6D,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73,0x69, +0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x64,0x65,0x76, +0x69,0x63,0x65,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D, 0x6F,0x64,0x65,0x5F,0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77, -0x61,0x79,0x5F,0x64,0x73,0x74,0x5F,0x6D,0x61,0x63,0x3D,0x22,0x30,0x30,0x3A,0x31, -0x31,0x3A,0x32,0x32,0x3A,0x33,0x33,0x3A,0x34,0x34,0x3A,0x35,0x35,0x22,0x0A,0x0A, -0x20,0x20,0x20,0x20,0x64,0x75,0x6D,0x70,0x66,0x69,0x6C,0x65,0x5F,0x73,0x6C,0x65, -0x65,0x70,0x5F,0x74,0x69,0x6D,0x65,0x5F,0x62,0x65,0x66,0x6F,0x72,0x65,0x5F,0x65, -0x78,0x69,0x74,0x3D,0x33,0x0A,0x20,0x20,0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F, -0x74,0x65,0x2C,0x20,0x64,0x65,0x70,0x6F,0x6C,0x79,0x6D,0x65,0x6E,0x74,0x2E,0x6D, -0x6F,0x64,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x5B,0x6D,0x69, -0x72,0x72,0x6F,0x72,0x2C,0x20,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x2C,0x20,0x74,0x72, -0x61,0x6E,0x73,0x70,0x61,0x72,0x65,0x6E,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B, -0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x64,0x65,0x70,0x6F,0x6C,0x79, -0x6D,0x65,0x6E,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x6F,0x64,0x65,0x3D,0x6D, -0x69,0x72,0x72,0x6F,0x72,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C, -0x20,0x69,0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x2E,0x74,0x79,0x70,0x65,0x20, -0x6F,0x70,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x5B,0x70,0x61,0x67,0x2C,0x20,0x70, -0x63,0x61,0x70,0x2C,0x20,0x6D,0x61,0x72,0x73,0x69,0x6F,0x2C,0x20,0x74,0x75,0x6E, -0x5D,0x0A,0x23,0x23,0x23,0x20,0x72,0x65,0x63,0x65,0x69,0x76,0x65,0x20,0x66,0x72, -0x6F,0x6D,0x20,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x69,0x6E,0x74,0x65, +0x61,0x79,0x5F,0x73,0x72,0x63,0x5F,0x6D,0x61,0x63,0x3D,0x22,0x30,0x30,0x3A,0x31, +0x31,0x3A,0x32,0x32,0x3A,0x37,0x37,0x3A,0x38,0x38,0x3A,0x39,0x39,0x22,0x0A,0x20, +0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x6D,0x6F,0x64,0x65,0x5F,0x73, +0x69,0x6E,0x67,0x6C,0x65,0x5F,0x67,0x61,0x74,0x65,0x77,0x61,0x79,0x5F,0x64,0x73, +0x74,0x5F,0x6D,0x61,0x63,0x3D,0x22,0x30,0x30,0x3A,0x31,0x31,0x3A,0x32,0x32,0x3A, +0x33,0x33,0x3A,0x34,0x34,0x3A,0x35,0x35,0x22,0x0A,0x0A,0x20,0x20,0x20,0x20,0x64, +0x75,0x6D,0x70,0x66,0x69,0x6C,0x65,0x5F,0x73,0x6C,0x65,0x65,0x70,0x5F,0x74,0x69, +0x6D,0x65,0x5F,0x62,0x65,0x66,0x6F,0x72,0x65,0x5F,0x65,0x78,0x69,0x74,0x3D,0x30, +0x0A,0x20,0x20,0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x64, +0x65,0x70,0x6F,0x6C,0x79,0x6D,0x65,0x6E,0x74,0x2E,0x6D,0x6F,0x64,0x65,0x20,0x6F, +0x70,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x5B,0x6D,0x69,0x72,0x72,0x6F,0x72,0x2C, +0x20,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x2C,0x20,0x74,0x72,0x61,0x6E,0x73,0x70,0x61, +0x72,0x65,0x6E,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x61,0x63,0x6B,0x65, +0x74,0x5F,0x69,0x6F,0x2E,0x64,0x65,0x70,0x6F,0x6C,0x79,0x6D,0x65,0x6E,0x74,0x5D, +0x0A,0x20,0x20,0x20,0x20,0x6D,0x6F,0x64,0x65,0x3D,0x6D,0x69,0x72,0x72,0x6F,0x72, +0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x69,0x6E,0x74,0x65, +0x72,0x66,0x61,0x63,0x65,0x2E,0x74,0x79,0x70,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F, +0x6E,0x73,0x3A,0x20,0x5B,0x70,0x61,0x67,0x2C,0x20,0x70,0x63,0x61,0x70,0x2C,0x20, +0x6D,0x61,0x72,0x73,0x69,0x6F,0x2C,0x20,0x74,0x75,0x6E,0x5D,0x0A,0x23,0x23,0x23, +0x20,0x72,0x65,0x63,0x65,0x69,0x76,0x65,0x20,0x66,0x72,0x6F,0x6D,0x20,0x69,0x6E, +0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x69,0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65, +0x2C,0x20,0x72,0x6F,0x75,0x74,0x65,0x20,0x64,0x69,0x72,0x20,0x69,0x73,0x20,0x30, +0x2C,0x0A,0x23,0x23,0x23,0x20,0x72,0x65,0x63,0x65,0x69,0x76,0x65,0x20,0x66,0x72, +0x6F,0x6D,0x20,0x65,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x69,0x6E,0x74,0x65, 0x72,0x66,0x61,0x63,0x65,0x2C,0x20,0x72,0x6F,0x75,0x74,0x65,0x20,0x64,0x69,0x72, -0x20,0x69,0x73,0x20,0x30,0x2C,0x0A,0x23,0x23,0x23,0x20,0x72,0x65,0x63,0x65,0x69, -0x76,0x65,0x20,0x66,0x72,0x6F,0x6D,0x20,0x65,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C, -0x20,0x69,0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x2C,0x20,0x72,0x6F,0x75,0x74, -0x65,0x20,0x64,0x69,0x72,0x20,0x69,0x73,0x20,0x31,0x2E,0x0A,0x20,0x20,0x20,0x20, -0x5B,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x69,0x6E,0x74,0x65,0x72, -0x6E,0x61,0x6C,0x2E,0x69,0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x5D,0x0A,0x20, -0x20,0x20,0x20,0x74,0x79,0x70,0x65,0x3D,0x70,0x63,0x61,0x70,0x0A,0x20,0x20,0x20, -0x20,0x6E,0x61,0x6D,0x65,0x3D,0x22,0x6C,0x6F,0x22,0x0A,0x0A,0x20,0x20,0x20,0x20, -0x5B,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x65,0x78,0x74,0x65,0x72, -0x6E,0x61,0x6C,0x2E,0x69,0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x5D,0x0A,0x20, -0x20,0x20,0x20,0x74,0x79,0x70,0x65,0x3D,0x70,0x63,0x61,0x70,0x0A,0x20,0x20,0x20, -0x20,0x6E,0x61,0x6D,0x65,0x3D,0x6C,0x6F,0x0A,0x20,0x20,0x20,0x20,0x0A,0x20,0x20, -0x20,0x20,0x5B,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x70,0x6F,0x6C, -0x6C,0x69,0x6E,0x67,0x5D,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65, -0x64,0x3D,0x31,0x20,0x20,0x20,0x20,0x09,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74, -0x65,0x2C,0x20,0x70,0x6F,0x6C,0x6C,0x69,0x6E,0x67,0x5F,0x70,0x72,0x69,0x6F,0x72, -0x69,0x74,0x79,0x20,0x3D,0x20,0x63,0x61,0x6C,0x6C,0x20,0x73,0x61,0x70,0x70,0x5F, -0x72,0x65,0x63,0x76,0x5F,0x70,0x6B,0x74,0x20,0x65,0x76,0x65,0x72,0x79,0x20,0x63, -0x61,0x6C,0x6C,0x20,0x70,0x6F,0x6C,0x6C,0x69,0x6E,0x67,0x5F,0x65,0x6E,0x74,0x72, -0x79,0x20,0x74,0x69,0x6D,0x65,0x73,0x2C,0x20,0x20,0x20,0x20,0x20,0x0A,0x20,0x20, -0x20,0x20,0x70,0x6F,0x6C,0x6C,0x69,0x6E,0x67,0x5F,0x70,0x72,0x69,0x6F,0x72,0x69, -0x74,0x79,0x3D,0x31,0x0A,0x0A,0x5B,0x50,0x52,0x4F,0x54,0x4F,0x43,0x4F,0x4C,0x5F, -0x46,0x45,0x41,0x54,0x55,0x52,0x45,0x5D,0x0A,0x20,0x20,0x20,0x20,0x69,0x70,0x76, -0x36,0x5F,0x64,0x65,0x63,0x61,0x70,0x73,0x75,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x5F, -0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x69,0x70, -0x76,0x36,0x5F,0x73,0x65,0x6E,0x64,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x65, -0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x74,0x63,0x70, -0x5F,0x64,0x72,0x6F,0x70,0x5F,0x70,0x75,0x72,0x65,0x5F,0x61,0x63,0x6B,0x5F,0x70, -0x6B,0x74,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x74,0x63,0x70,0x5F,0x73,0x79,0x6E, -0x5F,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x5F,0x70,0x61,0x72,0x73,0x65,0x5F,0x65,0x6E, -0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x20,0x0A,0x20,0x20,0x20,0x20,0x73,0x6B,0x69, -0x70,0x5F,0x6E,0x6F,0x74,0x5F,0x69,0x70,0x5F,0x6C,0x61,0x79,0x65,0x72,0x5F,0x6F, -0x76,0x65,0x72,0x5F,0x65,0x74,0x68,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x72,0x65, -0x76,0x65,0x72,0x73,0x65,0x5F,0x65,0x74,0x68,0x65,0x72,0x6E,0x65,0x74,0x5F,0x61, -0x64,0x64,0x72,0x3D,0x31,0x0A,0x0A,0x5B,0x44,0x55,0x50,0x4C,0x49,0x43,0x41,0x54, -0x45,0x5F,0x50,0x4B,0x54,0x5D,0x0A,0x5B,0x64,0x75,0x70,0x5F,0x70,0x6B,0x74,0x2E, -0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x2E,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C, -0x5D,0x0A,0x20,0x20,0x20,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x5F,0x69, -0x70,0x76,0x34,0x5F,0x74,0x63,0x70,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D, -0x31,0x0A,0x20,0x20,0x20,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x5F,0x69, -0x70,0x76,0x34,0x5F,0x75,0x64,0x70,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D, -0x30,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x63,0x61,0x6E,0x27, -0x74,0x20,0x64,0x69,0x73,0x74,0x69,0x6E,0x67,0x75,0x69,0x73,0x68,0x20,0x62,0x65, -0x74,0x77,0x65,0x65,0x6E,0x20,0x64,0x75,0x70,0x6C,0x69,0x63,0x61,0x74,0x65,0x20, -0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x20,0x61,0x6E,0x64,0x20,0x61,0x70,0x70,0x6C, -0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x74,0x72,0x61,0x6E,0x73,0x6D, -0x69,0x74,0x20,0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x20,0x66,0x6F,0x72,0x20,0x49, -0x50,0x76,0x36,0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x73,0x2C,0x0A,0x23,0x23,0x23, -0x20,0x73,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x20, -0x49,0x50,0x76,0x36,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x64,0x75, -0x70,0x6C,0x69,0x63,0x61,0x74,0x65,0x20,0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x20, -0x63,0x68,0x65,0x63,0x6B,0x2E,0x0A,0x0A,0x5B,0x64,0x75,0x70,0x5F,0x70,0x6B,0x74, -0x2E,0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x2E,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5D, -0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x61,0x6C,0x6C,0x5F, -0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x09,0x0A,0x5B,0x64,0x75,0x70, -0x5F,0x70,0x6B,0x74,0x2E,0x70,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x5D, -0x0A,0x20,0x20,0x20,0x20,0x62,0x6C,0x6F,0x6F,0x6D,0x5F,0x63,0x61,0x70,0x61,0x63, -0x69,0x74,0x79,0x3D,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x0A,0x20,0x20,0x20,0x20, -0x62,0x6C,0x6F,0x6F,0x6D,0x5F,0x65,0x72,0x72,0x6F,0x72,0x5F,0x72,0x61,0x74,0x65, -0x3D,0x30,0x2E,0x30,0x30,0x30,0x30,0x31,0x0A,0x20,0x20,0x20,0x20,0x62,0x6C,0x6F, -0x6F,0x6D,0x5F,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D,0x31,0x30,0x0A,0x0A,0x09, -0x0A,0x5B,0x53,0x54,0x52,0x45,0x41,0x4D,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F, -0x74,0x65,0x2C,0x20,0x73,0x74,0x72,0x65,0x61,0x6D,0x5F,0x69,0x64,0x5F,0x62,0x61, -0x73,0x65,0x5F,0x74,0x69,0x6D,0x65,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x20,0x69, -0x73,0x20,0x22,0x25,0x59,0x2D,0x25,0x6D,0x2D,0x25,0x64,0x20,0x25,0x48,0x3A,0x25, -0x4D,0x3A,0x25,0x53,0x22,0x20,0x0A,0x20,0x20,0x20,0x20,0x73,0x74,0x72,0x65,0x61, -0x6D,0x5F,0x69,0x64,0x5F,0x62,0x61,0x73,0x65,0x5F,0x74,0x69,0x6D,0x65,0x3D,0x22, -0x32,0x30,0x32,0x31,0x2D,0x30,0x31,0x2D,0x30,0x31,0x20,0x30,0x30,0x3A,0x30,0x30, -0x3A,0x30,0x30,0x22,0x0A,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D, -0x2E,0x74,0x63,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x3D,0x31,0x30, -0x30,0x30,0x30,0x0A,0x20,0x20,0x20,0x20,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D, -0x36,0x30,0x0A,0x20,0x20,0x20,0x20,0x73,0x79,0x6E,0x5F,0x6D,0x61,0x6E,0x64,0x61, -0x74,0x6F,0x72,0x79,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x6F,0x72,0x64, -0x65,0x72,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x61,0x78,0x3D,0x33,0x32,0x0A,0x20,0x20, -0x20,0x20,0x61,0x6E,0x61,0x6C,0x79,0x73,0x65,0x5F,0x6F,0x70,0x74,0x69,0x6F,0x6E, -0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x74, -0x75,0x70,0x6C,0x65,0x34,0x5F,0x72,0x65,0x75,0x73,0x65,0x5F,0x74,0x69,0x6D,0x65, -0x5F,0x69,0x6E,0x74,0x65,0x72,0x76,0x61,0x6C,0x3D,0x33,0x30,0x0A,0x0A,0x20,0x20, -0x20,0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F,0x73,0x74,0x61, -0x74,0x69,0x73,0x74,0x69,0x63,0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F, -0x70,0x6B,0x74,0x3D,0x33,0x0A,0x20,0x20,0x20,0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E, -0x67,0x66,0x75,0x6C,0x5F,0x73,0x74,0x61,0x74,0x69,0x73,0x74,0x69,0x63,0x73,0x5F, -0x6D,0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F,0x62,0x79,0x74,0x65,0x3D,0x35,0x0A,0x20, -0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72, -0x65,0x61,0x6D,0x2E,0x74,0x63,0x70,0x2E,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5D,0x0A, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6C,0x69,0x6E,0x6B,0x5F,0x6D,0x73,0x73, -0x3D,0x31,0x34,0x36,0x30,0x0A,0x09,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D,0x2E,0x74,0x63,0x70,0x2E,0x69,0x6E, -0x6A,0x65,0x63,0x74,0x2E,0x72,0x73,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x61,0x75,0x74,0x6F,0x5F,0x72,0x65,0x6D,0x65,0x64,0x79,0x3D,0x31,0x0A, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x3D,0x31, -0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75, -0x72,0x65,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x5F,0x73, -0x65,0x65,0x64,0x31,0x3D,0x36,0x35,0x35,0x33,0x35,0x0A,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x5F,0x73,0x65,0x65, -0x64,0x32,0x3D,0x31,0x33,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65, -0x6D,0x65,0x64,0x79,0x5F,0x6B,0x69,0x6C,0x6C,0x5F,0x74,0x63,0x70,0x5F,0x62,0x79, -0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3D,0x30, -0x0A,0x09,0x0A,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D,0x2E,0x75, -0x64,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x3D,0x31,0x30,0x30,0x30, -0x30,0x0A,0x20,0x20,0x20,0x20,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D,0x36,0x30, -0x0A,0x20,0x20,0x20,0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F, -0x73,0x74,0x61,0x74,0x69,0x73,0x74,0x69,0x63,0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D, -0x75,0x6D,0x5F,0x70,0x6B,0x74,0x3D,0x33,0x0A,0x20,0x20,0x20,0x20,0x6D,0x65,0x61, -0x6E,0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F,0x73,0x74,0x61,0x74,0x69,0x73,0x74,0x69, -0x63,0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F,0x62,0x79,0x74,0x65,0x3D, -0x35,0x0A,0x0A,0x5B,0x50,0x52,0x4F,0x46,0x49,0x4C,0x49,0x4E,0x47,0x5D,0x0A,0x5B, -0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x70,0x6B,0x74,0x5F,0x6C,0x61, -0x74,0x65,0x6E,0x63,0x79,0x5D,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C, -0x65,0x64,0x3D,0x30,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x74, -0x68,0x72,0x65,0x73,0x68,0x6F,0x6C,0x64,0x20,0x75,0x6E,0x69,0x74,0x20,0x69,0x73, -0x20,0x6D,0x69,0x63,0x72,0x6F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x73,0x20,0x28,0x75, -0x73,0x29,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x72,0x65,0x73,0x68,0x6F,0x6C,0x64, -0x3D,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x0A,0x09,0x0A,0x20,0x20,0x20,0x20,0x5B, -0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x73,0x61,0x6E,0x69,0x74,0x79, -0x5F,0x63,0x68,0x65,0x63,0x6B,0x5D,0x0A,0x20,0x20,0x20,0x20,0x72,0x61,0x77,0x5F, -0x70,0x6B,0x74,0x5F,0x62,0x72,0x6F,0x6B,0x65,0x6E,0x5F,0x65,0x6E,0x61,0x62,0x6C, -0x65,0x64,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x73,0x79,0x6D,0x62,0x6F,0x6C,0x5F, -0x63,0x6F,0x6E,0x66,0x6C,0x69,0x63,0x74,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64, -0x3D,0x30,0x0A,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69, -0x6C,0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6C,0x65, -0x76,0x65,0x6C,0x3D,0x33,0x30,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x74,0x65,0x72, -0x76,0x61,0x6C,0x3D,0x35,0x0A,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x6C,0x6F, -0x67,0x2E,0x6C,0x6F,0x63,0x61,0x6C,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x23,0x23,0x23,0x20,0x6E, -0x6F,0x74,0x65,0x2C,0x20,0x69,0x66,0x20,0x22,0x66,0x69,0x6C,0x65,0x5F,0x74,0x72, -0x75,0x6E,0x63,0x61,0x74,0x65,0x5F,0x6F,0x70,0x65,0x6E,0x5F,0x65,0x6E,0x61,0x62, -0x6C,0x65,0x64,0x3D,0x31,0x22,0x2C,0x20,0x66,0x69,0x6C,0x65,0x20,0x77,0x69,0x6C, -0x6C,0x20,0x62,0x65,0x20,0x74,0x72,0x75,0x6E,0x63,0x61,0x74,0x65,0x64,0x2C,0x20, -0x6F,0x74,0x68,0x65,0x72,0x77,0x69,0x73,0x65,0x20,0x6F,0x70,0x65,0x6E,0x20,0x74, -0x68,0x65,0x20,0x66,0x69,0x6C,0x65,0x20,0x66,0x6F,0x72,0x20,0x61,0x70,0x70,0x65, -0x6E,0x64,0x69,0x6E,0x67,0x2E,0x09,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x66,0x69,0x6C,0x65,0x5F,0x74,0x72,0x75,0x6E,0x63,0x61,0x74,0x65,0x5F,0x65, -0x6E,0x61,0x62,0x6C,0x65,0x64,0x20,0x3D,0x20,0x31,0x0A,0x20,0x20,0x20,0x20,0x20, -0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C, -0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x2E,0x72,0x65,0x6D,0x6F,0x74,0x65,0x5D,0x0A, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D, -0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72, -0x5F,0x69,0x70,0x3D,0x22,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x31,0x31,0x2E, -0x39,0x30,0x22,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76, -0x65,0x72,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x38,0x31,0x32,0x36,0x0A,0x0A,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67, -0x2E,0x6C,0x6F,0x67,0x2E,0x72,0x65,0x6D,0x6F,0x74,0x65,0x2E,0x66,0x69,0x65,0x6C, -0x64,0x5F,0x73,0x74,0x61,0x74,0x32,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74, -0x65,0x2C,0x20,0x69,0x73,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x77,0x68,0x65,0x6E, -0x20,0x22,0x72,0x65,0x6D,0x6F,0x74,0x65,0x5F,0x73,0x65,0x6E,0x64,0x5F,0x6F,0x75, -0x74,0x5F,0x74,0x79,0x70,0x65,0x3D,0x66,0x69,0x65,0x6C,0x64,0x5F,0x73,0x74,0x61, -0x74,0x32,0x22,0x09,0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20, -0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x74,0x79,0x70,0x65,0x20,0x6F,0x70,0x74,0x69, -0x6F,0x6E,0x20,0x76,0x61,0x6C,0x75,0x65,0x3A,0x20,0x5B,0x64,0x65,0x66,0x61,0x75, -0x6C,0x74,0x2C,0x20,0x6A,0x73,0x6F,0x6E,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x74,0x79,0x70,0x65,0x20,0x3D,0x20, -0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x61,0x70,0x70,0x5F,0x6E,0x61,0x6D,0x65,0x3D,0x73,0x61,0x70,0x70,0x0A,0x0A,0x09, -0x09,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x2E, -0x70,0x72,0x6F,0x6D,0x65,0x74,0x68,0x65,0x75,0x73,0x5D,0x0A,0x09,0x09,0x70,0x72, -0x6F,0x6D,0x65,0x74,0x68,0x65,0x75,0x73,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64, -0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x65, -0x74,0x68,0x65,0x75,0x73,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x39,0x32,0x37,0x33,0x0A, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x65,0x74,0x68,0x65, -0x75,0x73,0x5F,0x75,0x72,0x6C,0x5F,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x6D,0x65, -0x74,0x72,0x69,0x63,0x73,0x22,0x0A,0x20,0x20,0x20,0x20,0x20,0x0A,0x5B,0x54,0x4F, -0x4F,0x4C,0x53,0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E, -0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E, -0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65, -0x2C,0x20,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x73,0x20,0x76, -0x61,0x6C,0x75,0x65,0x3A,0x5B,0x73,0x74,0x6F,0x72,0x61,0x67,0x65,0x2C,0x20,0x75, -0x64,0x70,0x5F,0x73,0x6F,0x63,0x6B,0x65,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D, -0x6F,0x64,0x65,0x3D,0x75,0x64,0x70,0x5F,0x73,0x6F,0x63,0x6B,0x65,0x74,0x0A,0x20, -0x20,0x20,0x20,0x42,0x53,0x44,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x66,0x69, -0x6C,0x74,0x65,0x72,0x3D,0x22,0x22,0x0A,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20, +0x20,0x69,0x73,0x20,0x31,0x2E,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x61,0x63,0x6B, +0x65,0x74,0x5F,0x69,0x6F,0x2E,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x69, +0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x5D,0x0A,0x20,0x20,0x20,0x20,0x74,0x79, +0x70,0x65,0x3D,0x70,0x63,0x61,0x70,0x0A,0x20,0x20,0x20,0x20,0x6E,0x61,0x6D,0x65, +0x3D,0x22,0x6C,0x6F,0x22,0x0A,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x61,0x63,0x6B, +0x65,0x74,0x5F,0x69,0x6F,0x2E,0x65,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x69, +0x6E,0x74,0x65,0x72,0x66,0x61,0x63,0x65,0x5D,0x0A,0x20,0x20,0x20,0x20,0x74,0x79, +0x70,0x65,0x3D,0x70,0x63,0x61,0x70,0x0A,0x20,0x20,0x20,0x20,0x6E,0x61,0x6D,0x65, +0x3D,0x6C,0x6F,0x0A,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x61, +0x63,0x6B,0x65,0x74,0x5F,0x69,0x6F,0x2E,0x70,0x6F,0x6C,0x6C,0x69,0x6E,0x67,0x5D, +0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x20,0x20, +0x20,0x20,0x09,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x70,0x6F, +0x6C,0x6C,0x69,0x6E,0x67,0x5F,0x70,0x72,0x69,0x6F,0x72,0x69,0x74,0x79,0x20,0x3D, +0x20,0x63,0x61,0x6C,0x6C,0x20,0x73,0x61,0x70,0x70,0x5F,0x72,0x65,0x63,0x76,0x5F, +0x70,0x6B,0x74,0x20,0x65,0x76,0x65,0x72,0x79,0x20,0x63,0x61,0x6C,0x6C,0x20,0x70, +0x6F,0x6C,0x6C,0x69,0x6E,0x67,0x5F,0x65,0x6E,0x74,0x72,0x79,0x20,0x74,0x69,0x6D, +0x65,0x73,0x2C,0x20,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x70,0x6F,0x6C, +0x6C,0x69,0x6E,0x67,0x5F,0x70,0x72,0x69,0x6F,0x72,0x69,0x74,0x79,0x3D,0x31,0x0A, +0x0A,0x5B,0x50,0x52,0x4F,0x54,0x4F,0x43,0x4F,0x4C,0x5F,0x46,0x45,0x41,0x54,0x55, +0x52,0x45,0x5D,0x0A,0x20,0x20,0x20,0x20,0x69,0x70,0x76,0x36,0x5F,0x64,0x65,0x63, +0x61,0x70,0x73,0x75,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x5F,0x65,0x6E,0x61,0x62,0x6C, +0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x69,0x70,0x76,0x36,0x5F,0x73,0x65, +0x6E,0x64,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65, +0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x74,0x63,0x70,0x5F,0x64,0x72,0x6F,0x70, +0x5F,0x70,0x75,0x72,0x65,0x5F,0x61,0x63,0x6B,0x5F,0x70,0x6B,0x74,0x3D,0x30,0x0A, +0x20,0x20,0x20,0x20,0x74,0x63,0x70,0x5F,0x73,0x79,0x6E,0x5F,0x6F,0x70,0x74,0x69, +0x6F,0x6E,0x5F,0x70,0x61,0x72,0x73,0x65,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64, +0x3D,0x31,0x20,0x0A,0x20,0x20,0x20,0x20,0x73,0x6B,0x69,0x70,0x5F,0x6E,0x6F,0x74, +0x5F,0x69,0x70,0x5F,0x6C,0x61,0x79,0x65,0x72,0x5F,0x6F,0x76,0x65,0x72,0x5F,0x65, +0x74,0x68,0x3D,0x30,0x0A,0x0A,0x5B,0x44,0x55,0x50,0x4C,0x49,0x43,0x41,0x54,0x45, +0x5F,0x50,0x4B,0x54,0x5D,0x0A,0x5B,0x64,0x75,0x70,0x5F,0x70,0x6B,0x74,0x2E,0x74, +0x72,0x61,0x66,0x66,0x69,0x63,0x2E,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x5D, +0x0A,0x20,0x20,0x20,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x5F,0x69,0x70, +0x76,0x34,0x5F,0x74,0x63,0x70,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31, +0x0A,0x20,0x20,0x20,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x5F,0x69,0x70, +0x76,0x34,0x5F,0x75,0x64,0x70,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x30, +0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x63,0x61,0x6E,0x27,0x74, +0x20,0x64,0x69,0x73,0x74,0x69,0x6E,0x67,0x75,0x69,0x73,0x68,0x20,0x62,0x65,0x74, +0x77,0x65,0x65,0x6E,0x20,0x64,0x75,0x70,0x6C,0x69,0x63,0x61,0x74,0x65,0x20,0x74, +0x72,0x61,0x66,0x66,0x69,0x63,0x20,0x61,0x6E,0x64,0x20,0x61,0x70,0x70,0x6C,0x69, +0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x74,0x72,0x61,0x6E,0x73,0x6D,0x69, +0x74,0x20,0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x20,0x66,0x6F,0x72,0x20,0x49,0x50, +0x76,0x36,0x20,0x70,0x61,0x63,0x6B,0x65,0x74,0x73,0x2C,0x0A,0x23,0x23,0x23,0x20, +0x73,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x73,0x75,0x70,0x70,0x6F,0x72,0x74,0x20,0x49, +0x50,0x76,0x36,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x64,0x75,0x70, +0x6C,0x69,0x63,0x61,0x74,0x65,0x20,0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x20,0x63, +0x68,0x65,0x63,0x6B,0x2E,0x0A,0x0A,0x5B,0x64,0x75,0x70,0x5F,0x70,0x6B,0x74,0x2E, +0x74,0x72,0x61,0x66,0x66,0x69,0x63,0x2E,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5D,0x0A, +0x20,0x20,0x20,0x20,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5F,0x61,0x6C,0x6C,0x5F,0x65, +0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x09,0x0A,0x5B,0x64,0x75,0x70,0x5F, +0x70,0x6B,0x74,0x2E,0x70,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x5D,0x0A, +0x20,0x20,0x20,0x20,0x62,0x6C,0x6F,0x6F,0x6D,0x5F,0x63,0x61,0x70,0x61,0x63,0x69, +0x74,0x79,0x3D,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x0A,0x20,0x20,0x20,0x20,0x62, +0x6C,0x6F,0x6F,0x6D,0x5F,0x65,0x72,0x72,0x6F,0x72,0x5F,0x72,0x61,0x74,0x65,0x3D, +0x30,0x2E,0x30,0x30,0x30,0x30,0x31,0x0A,0x20,0x20,0x20,0x20,0x62,0x6C,0x6F,0x6F, +0x6D,0x5F,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D,0x31,0x30,0x0A,0x0A,0x09,0x0A, +0x5B,0x53,0x54,0x52,0x45,0x41,0x4D,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74, +0x65,0x2C,0x20,0x73,0x74,0x72,0x65,0x61,0x6D,0x5F,0x69,0x64,0x5F,0x62,0x61,0x73, +0x65,0x5F,0x74,0x69,0x6D,0x65,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x20,0x69,0x73, +0x20,0x22,0x25,0x59,0x2D,0x25,0x6D,0x2D,0x25,0x64,0x20,0x25,0x48,0x3A,0x25,0x4D, +0x3A,0x25,0x53,0x22,0x20,0x0A,0x20,0x20,0x20,0x20,0x73,0x74,0x72,0x65,0x61,0x6D, +0x5F,0x69,0x64,0x5F,0x62,0x61,0x73,0x65,0x5F,0x74,0x69,0x6D,0x65,0x3D,0x22,0x32, +0x30,0x32,0x31,0x2D,0x30,0x31,0x2D,0x30,0x31,0x20,0x30,0x30,0x3A,0x30,0x30,0x3A, +0x30,0x30,0x22,0x0A,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D,0x2E, +0x74,0x63,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x3D,0x31,0x30,0x30, +0x30,0x30,0x0A,0x20,0x20,0x20,0x20,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D,0x36, +0x30,0x0A,0x20,0x20,0x20,0x20,0x73,0x79,0x6E,0x5F,0x6D,0x61,0x6E,0x64,0x61,0x74, +0x6F,0x72,0x79,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x6F,0x72,0x64,0x65, +0x72,0x5F,0x70,0x6B,0x74,0x5F,0x6D,0x61,0x78,0x3D,0x33,0x32,0x0A,0x20,0x20,0x20, +0x20,0x61,0x6E,0x61,0x6C,0x79,0x73,0x65,0x5F,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x5F, +0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20,0x74,0x75, +0x70,0x6C,0x65,0x34,0x5F,0x72,0x65,0x75,0x73,0x65,0x5F,0x74,0x69,0x6D,0x65,0x5F, +0x69,0x6E,0x74,0x65,0x72,0x76,0x61,0x6C,0x3D,0x33,0x30,0x0A,0x0A,0x20,0x20,0x20, +0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F,0x73,0x74,0x61,0x74, +0x69,0x73,0x74,0x69,0x63,0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F,0x70, +0x6B,0x74,0x3D,0x33,0x0A,0x20,0x20,0x20,0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E,0x67, +0x66,0x75,0x6C,0x5F,0x73,0x74,0x61,0x74,0x69,0x73,0x74,0x69,0x63,0x73,0x5F,0x6D, +0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F,0x62,0x79,0x74,0x65,0x3D,0x35,0x0A,0x20,0x20, +0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72,0x65, +0x61,0x6D,0x2E,0x74,0x63,0x70,0x2E,0x69,0x6E,0x6A,0x65,0x63,0x74,0x5D,0x0A,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6C,0x69,0x6E,0x6B,0x5F,0x6D,0x73,0x73,0x3D, +0x31,0x34,0x36,0x30,0x0A,0x09,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D,0x2E,0x74,0x63,0x70,0x2E,0x69,0x6E,0x6A, +0x65,0x63,0x74,0x2E,0x72,0x73,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x61,0x75,0x74,0x6F,0x5F,0x72,0x65,0x6D,0x65,0x64,0x79,0x3D,0x31,0x0A,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x3D,0x31,0x0A, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72, +0x65,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x5F,0x73,0x65, +0x65,0x64,0x31,0x3D,0x36,0x35,0x35,0x33,0x35,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x73,0x69,0x67,0x6E,0x61,0x74,0x75,0x72,0x65,0x5F,0x73,0x65,0x65,0x64, +0x32,0x3D,0x31,0x33,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x6D, +0x65,0x64,0x79,0x5F,0x6B,0x69,0x6C,0x6C,0x5F,0x74,0x63,0x70,0x5F,0x62,0x79,0x5F, +0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3D,0x30,0x0A, +0x09,0x0A,0x20,0x20,0x20,0x20,0x5B,0x73,0x74,0x72,0x65,0x61,0x6D,0x2E,0x75,0x64, +0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x61,0x78,0x3D,0x31,0x30,0x30,0x30,0x30, +0x0A,0x20,0x20,0x20,0x20,0x74,0x69,0x6D,0x65,0x6F,0x75,0x74,0x3D,0x36,0x30,0x0A, +0x20,0x20,0x20,0x20,0x6D,0x65,0x61,0x6E,0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F,0x73, +0x74,0x61,0x74,0x69,0x73,0x74,0x69,0x63,0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D,0x75, +0x6D,0x5F,0x70,0x6B,0x74,0x3D,0x33,0x0A,0x20,0x20,0x20,0x20,0x6D,0x65,0x61,0x6E, +0x69,0x6E,0x67,0x66,0x75,0x6C,0x5F,0x73,0x74,0x61,0x74,0x69,0x73,0x74,0x69,0x63, +0x73,0x5F,0x6D,0x69,0x6E,0x69,0x6D,0x75,0x6D,0x5F,0x62,0x79,0x74,0x65,0x3D,0x35, +0x0A,0x0A,0x5B,0x50,0x52,0x4F,0x46,0x49,0x4C,0x49,0x4E,0x47,0x5D,0x0A,0x5B,0x70, +0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x70,0x6B,0x74,0x5F,0x6C,0x61,0x74, +0x65,0x6E,0x63,0x79,0x5D,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65, +0x64,0x3D,0x30,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x74,0x68, +0x72,0x65,0x73,0x68,0x6F,0x6C,0x64,0x20,0x75,0x6E,0x69,0x74,0x20,0x69,0x73,0x20, +0x6D,0x69,0x63,0x72,0x6F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x73,0x20,0x28,0x75,0x73, +0x29,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x72,0x65,0x73,0x68,0x6F,0x6C,0x64,0x3D, +0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x0A,0x09,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70, +0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x73,0x61,0x6E,0x69,0x74,0x79,0x5F, +0x63,0x68,0x65,0x63,0x6B,0x5D,0x0A,0x20,0x20,0x20,0x20,0x72,0x61,0x77,0x5F,0x70, +0x6B,0x74,0x5F,0x62,0x72,0x6F,0x6B,0x65,0x6E,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65, +0x64,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x73,0x79,0x6D,0x62,0x6F,0x6C,0x5F,0x63, +0x6F,0x6E,0x66,0x6C,0x69,0x63,0x74,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D, +0x30,0x0A,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C, +0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6C,0x65,0x76, +0x65,0x6C,0x3D,0x32,0x30,0x0A,0x20,0x20,0x20,0x20,0x69,0x6E,0x74,0x65,0x72,0x76, +0x61,0x6C,0x3D,0x35,0x0A,0x20,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67, +0x2E,0x6C,0x6F,0x63,0x61,0x6C,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F, +0x74,0x65,0x2C,0x20,0x69,0x66,0x20,0x22,0x66,0x69,0x6C,0x65,0x5F,0x74,0x72,0x75, +0x6E,0x63,0x61,0x74,0x65,0x5F,0x6F,0x70,0x65,0x6E,0x5F,0x65,0x6E,0x61,0x62,0x6C, +0x65,0x64,0x3D,0x31,0x22,0x2C,0x20,0x66,0x69,0x6C,0x65,0x20,0x77,0x69,0x6C,0x6C, +0x20,0x62,0x65,0x20,0x74,0x72,0x75,0x6E,0x63,0x61,0x74,0x65,0x64,0x2C,0x20,0x6F, +0x74,0x68,0x65,0x72,0x77,0x69,0x73,0x65,0x20,0x6F,0x70,0x65,0x6E,0x20,0x74,0x68, +0x65,0x20,0x66,0x69,0x6C,0x65,0x20,0x66,0x6F,0x72,0x20,0x61,0x70,0x70,0x65,0x6E, +0x64,0x69,0x6E,0x67,0x2E,0x09,0x20,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x66,0x69,0x6C,0x65,0x5F,0x74,0x72,0x75,0x6E,0x63,0x61,0x74,0x65,0x5F,0x65,0x6E, +0x61,0x62,0x6C,0x65,0x64,0x20,0x3D,0x20,0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x0A, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69, +0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x2E,0x72,0x65,0x6D,0x6F,0x74,0x65,0x5D,0x0A,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31, +0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72,0x5F, +0x69,0x70,0x3D,0x22,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x31,0x31,0x2E,0x39, +0x30,0x22,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65, +0x72,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x38,0x31,0x32,0x36,0x0A,0x0A,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E, +0x6C,0x6F,0x67,0x2E,0x72,0x65,0x6D,0x6F,0x74,0x65,0x2E,0x66,0x69,0x65,0x6C,0x64, +0x5F,0x73,0x74,0x61,0x74,0x32,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65, +0x2C,0x20,0x69,0x73,0x20,0x76,0x61,0x6C,0x69,0x64,0x20,0x77,0x68,0x65,0x6E,0x20, +0x22,0x72,0x65,0x6D,0x6F,0x74,0x65,0x5F,0x73,0x65,0x6E,0x64,0x5F,0x6F,0x75,0x74, +0x5F,0x74,0x79,0x70,0x65,0x3D,0x66,0x69,0x65,0x6C,0x64,0x5F,0x73,0x74,0x61,0x74, +0x32,0x22,0x09,0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x6D, +0x65,0x74,0x72,0x69,0x63,0x5F,0x74,0x79,0x70,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F, +0x6E,0x20,0x76,0x61,0x6C,0x75,0x65,0x3A,0x20,0x5B,0x64,0x65,0x66,0x61,0x75,0x6C, +0x74,0x2C,0x20,0x6A,0x73,0x6F,0x6E,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x74,0x79,0x70,0x65,0x20,0x3D,0x20,0x64, +0x65,0x66,0x61,0x75,0x6C,0x74,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61, +0x70,0x70,0x5F,0x6E,0x61,0x6D,0x65,0x3D,0x73,0x61,0x70,0x70,0x0A,0x0A,0x09,0x09, +0x5B,0x70,0x72,0x6F,0x66,0x69,0x6C,0x69,0x6E,0x67,0x2E,0x6C,0x6F,0x67,0x2E,0x70, +0x72,0x6F,0x6D,0x65,0x74,0x68,0x65,0x75,0x73,0x5D,0x0A,0x09,0x09,0x70,0x72,0x6F, +0x6D,0x65,0x74,0x68,0x65,0x75,0x73,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D, +0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x65,0x74, +0x68,0x65,0x75,0x73,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x39,0x32,0x37,0x33,0x0A,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x65,0x74,0x68,0x65,0x75, +0x73,0x5F,0x75,0x72,0x6C,0x5F,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x6D,0x65,0x74, +0x72,0x69,0x63,0x73,0x22,0x0A,0x20,0x20,0x20,0x20,0x20,0x0A,0x5B,0x54,0x4F,0x4F, +0x4C,0x53,0x5D,0x0A,0x20,0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E,0x70, +0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61, +0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C, +0x20,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x70,0x74,0x69,0x6F,0x6E,0x73,0x20,0x76,0x61, +0x6C,0x75,0x65,0x3A,0x5B,0x73,0x74,0x6F,0x72,0x61,0x67,0x65,0x2C,0x20,0x75,0x64, +0x70,0x5F,0x73,0x6F,0x63,0x6B,0x65,0x74,0x5D,0x0A,0x20,0x20,0x20,0x20,0x6D,0x6F, +0x64,0x65,0x3D,0x75,0x64,0x70,0x5F,0x73,0x6F,0x63,0x6B,0x65,0x74,0x0A,0x20,0x20, +0x20,0x20,0x42,0x53,0x44,0x5F,0x70,0x61,0x63,0x6B,0x65,0x74,0x5F,0x66,0x69,0x6C, +0x74,0x65,0x72,0x3D,0x22,0x22,0x0A,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E,0x70,0x6B,0x74,0x5F,0x64,0x75, +0x6D,0x70,0x2E,0x74,0x68,0x72,0x65,0x61,0x64,0x73,0x5D,0x0A,0x23,0x23,0x23,0x20, +0x6E,0x6F,0x74,0x65,0x2C,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E, +0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x70,0x6B,0x74,0x20,0x64,0x75,0x6D, +0x70,0x20,0x69,0x6E,0x20,0x61,0x6C,0x6C,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x2C, +0x20,0x73,0x65,0x74,0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64, +0x5F,0x61,0x6C,0x6C,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x2C,0x20, +0x74,0x68,0x65,0x6E,0x20,0x27,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61, +0x64,0x5F,0x69,0x64,0x27,0x20,0x69,0x73,0x20,0x6F,0x62,0x73,0x6F,0x6C,0x65,0x74, +0x65,0x64,0x2E,0x0A,0x23,0x23,0x23,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, +0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x61,0x6C,0x6C, +0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x30,0x2C,0x20,0x74,0x68,0x65,0x6E, +0x20,0x75,0x73,0x65,0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64, +0x5F,0x69,0x64,0x20,0x74,0x6F,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x79,0x20,0x73, +0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x65, +0x64,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x69,0x6E,0x64,0x65,0x78,0x2E,0x0A, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x6C,0x6C,0x5F,0x74,0x68,0x72,0x65, +0x61,0x64,0x73,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20,0x20, +0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x64,0x75,0x6D,0x70, +0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x69,0x64,0x20,0x73,0x74,0x61,0x72,0x74, +0x20,0x66,0x72,0x6F,0x6D,0x20,0x30,0x2C,0x20,0x6D,0x61,0x78,0x20,0x69,0x73,0x20, +0x43,0x50,0x55,0x2E,0x77,0x6F,0x72,0x6B,0x65,0x72,0x5F,0x74,0x68,0x72,0x65,0x61, +0x64,0x73,0x2D,0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x75,0x6D, +0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x69,0x64,0x3D,0x5B,0x30,0x2C,0x31, +0x2C,0x32,0x2C,0x33,0x2C,0x34,0x5D,0x0A,0x20,0x20,0x20,0x0A,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E,0x70,0x6B,0x74,0x5F,0x64, -0x75,0x6D,0x70,0x2E,0x74,0x68,0x72,0x65,0x61,0x64,0x73,0x5D,0x0A,0x23,0x23,0x23, -0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x77,0x61, -0x6E,0x74,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x70,0x6B,0x74,0x20,0x64,0x75, -0x6D,0x70,0x20,0x69,0x6E,0x20,0x61,0x6C,0x6C,0x20,0x74,0x68,0x72,0x65,0x61,0x64, -0x2C,0x20,0x73,0x65,0x74,0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61, -0x64,0x5F,0x61,0x6C,0x6C,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x2C, -0x20,0x74,0x68,0x65,0x6E,0x20,0x27,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65, -0x61,0x64,0x5F,0x69,0x64,0x27,0x20,0x69,0x73,0x20,0x6F,0x62,0x73,0x6F,0x6C,0x65, -0x74,0x65,0x64,0x2E,0x0A,0x23,0x23,0x23,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69, -0x66,0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x61,0x6C, -0x6C,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x30,0x2C,0x20,0x74,0x68,0x65, -0x6E,0x20,0x75,0x73,0x65,0x20,0x64,0x75,0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61, -0x64,0x5F,0x69,0x64,0x20,0x74,0x6F,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x79,0x20, -0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69, -0x65,0x64,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x69,0x6E,0x64,0x65,0x78,0x2E, -0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x6C,0x6C,0x5F,0x74,0x68,0x72, -0x65,0x61,0x64,0x73,0x5F,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x3D,0x31,0x0A,0x20, -0x20,0x20,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x64,0x75,0x6D, -0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x69,0x64,0x20,0x73,0x74,0x61,0x72, -0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x30,0x2C,0x20,0x6D,0x61,0x78,0x20,0x69,0x73, -0x20,0x43,0x50,0x55,0x2E,0x77,0x6F,0x72,0x6B,0x65,0x72,0x5F,0x74,0x68,0x72,0x65, -0x61,0x64,0x73,0x2D,0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x75, -0x6D,0x70,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x5F,0x69,0x64,0x3D,0x5B,0x30,0x2C, -0x31,0x2C,0x32,0x2C,0x33,0x2C,0x34,0x5D,0x0A,0x20,0x20,0x20,0x0A,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E,0x70,0x6B,0x74,0x5F, -0x64,0x75,0x6D,0x70,0x2E,0x75,0x64,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x63,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x31, -0x32,0x33,0x34,0x35,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5B,0x74, -0x6F,0x6F,0x6C,0x73,0x2E,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x2E,0x73,0x74, -0x6F,0x72,0x61,0x67,0x65,0x5D,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C, -0x20,0x66,0x69,0x6C,0x65,0x20,0x70,0x61,0x74,0x68,0x20,0x6D,0x75,0x73,0x74,0x20, -0x62,0x65,0x20,0x64,0x6F,0x75,0x62,0x6C,0x65,0x20,0x71,0x75,0x6F,0x74,0x61,0x74, -0x69,0x6F,0x6E,0x20,0x6D,0x61,0x72,0x6B,0x20,0x65,0x78,0x74,0x65,0x6E,0x73,0x69, -0x6F,0x6E,0x2C,0x20,0x66,0x6F,0x72,0x20,0x65,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2C, -0x20,0x20,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x64,0x65,0x76,0x2F,0x73,0x68,0x6D, -0x2F,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x22,0x0A,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x64,0x65,0x76,0x2F,0x73,0x68, -0x6D,0x2F,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x22,0x0A,0x23,0x23,0x23,0x20, -0x6E,0x6F,0x74,0x65,0x2C,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x69,0x7A,0x65,0x20, -0x75,0x6E,0x69,0x74,0x3A,0x20,0x4D,0x42,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x66,0x69,0x6C,0x65,0x5F,0x73,0x69,0x7A,0x65,0x5F,0x6D,0x61,0x78,0x5F,0x70, -0x65,0x72,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x3D,0x31,0x30,0x30,0x30,0x30,0x20, -0x0A,0x0A,0x5B,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x5D,0x0A,0x20,0x20,0x20, -0x20,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x5F,0x63,0x6F,0x72,0x65,0x64,0x75,0x6D, -0x70,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x5F,0x62, -0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x62,0x72, -0x65,0x61,0x6B,0x70,0x61,0x64,0x5F,0x6D,0x69,0x6E,0x69,0x64,0x75,0x6D,0x70,0x5F, -0x64,0x69,0x72,0x3D,0x22,0x2F,0x74,0x6D,0x70,0x2F,0x63,0x72,0x61,0x73,0x68,0x72, -0x65,0x70,0x6F,0x72,0x74,0x22,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61,0x62,0x6C, -0x65,0x5F,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x5F,0x75,0x70,0x6C,0x6F,0x61, -0x64,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64, -0x5F,0x75,0x70,0x6C,0x6F,0x61,0x64,0x5F,0x75,0x72,0x6C,0x3D,0x22,0x68,0x74,0x74, -0x70,0x3A,0x2F,0x2F,0x31,0x32,0x37,0x2E,0x30,0x2E,0x30,0x2E,0x31,0x2F,0x22,0x0A, -0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x3A,0x0A,0x23,0x23,0x23,0x20, -0x54,0x68,0x65,0x73,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74, -0x69,0x6F,0x6E,0x73,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74,0x20,0x69,0x73,0x20,0x63, -0x6F,0x6D,0x70,0x6C,0x65,0x78,0x20,0x61,0x6E,0x64,0x20,0x64,0x69,0x66,0x66,0x69, -0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x64,0x65,0x73,0x63,0x72,0x69,0x62,0x65, -0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x6F,0x6D,0x6C,0x20,0x67,0x72,0x61,0x6D,0x6D, -0x61,0x72,0x2C,0x0A,0x23,0x23,0x23,0x20,0x73,0x6F,0x2C,0x20,0x63,0x72,0x65,0x61, -0x74,0x65,0x20,0x61,0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74, -0x20,0x73,0x65,0x63,0x6F,0x6E,0x64,0x61,0x72,0x79,0x20,0x63,0x6F,0x6E,0x66,0x69, -0x67,0x20,0x66,0x69,0x6C,0x65,0x20,0x74,0x6F,0x20,0x64,0x65,0x73,0x63,0x72,0x69, -0x70,0x74,0x69,0x6F,0x6E,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x69, -0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2E,0x0A,0x23,0x23,0x23,0x20, -0x72,0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x20,0x70,0x61,0x74,0x68,0x2C,0x20,0x77, -0x69,0x6C,0x6C,0x20,0x61,0x64,0x64,0x20,0x70,0x72,0x65,0x66,0x69,0x78,0x20,0x77, -0x69,0x74,0x68,0x20,0x63,0x6D,0x64,0x20,0x61,0x72,0x67,0x73,0x20,0x2D,0x2D,0x63, -0x6F,0x6E,0x66,0x69,0x67,0x2D,0x72,0x6F,0x6F,0x74,0x2D,0x64,0x69,0x72,0x2C,0x20, -0x75,0x73,0x65,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20,0x2E,0x2F,0x65,0x74, -0x63,0x2F,0x20,0x77,0x69,0x74,0x68,0x6F,0x75,0x74,0x20,0x2D,0x2D,0x63,0x6F,0x6E, -0x66,0x69,0x67,0x2D,0x72,0x6F,0x6F,0x74,0x2D,0x64,0x69,0x72,0x20,0x61,0x72,0x67, -0x73,0x2E,0x0A,0x0A,0x5B,0x53,0x45,0x43,0x4F,0x4E,0x44,0x41,0x52,0x59,0x5F,0x43, -0x4F,0x4E,0x46,0x49,0x47,0x5F,0x4C,0x49,0x4E,0x4B,0x5D,0x09,0x20,0x0A,0x09,0x63, -0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x73,0x61,0x70,0x70,0x5F,0x6C,0x6F,0x67, -0x3D,0x22,0x65,0x74,0x63,0x2F,0x73,0x61,0x70,0x70,0x5F,0x6C,0x6F,0x67,0x2E,0x63, -0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x70, -0x6C,0x75,0x67,0x5F,0x6C,0x69,0x73,0x74,0x3D,0x22,0x70,0x6C,0x75,0x67,0x2F,0x63, -0x6F,0x6E,0x66,0x6C,0x69,0x73,0x74,0x2E,0x69,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66, -0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x70,0x72,0x6F,0x6A,0x65,0x63,0x74,0x5F,0x6C, -0x69,0x73,0x74,0x3D,0x22,0x65,0x74,0x63,0x2F,0x70,0x72,0x6F,0x6A,0x65,0x63,0x74, -0x5F,0x6C,0x69,0x73,0x74,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67, -0x5F,0x66,0x69,0x6C,0x65,0x5F,0x65,0x6E,0x74,0x72,0x79,0x6C,0x69,0x73,0x74,0x3D, -0x22,0x65,0x74,0x63,0x2F,0x65,0x6E,0x74,0x72,0x79,0x6C,0x69,0x73,0x74,0x2E,0x63, -0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x73, -0x65,0x6E,0x64,0x5F,0x72,0x61,0x77,0x5F,0x70,0x6B,0x74,0x3D,0x22,0x65,0x74,0x63, -0x2F,0x73,0x65,0x6E,0x64,0x5F,0x72,0x61,0x77,0x5F,0x70,0x6B,0x74,0x2E,0x63,0x6F, -0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x76,0x78, -0x6C,0x61,0x6E,0x5F,0x73,0x70,0x6F,0x72,0x74,0x5F,0x6D,0x61,0x70,0x3D,0x22,0x65, -0x74,0x63,0x2F,0x76,0x78,0x6C,0x61,0x6E,0x5F,0x73,0x70,0x6F,0x72,0x74,0x5F,0x73, -0x65,0x72,0x76,0x69,0x63,0x65,0x5F,0x6D,0x61,0x70,0x2E,0x63,0x6F,0x6E,0x66,0x22, -0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x69,0x6E,0x6C,0x69,0x6E, -0x65,0x5F,0x64,0x65,0x76,0x69,0x63,0x65,0x3D,0x22,0x65,0x74,0x63,0x2F,0x67,0x64, -0x65,0x76,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69, -0x6C,0x65,0x5F,0x6E,0x65,0x63,0x65,0x73,0x73,0x61,0x72,0x79,0x5F,0x70,0x6C,0x75, -0x67,0x5F,0x6C,0x69,0x73,0x74,0x3D,0x22,0x65,0x74,0x63,0x2F,0x6E,0x65,0x63,0x65, -0x73,0x73,0x61,0x72,0x79,0x5F,0x70,0x6C,0x75,0x67,0x5F,0x6C,0x69,0x73,0x74,0x2E, -0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F, -0x73,0x74,0x72,0x65,0x61,0x6D,0x5F,0x63,0x6F,0x6D,0x70,0x61,0x72,0x65,0x5F,0x6C, -0x61,0x79,0x65,0x72,0x3D,0x22,0x65,0x74,0x63,0x2F,0x73,0x74,0x72,0x65,0x61,0x6D, -0x5F,0x63,0x6F,0x6D,0x70,0x61,0x72,0x65,0x5F,0x6C,0x61,0x79,0x65,0x72,0x2E,0x63, -0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x76, -0x6C,0x61,0x6E,0x5F,0x66,0x6C,0x69,0x70,0x70,0x69,0x6E,0x67,0x3D,0x22,0x65,0x74, -0x63,0x2F,0x76,0x6C,0x61,0x6E,0x5F,0x66,0x6C,0x69,0x70,0x70,0x69,0x6E,0x67,0x5F, -0x6D,0x61,0x70,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66, -0x69,0x6C,0x65,0x5F,0x61,0x73,0x79,0x6D,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x61, -0x64,0x64,0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x3D,0x22,0x65,0x74,0x63,0x2F,0x61, -0x73,0x79,0x6D,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x61,0x64,0x64,0x72,0x5F,0x6C, -0x61,0x79,0x65,0x72,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x0A,0x5B,0x53,0x45,0x43, -0x4F,0x4E,0x44,0x41,0x52,0x59,0x5F,0x44,0x41,0x54,0x41,0x5F,0x4C,0x49,0x4E,0x4B, -0x5D,0x09,0x20,0x0A,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x61,0x5F,0x66,0x69,0x6C, -0x65,0x5F,0x73,0x79,0x73,0x69,0x6E,0x66,0x6F,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x73, -0x79,0x73,0x69,0x6E,0x66,0x6F,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x20,0x20,0x20,0x20, -0x64,0x61,0x74,0x61,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x66,0x69,0x65,0x6C,0x64,0x5F, -0x73,0x74,0x61,0x74,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x66,0x73,0x32,0x5F,0x73,0x79, -0x73,0x69,0x6E,0x66,0x6F,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x20,0x20,0x20,0x20,0x64, -0x61,0x74,0x61,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F, -0x6B,0x65,0x65,0x70,0x61,0x6C,0x69,0x76,0x65,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x67, -0x64,0x65,0x76,0x5F,0x6B,0x65,0x65,0x70,0x6C,0x69,0x76,0x65,0x5F,0x73,0x74,0x61, -0x74,0x75,0x73,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x0A +0x75,0x6D,0x70,0x2E,0x75,0x64,0x70,0x5D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x63,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x5F,0x70,0x6F,0x72,0x74,0x3D,0x31,0x32, +0x33,0x34,0x35,0x0A,0x09,0x09,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x5F,0x72, +0x61,0x74,0x69,0x6F,0x3D,0x33,0x30,0x0A,0x09,0x09,0x0A,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x5B,0x74,0x6F,0x6F,0x6C,0x73,0x2E,0x70,0x6B,0x74,0x5F,0x64,0x75, +0x6D,0x70,0x2E,0x73,0x74,0x6F,0x72,0x61,0x67,0x65,0x5D,0x0A,0x23,0x23,0x23,0x20, +0x6E,0x6F,0x74,0x65,0x2C,0x20,0x66,0x69,0x6C,0x65,0x20,0x70,0x61,0x74,0x68,0x20, +0x6D,0x75,0x73,0x74,0x20,0x62,0x65,0x20,0x64,0x6F,0x75,0x62,0x6C,0x65,0x20,0x71, +0x75,0x6F,0x74,0x61,0x74,0x69,0x6F,0x6E,0x20,0x6D,0x61,0x72,0x6B,0x20,0x65,0x78, +0x74,0x65,0x6E,0x73,0x69,0x6F,0x6E,0x2C,0x20,0x66,0x6F,0x72,0x20,0x65,0x78,0x61, +0x6D,0x70,0x6C,0x65,0x2C,0x20,0x20,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x64,0x65, +0x76,0x2F,0x73,0x68,0x6D,0x2F,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x22,0x0A, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x74,0x68,0x3D,0x22,0x2F,0x64, +0x65,0x76,0x2F,0x73,0x68,0x6D,0x2F,0x70,0x6B,0x74,0x5F,0x64,0x75,0x6D,0x70,0x22, +0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x2C,0x20,0x66,0x69,0x6C,0x65,0x20, +0x73,0x69,0x7A,0x65,0x20,0x75,0x6E,0x69,0x74,0x3A,0x20,0x4D,0x42,0x0A,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x69,0x6C,0x65,0x5F,0x73,0x69,0x7A,0x65,0x5F, +0x6D,0x61,0x78,0x5F,0x70,0x65,0x72,0x5F,0x74,0x68,0x72,0x65,0x61,0x64,0x3D,0x31, +0x30,0x30,0x30,0x30,0x20,0x0A,0x0A,0x5B,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64, +0x5D,0x0A,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x5F,0x63,0x6F, +0x72,0x65,0x64,0x75,0x6D,0x70,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x65,0x6E,0x61, +0x62,0x6C,0x65,0x5F,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x3D,0x30,0x0A,0x20, +0x20,0x20,0x20,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x5F,0x6D,0x69,0x6E,0x69, +0x64,0x75,0x6D,0x70,0x5F,0x64,0x69,0x72,0x3D,0x22,0x2F,0x74,0x6D,0x70,0x2F,0x63, +0x72,0x61,0x73,0x68,0x72,0x65,0x70,0x6F,0x72,0x74,0x22,0x0A,0x20,0x20,0x20,0x20, +0x65,0x6E,0x61,0x62,0x6C,0x65,0x5F,0x62,0x72,0x65,0x61,0x6B,0x70,0x61,0x64,0x5F, +0x75,0x70,0x6C,0x6F,0x61,0x64,0x3D,0x30,0x0A,0x20,0x20,0x20,0x20,0x62,0x72,0x65, +0x61,0x6B,0x70,0x61,0x64,0x5F,0x75,0x70,0x6C,0x6F,0x61,0x64,0x5F,0x75,0x72,0x6C, +0x3D,0x22,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x31,0x32,0x37,0x2E,0x30,0x2E,0x30, +0x2E,0x31,0x2F,0x22,0x0A,0x0A,0x0A,0x23,0x23,0x23,0x20,0x6E,0x6F,0x74,0x65,0x3A, +0x0A,0x23,0x23,0x23,0x20,0x54,0x68,0x65,0x73,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69, +0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x66,0x6F,0x72,0x6D,0x61,0x74, +0x20,0x69,0x73,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x78,0x20,0x61,0x6E,0x64,0x20, +0x64,0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x64,0x65,0x73, +0x63,0x72,0x69,0x62,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x6F,0x6D,0x6C,0x20, +0x67,0x72,0x61,0x6D,0x6D,0x61,0x72,0x2C,0x0A,0x23,0x23,0x23,0x20,0x73,0x6F,0x2C, +0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x61,0x20,0x69,0x6E,0x64,0x65,0x70,0x65, +0x6E,0x64,0x65,0x6E,0x74,0x20,0x73,0x65,0x63,0x6F,0x6E,0x64,0x61,0x72,0x79,0x20, +0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x66,0x69,0x6C,0x65,0x20,0x74,0x6F,0x20,0x64, +0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6F,0x6E,0x20,0x73,0x70,0x65,0x63,0x69, +0x66,0x69,0x63,0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2E, +0x0A,0x0A,0x5B,0x53,0x45,0x43,0x4F,0x4E,0x44,0x41,0x52,0x59,0x5F,0x43,0x4F,0x4E, +0x46,0x49,0x47,0x5F,0x4C,0x49,0x4E,0x4B,0x5D,0x09,0x20,0x0A,0x09,0x63,0x66,0x67, +0x5F,0x66,0x69,0x6C,0x65,0x5F,0x73,0x61,0x70,0x70,0x5F,0x6C,0x6F,0x67,0x3D,0x22, +0x65,0x74,0x63,0x2F,0x73,0x61,0x70,0x70,0x5F,0x6C,0x6F,0x67,0x2E,0x63,0x6F,0x6E, +0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x70,0x6C,0x75, +0x67,0x5F,0x6C,0x69,0x73,0x74,0x3D,0x22,0x70,0x6C,0x75,0x67,0x2F,0x63,0x6F,0x6E, +0x66,0x6C,0x69,0x73,0x74,0x2E,0x69,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F, +0x66,0x69,0x6C,0x65,0x5F,0x70,0x72,0x6F,0x6A,0x65,0x63,0x74,0x5F,0x6C,0x69,0x73, +0x74,0x3D,0x22,0x65,0x74,0x63,0x2F,0x70,0x72,0x6F,0x6A,0x65,0x63,0x74,0x5F,0x6C, +0x69,0x73,0x74,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66, +0x69,0x6C,0x65,0x5F,0x65,0x6E,0x74,0x72,0x79,0x6C,0x69,0x73,0x74,0x3D,0x22,0x65, +0x74,0x63,0x2F,0x65,0x6E,0x74,0x72,0x79,0x6C,0x69,0x73,0x74,0x2E,0x63,0x6F,0x6E, +0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x73,0x65,0x6E, +0x64,0x5F,0x72,0x61,0x77,0x5F,0x70,0x6B,0x74,0x3D,0x22,0x65,0x74,0x63,0x2F,0x73, +0x65,0x6E,0x64,0x5F,0x72,0x61,0x77,0x5F,0x70,0x6B,0x74,0x2E,0x63,0x6F,0x6E,0x66, +0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x76,0x78,0x6C,0x61, +0x6E,0x5F,0x73,0x70,0x6F,0x72,0x74,0x5F,0x6D,0x61,0x70,0x3D,0x22,0x65,0x74,0x63, +0x2F,0x76,0x78,0x6C,0x61,0x6E,0x5F,0x73,0x70,0x6F,0x72,0x74,0x5F,0x73,0x65,0x72, +0x76,0x69,0x63,0x65,0x5F,0x6D,0x61,0x70,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09, +0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F, +0x64,0x65,0x76,0x69,0x63,0x65,0x3D,0x22,0x65,0x74,0x63,0x2F,0x67,0x64,0x65,0x76, +0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65, +0x5F,0x6E,0x65,0x63,0x65,0x73,0x73,0x61,0x72,0x79,0x5F,0x70,0x6C,0x75,0x67,0x5F, +0x6C,0x69,0x73,0x74,0x3D,0x22,0x65,0x74,0x63,0x2F,0x6E,0x65,0x63,0x65,0x73,0x73, +0x61,0x72,0x79,0x5F,0x70,0x6C,0x75,0x67,0x5F,0x6C,0x69,0x73,0x74,0x2E,0x63,0x6F, +0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x73,0x74, +0x72,0x65,0x61,0x6D,0x5F,0x63,0x6F,0x6D,0x70,0x61,0x72,0x65,0x5F,0x6C,0x61,0x79, +0x65,0x72,0x3D,0x22,0x65,0x74,0x63,0x2F,0x73,0x74,0x72,0x65,0x61,0x6D,0x5F,0x63, +0x6F,0x6D,0x70,0x61,0x72,0x65,0x5F,0x6C,0x61,0x79,0x65,0x72,0x2E,0x63,0x6F,0x6E, +0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x76,0x6C,0x61, +0x6E,0x5F,0x66,0x6C,0x69,0x70,0x70,0x69,0x6E,0x67,0x3D,0x22,0x65,0x74,0x63,0x2F, +0x76,0x6C,0x61,0x6E,0x5F,0x66,0x6C,0x69,0x70,0x70,0x69,0x6E,0x67,0x5F,0x6D,0x61, +0x70,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x09,0x63,0x66,0x67,0x5F,0x66,0x69,0x6C, +0x65,0x5F,0x61,0x73,0x79,0x6D,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x61,0x64,0x64, +0x72,0x5F,0x6C,0x61,0x79,0x65,0x72,0x3D,0x22,0x65,0x74,0x63,0x2F,0x61,0x73,0x79, +0x6D,0x6D,0x65,0x74,0x72,0x69,0x63,0x5F,0x61,0x64,0x64,0x72,0x5F,0x6C,0x61,0x79, +0x65,0x72,0x2E,0x63,0x6F,0x6E,0x66,0x22,0x0A,0x0A,0x5B,0x53,0x45,0x43,0x4F,0x4E, +0x44,0x41,0x52,0x59,0x5F,0x44,0x41,0x54,0x41,0x5F,0x4C,0x49,0x4E,0x4B,0x5D,0x09, +0x20,0x0A,0x20,0x20,0x20,0x20,0x64,0x61,0x74,0x61,0x5F,0x66,0x69,0x6C,0x65,0x5F, +0x73,0x79,0x73,0x69,0x6E,0x66,0x6F,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x73,0x79,0x73, +0x69,0x6E,0x66,0x6F,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x20,0x20,0x20,0x20,0x64,0x61, +0x74,0x61,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x66,0x69,0x65,0x6C,0x64,0x5F,0x73,0x74, +0x61,0x74,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x66,0x73,0x32,0x5F,0x73,0x79,0x73,0x69, +0x6E,0x66,0x6F,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x20,0x20,0x20,0x20,0x64,0x61,0x74, +0x61,0x5F,0x66,0x69,0x6C,0x65,0x5F,0x69,0x6E,0x6C,0x69,0x6E,0x65,0x5F,0x6B,0x65, +0x65,0x70,0x61,0x6C,0x69,0x76,0x65,0x5F,0x6C,0x6F,0x67,0x3D,0x22,0x67,0x64,0x65, +0x76,0x5F,0x6B,0x65,0x65,0x70,0x6C,0x69,0x76,0x65,0x5F,0x73,0x74,0x61,0x74,0x75, +0x73,0x2E,0x6C,0x6F,0x67,0x22,0x0A,0x0A }; + + static void special_usage(void) { printf("\033[1;31;40m[Error]open %s error!\033[0m\n", ABBR_CFG_FILE_MAIN_ENTRY); @@ -870,7 +1019,7 @@ void sapp_cla_override_cfg_file(void) return; } -void sapp_generate_example_config(const char *cfg_file_name) +void sapp_generate_example_config(const char *cfg_file_name, const char *sapp_version) { FILE *fp; struct stat file_stat; @@ -888,6 +1037,7 @@ void sapp_generate_example_config(const char *cfg_file_name) return; } + fprintf(fp, "# This sample configure file is generate by sapp.%s\n", sapp_version); fwrite(sample_sapp_toml, sizeof(sample_sapp_toml), 1, fp); fclose(fp); @@ -1618,12 +1768,16 @@ static int config_sanity_check(void) if(strncasecmp(tmp_str, "transparent", strlen("transparent")) == 0){ if((pconfig->packet_io.internal.interface.name[0] == '\0') - ||(pconfig->packet_io.internal.interface.type_str[0] == '\0')){ + || (strlen(pconfig->packet_io.internal.interface.name) <= 0) + ||(pconfig->packet_io.internal.interface.type_str[0] == '\0') + || (strlen(pconfig->packet_io.internal.interface.type_str) <= 0)){ sapp_log(30, ~0, ~0, "depolyment_mode is transparent, must set internal interface parameters!"); return -1; } if((pconfig->packet_io.external.interface.name[0] == '\0') - ||(pconfig->packet_io.external.interface.type_str[0] == '\0')){ + || (strlen(pconfig->packet_io.external.interface.name) <= 0) + ||(pconfig->packet_io.external.interface.type_str[0] == '\0') + || (strlen(pconfig->packet_io.external.interface.type_str) <= 0)){ sapp_log(30, ~0, ~0, "depolyment_mode is transparent, must set external interface parameters!"); return -1; } @@ -1894,8 +2048,8 @@ int sapp_parse_config(void) tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.depolyment", (char *)"mode", pconfig->packet_io.depolyment_mode_str, NAME_MAX, "mirror"); tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.internal.interface", (char *)"type", pconfig->packet_io.internal.interface.type_str, NAME_MAX, "pcap"); tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.internal.interface", (char *)"name", pconfig->packet_io.internal.interface.name, NAME_MAX, "lo"); - tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.external.interface", (char *)"type", pconfig->packet_io.external.interface.type_str, NAME_MAX, "pcap"); - tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.external.interface", (char *)"name", pconfig->packet_io.external.interface.name, NAME_MAX, "lo"); + tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.external.interface", (char *)"type", pconfig->packet_io.external.interface.type_str, NAME_MAX, ""); + tomlc99_wrap_load_string_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.external.interface", (char *)"name", pconfig->packet_io.external.interface.name, NAME_MAX, ""); tomlc99_wrap_load_int_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.polling", (char *)"enabled", &pconfig->packet_io.polling_enabled, 1); tomlc99_wrap_load_int_def(ABBR_CFG_FILE_MAIN_ENTRY, (char *)"packet_io.polling", (char *)"polling_priority", &pconfig->packet_io.polling_priority, 100); @@ -2046,8 +2200,9 @@ int sapp_parse_config(void) } /* - 1: ʶ�洢�����ļ��е�key-value; 0: ����ʶ�����ļ��е�key-value; + 1: ʶ�洢�����ļ��е�key-value; + 2: ����ijЩ�Ѿ��������IJ���. */ static int sapp_config_check_update_option(sapp_config_check_t *local_cfg_check_attr, const char *section, const char *key, const char *value) { @@ -2063,12 +2218,17 @@ static int sapp_config_check_update_option(sapp_config_check_t *local_cfg_check_ key_max_len = SAPP_MAX(strlen(local_cfg_check_attr[i].cfg_key), strlen(key)); if((strncmp(section, local_cfg_check_attr[i].section, section_max_len) == 0) && (strncmp(key, local_cfg_check_attr[i].cfg_key, key_max_len) == 0)){ - if(NULL == value){ - local_cfg_check_attr[i].cfg_value = sapp_strdup(""); /* û�����������ֵ, ����key�Ǵ��ڵ�, Ҳ�������ҵ��� */ + if(SAPP_CFG_OBSOLETE_FLAG == local_cfg_check_attr[i].global_id){ + sapp_printf_colorful(RLOG_LV_INFO, "config: [%s] -> %s is obsolete!\n", section, key); + return 2; }else{ - local_cfg_check_attr[i].cfg_value = sapp_strdup(value); + if(NULL == value){ + local_cfg_check_attr[i].cfg_value = sapp_strdup(""); /* û�����������ֵ, ����bpf��������Ϊ��, ����key�Ǵ��ڵ�, Ҳ�������ҵ��� */ + }else{ + local_cfg_check_attr[i].cfg_value = sapp_strdup(value); + } + found_cfg = 1; } - found_cfg = 1; break; } } @@ -2080,6 +2240,33 @@ extern void del_last_rn(char *data, int max_len); extern int sapp_del_last_char(char *data, int max_len, char del_char); extern char *sapp_memmove_for_blank_table(char *data, int max_len); + +/* + �Ƿ���Ҫ��鵱ǰ���õĺϷ���. +*/ +static int cfg_value_need_be_check(const sapp_config_check_t *local_cfg_check_array, const sapp_config_check_t *this_cfg_check_attr) +{ + int depend_cfg_index; + + if(1 == this_cfg_check_attr->depend_id){ + return 1; + } + if(0 == this_cfg_check_attr->depend_id){ /* ��ѡ������Ҳ��� */ + return 1; + } + + if(this_cfg_check_attr->depend_id >= 1000){
+ depend_cfg_index = cfg_get_index_by_depend_id(this_cfg_check_attr->depend_id); + + if((local_cfg_check_array[depend_cfg_index].cfg_value != NULL) + && (strncasecmp(local_cfg_check_array[depend_cfg_index].cfg_value, this_cfg_check_attr->depend_cfg_value, strlen(this_cfg_check_attr->depend_cfg_value)) == 0)){ + return 1; + } + } + + return 0; +} + /* ��ȫ����һ�鵱ǰ��sapp.toml, ����Ƿ��в���ʶ������, �����˵��: 1)sapp��sapp.toml�İ汾��; @@ -2102,8 +2289,8 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr fp = fopen(ABBR_CFG_FILE_MAIN_ENTRY, "r"); if(NULL == fp){ - printf("can't open file:%s\n", ABBR_CFG_FILE_MAIN_ENTRY); - return -1; + sapp_printf_colorful(RLOG_LV_FATAL, "can't open file:%s\n", ABBR_CFG_FILE_MAIN_ENTRY); + return RLOG_LV_FATAL; } while(fgets(raw_config_line, sizeof(raw_config_line), fp) != NULL){ @@ -2118,7 +2305,7 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr } memcpy(config_line, raw_config_line, sizeof(raw_config_line)); - if('[' == raw_config_line[0]){ + if('[' == raw_config_line[0]){ /* ��[��ͷ��ʾ��section���俪ʼ */ char *pure_sesion_str = strtok_r(config_line, section_delim, §ion_save_ptr); strcpy(section_string, pure_sesion_str); while(strtok_r(NULL, section_delim, §ion_save_ptr)); @@ -2127,7 +2314,7 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr cfg_key = strtok_r(config_line, key_delim, &key_save_ptr); if(NULL == cfg_key){ - printf("invalid config line:%s\n", config_line); + sapp_printf_colorful(RLOG_LV_FATAL, "invalid config line:%s\n", config_line); continue; } sapp_del_last_char(cfg_key, strlen(cfg_key), ' '); @@ -2135,7 +2322,7 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr cfg_value = strtok_r(NULL, key_delim, &key_save_ptr); if(NULL == cfg_value){ - printf("invalid config line:%s\n", config_line); + sapp_printf_colorful(RLOG_LV_FATAL, "invalid config line:%s\n", config_line); continue; } @@ -2146,8 +2333,10 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr char *pure_cfg_value = strtok_r(cfg_value, key_value_delim, &pure_cfg_value_save_ptr); ret = sapp_config_check_update_option(local_cfg_check_attr, section_string, cfg_key, pure_cfg_value); if(ret <= 0){ - printf("\033[1;31;40mnot support config: [%s] -> %s\033[0m\n", section_string, raw_config_line); - fun_ret = -1; + sapp_printf_colorful(RLOG_LV_FATAL, "unsupport config: [%s] -> %s\n", section_string, raw_config_line); + fun_ret = SAPP_MAX(fun_ret, RLOG_LV_FATAL); + }else if(2 == ret){ + fun_ret = SAPP_MAX(fun_ret, RLOG_LV_INFO); } while(strtok_r(NULL, key_delim, &key_save_ptr)); @@ -2162,23 +2351,42 @@ static int sapp_config_check_unsupport(sapp_config_check_t *local_cfg_check_attr */ static int sapp_config_check_missing(sapp_config_check_t *local_cfg_check_attr) { - int ret, i; + int ret1, ret2, ret3, i; char cfg_value[1024]; int array_num, cfg_array[1024]; int fun_ret = 0; for(i = 0; local_cfg_check_attr[i].global_id != -1; i++){ - if(NULL == local_cfg_check_attr[i].cfg_key){ /* [PACKET_IO], []DUPLICATE_PKT] ������ֻ�и�section, ����û��key */ + if(NULL == local_cfg_check_attr[i].cfg_key){ /* [PACKET_IO], []DUPLICATE_PKT] ������ֻ�и�section, ����Ϊ�����ʶ, ����û��key */ continue; } - ret = MESA_load_profile_string_nodef(ABBR_CFG_FILE_MAIN_ENTRY, g_sapp_cfg_check_attr[i].section, g_sapp_cfg_check_attr[i].cfg_key, cfg_value, sizeof(cfg_value)); - if(ret < 0){ + if(SAPP_CFG_OBSOLETE_FLAG == local_cfg_check_attr[i].global_id){ /* �Ѿ�����������, �����ڼ��missing */ + continue; + } + if(cfg_value_need_be_check(local_cfg_check_attr, &local_cfg_check_attr[i]) == 0){ + continue; + } + ret1 = MESA_load_profile_string_nodef(ABBR_CFG_FILE_MAIN_ENTRY, local_cfg_check_attr[i].section, local_cfg_check_attr[i].cfg_key, cfg_value, sizeof(cfg_value)); + if(ret1 < 0){ /* ��profile�ӿڶ�ȡ�����п�����toml��ʽ������, ����toml���鳢�Խ���һ�� */ array_num = 1024; - ret = tomlc99_wrap_load_int_array(ABBR_CFG_FILE_MAIN_ENTRY, g_sapp_cfg_check_attr[i].section, (char *)g_sapp_cfg_check_attr[i].cfg_key, cfg_array, &array_num); - if(ret < 0){ - printf("\033[1;31;40mmissing sapp.toml config: [%s] -> %s\033[0m\n", g_sapp_cfg_check_attr[i].section, g_sapp_cfg_check_attr[i].cfg_key); - fun_ret = -1; + ret2 = tomlc99_wrap_load_int_array(ABBR_CFG_FILE_MAIN_ENTRY, local_cfg_check_attr[i].section, (char *)local_cfg_check_attr[i].cfg_key, cfg_array, &array_num); + if(ret2 < 0){ + /* ʹ��toml����Ҳû�ж�ȡ������, ����Ƿ��������������� */ + if((local_cfg_check_attr[i].depend_id != 0) && (local_cfg_check_attr[i].cfg_value_check_fun != NULL)){ + ret3 = local_cfg_check_attr[i].cfg_value_check_fun(local_cfg_check_attr, local_cfg_check_attr[i].global_id, local_cfg_check_attr[i].depend_id, + local_cfg_check_attr[i].cfg_value, local_cfg_check_attr[i].expect_range_array, local_cfg_check_attr[i].expect_array_num); + if(ret3 != 0){ + fun_ret = SAPP_MAX(local_cfg_check_attr[i].err_log_level, fun_ret); + sapp_printf_colorful(fun_ret, "missing sapp.toml config: [%s] -> %s\n", local_cfg_check_attr[i].section, local_cfg_check_attr[i].cfg_key); + /* ע��: �˴���Ҫbreak, ������е������ļ����� */ + } + }else{ + fun_ret = SAPP_MAX(local_cfg_check_attr[i].err_log_level, fun_ret); + sapp_printf_colorful(fun_ret, "missing sapp.toml config: [%s] -> %s\n", local_cfg_check_attr[i].section, local_cfg_check_attr[i].cfg_key); + + /* ע��: �˴���Ҫbreak, ������е������ļ����� */ + } } } } @@ -2191,19 +2399,20 @@ static int sapp_config_check_missing_and_unsupport(sapp_config_check_t *local_cf { int ret; + /* ע��: check_unsupport����ǰ��, ��Ϊ���и���������, ���ǰ��������õ�ֵ��ȡ��ȫ�ֱ���: g_sapp_cfg_check_attr ��*/ ret = sapp_config_check_unsupport(local_cfg_check_attr); - if(ret < 0){ - printf("\033[1;31;40mmaybe a typo, maybe some config is obsolete, or sapp is older than sapp.toml version!\033[0m\n"); - return -1; + if(ret != 0){ + sapp_printf_colorful(ret, "maybe a typo, maybe some config is obsolete, or sapp is older than sapp.toml version!\n"); + return ret; } ret = sapp_config_check_missing(local_cfg_check_attr); - if(ret < 0){ - printf("\033[1;31;40mmaybe a typo, or sapp is newer than sapp.toml version!\033[0m\n"); - return -1; + if(ret != 0){ + sapp_printf_colorful(ret, "maybe a typo, or sapp is newer than sapp.toml version!\n"); + return ret; } - return 0; + return ret; } /* @@ -2211,22 +2420,27 @@ static int sapp_config_check_missing_and_unsupport(sapp_config_check_t *local_cf */ static int sapp_config_check_single_validity(sapp_config_check_t *local_cfg_check_attr) { - int i, ret; + int i, ret, fun_ret = 0; for(i = 0; local_cfg_check_attr[i].global_id != -1; i++){ + if(cfg_value_need_be_check(local_cfg_check_attr, &local_cfg_check_attr[i]) == 0){ + continue; + } + if(local_cfg_check_attr[i].cfg_value_check_fun != NULL){ ret = local_cfg_check_attr[i].cfg_value_check_fun(local_cfg_check_attr, local_cfg_check_attr[i].global_id, local_cfg_check_attr[i].depend_id, local_cfg_check_attr[i].cfg_value, local_cfg_check_attr[i].expect_range_array, local_cfg_check_attr[i].expect_array_num); - if(ret < 0){ - printf("\033[1;31;40mcheck config: [%s]->%s error, invalid value:'%s'\033[0m\n", + if(ret != 0){ + fun_ret = SAPP_MAX(fun_ret, local_cfg_check_attr[i].err_log_level); + sapp_printf_colorful(fun_ret, "check config: [%s]->%s error, invalid value:'%s'\n", local_cfg_check_attr[i].section, local_cfg_check_attr[i].cfg_key, local_cfg_check_attr[i].cfg_value); - return -1; + return fun_ret; } } } - return 0; + return fun_ret; } /* @@ -2250,10 +2464,11 @@ static int sapp_config_check_sanity(sapp_config_check_t *local_cfg_check_attr) t2: ���ÿ��������ֵ�Ƿ�Ϸ�, ����packet_io.mode ����mirror, inline, tansparent��; t3: ������鵥������, �����ܵļ�����в������������������, ����transparentģʽû������external����; */ -int sapp_config_check(int check_level) +int sapp_config_check(void) { - int i, ret = -1; + int i, ret1, ret2, ret3, final_ret = 0; + /* ȫ�ֱ������й̶����������, Ҳ�ж�̬�������ļ���ȡ������, ���Դ˴�copyһ����ʱ���� */ sapp_config_check_t *local_cfg_check_attr = (sapp_config_check_t *)malloc(sizeof(g_sapp_cfg_check_attr)); memcpy(local_cfg_check_attr, g_sapp_cfg_check_attr, sizeof(g_sapp_cfg_check_attr)); @@ -2261,37 +2476,32 @@ int sapp_config_check(int check_level) g_interger_range_array[i] = i; } - if(1 == check_level){ - ret = sapp_config_check_missing_and_unsupport(local_cfg_check_attr); - }else if(2 == check_level){ - ret = sapp_config_check_missing_and_unsupport(local_cfg_check_attr); - if(ret < 0){ - goto done; - } - ret = sapp_config_check_single_validity(local_cfg_check_attr); - }else if(3 == check_level){ - ret = sapp_config_check_missing_and_unsupport(local_cfg_check_attr); - if(ret < 0){ - goto done; - } - ret = sapp_config_check_single_validity(local_cfg_check_attr); - if(ret < 0){ - goto done; - } - ret = sapp_config_check_sanity(local_cfg_check_attr); + ret1 = sapp_config_check_missing_and_unsupport(local_cfg_check_attr); + if(ret1 != 0){ + final_ret = SAPP_MAX(ret1, final_ret); + goto done; } + ret2 = sapp_config_check_single_validity(local_cfg_check_attr); + if(ret2 != 0){ + final_ret = SAPP_MAX(ret2, final_ret); + goto done; + } + + ret3 = sapp_config_check_sanity(local_cfg_check_attr); + final_ret = SAPP_MAX(ret2, final_ret); done: - if(ret < 0){ - printf("\033[1;31;40msapp config check fail!\033[0m\n"); + if(final_ret != 0){ + //printf("\033[1;31;40msapp config check fail!\033[0m\n"); + sapp_printf_colorful(final_ret, "You should use './sapp -e filename' to generate the latest sample configuration file.\n"); }else{ printf("\033[32msapp config check success!\033[0m\n"); } free(local_cfg_check_attr); - return ret; + return final_ret; } /* init breakpad_mini */ diff --git a/src/dealpkt/deal_udp.c b/src/dealpkt/deal_udp.c index fd024a9..2b45215 100644 --- a/src/dealpkt/deal_udp.c +++ b/src/dealpkt/deal_udp.c @@ -557,16 +557,16 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_ if(0 == is_overlay_udp_layer){ /* ��overlay����ۼ���ز���� */ local_sys_stat->count[SAPP_STAT_RCV_UDP]++; - local_sys_stat->length[SAPP_STAT_RCV_UDP]+=ulen; + local_sys_stat->length[SAPP_STAT_RCV_UDP]+=datalen; if (routedir == sapp_global_val->config.packet_io.inbound_route_dir) { local_sys_stat->count[SAPP_STAT_UDP_INBOUND]++; - local_sys_stat->length[SAPP_STAT_UDP_INBOUND] += ulen; + local_sys_stat->length[SAPP_STAT_UDP_INBOUND] += datalen; } else { local_sys_stat->count[SAPP_STAT_UDP_OUTBOUND]++; - local_sys_stat->length[SAPP_STAT_UDP_OUTBOUND] += ulen; + local_sys_stat->length[SAPP_STAT_UDP_OUTBOUND] += datalen; } } diff --git a/src/inner_plug/l2tp_protocol_plug.c b/src/inner_plug/l2tp_protocol_plug.c index f6d8a38..0fa3124 100644 --- a/src/inner_plug/l2tp_protocol_plug.c +++ b/src/inner_plug/l2tp_protocol_plug.c @@ -242,7 +242,6 @@ char l2tp_protocol_entry(const struct streaminfo *a_udp, void **pme, int thread int pro_plug_ret = APP_STATE_GIVEME;
const struct mesa_udp_hdr *udph;
const struct mesa_ip4_hdr *ip4hdr = (const struct mesa_ip4_hdr *)ip_hdr;
- udph = (const struct mesa_udp_hdr *)((char *)ip_hdr + ip4hdr->ip_hl * 4);
switch(a_udp->opstate){
case OP_STATE_PENDING:
@@ -256,6 +255,7 @@ char l2tp_protocol_entry(const struct streaminfo *a_udp, void **pme, int thread l2tp_pri = (struct l2tp_info_pri *)dictator_malloc(thread_seq, sizeof(struct l2tp_info_pri));
l2tp_context_init(l2tp_pri, thread_seq, a_udp);
*pme = l2tp_pri;
+ udph = (const struct mesa_udp_hdr *)((char *)ip_hdr + ip4hdr->ip_hl * 4);
pro_plug_ret = l2tp_process(a_udp, l2tp_pri, ip_hdr, udph);
}
break;
@@ -263,6 +263,7 @@ char l2tp_protocol_entry(const struct streaminfo *a_udp, void **pme, int thread case OP_STATE_DATA:
l2tp_pri = (struct l2tp_info_pri *)(*pme);
l2tp_pri->ssinfo.session_state = SESSION_STATE_DATA;
+ udph = (const struct mesa_udp_hdr *)((char *)ip_hdr + ip4hdr->ip_hl * 4);
pro_plug_ret = l2tp_process(a_udp, l2tp_pri, ip_hdr, udph);
break;
|
